Commit | Line | Data |
---|---|---|
9b797a37 JA |
1 | #ifndef IOU_ALLOC_CACHE_H |
2 | #define IOU_ALLOC_CACHE_H | |
3 | ||
9731bc98 JA |
4 | /* |
5 | * Don't allow the cache to grow beyond this size. | |
6 | */ | |
7 | #define IO_ALLOC_CACHE_MAX 512 | |
8 | ||
9b797a37 JA |
9 | struct io_cache_entry { |
10 | struct hlist_node node; | |
11 | }; | |
12 | ||
9731bc98 | 13 | static inline bool io_alloc_cache_put(struct io_alloc_cache *cache, |
9b797a37 JA |
14 | struct io_cache_entry *entry) |
15 | { | |
9731bc98 JA |
16 | if (cache->nr_cached < IO_ALLOC_CACHE_MAX) { |
17 | cache->nr_cached++; | |
18 | hlist_add_head(&entry->node, &cache->list); | |
19 | return true; | |
20 | } | |
21 | return false; | |
9b797a37 JA |
22 | } |
23 | ||
24 | static inline struct io_cache_entry *io_alloc_cache_get(struct io_alloc_cache *cache) | |
25 | { | |
26 | if (!hlist_empty(&cache->list)) { | |
27 | struct hlist_node *node = cache->list.first; | |
28 | ||
29 | hlist_del(node); | |
30 | return container_of(node, struct io_cache_entry, node); | |
31 | } | |
32 | ||
33 | return NULL; | |
34 | } | |
35 | ||
36 | static inline void io_alloc_cache_init(struct io_alloc_cache *cache) | |
37 | { | |
38 | INIT_HLIST_HEAD(&cache->list); | |
9731bc98 | 39 | cache->nr_cached = 0; |
9b797a37 JA |
40 | } |
41 | ||
42 | static inline void io_alloc_cache_free(struct io_alloc_cache *cache, | |
43 | void (*free)(struct io_cache_entry *)) | |
44 | { | |
45 | while (!hlist_empty(&cache->list)) { | |
46 | struct hlist_node *node = cache->list.first; | |
47 | ||
48 | hlist_del(node); | |
49 | free(container_of(node, struct io_cache_entry, node)); | |
50 | } | |
9731bc98 | 51 | cache->nr_cached = 0; |
9b797a37 JA |
52 | } |
53 | #endif |