| #ifndef IOU_ALLOC_CACHE_H | |
| #define IOU_ALLOC_CACHE_H | |
| /* | |
| * Don't allow the cache to grow beyond this size. | |
| */ | |
| #define IO_ALLOC_CACHE_MAX 512 | |
| struct io_cache_entry { | |
| struct hlist_node node; | |
| }; | |
| static inline bool io_alloc_cache_put(struct io_alloc_cache *cache, | |
| struct io_cache_entry *entry) | |
| { | |
| if (cache->nr_cached < IO_ALLOC_CACHE_MAX) { | |
| cache->nr_cached++; | |
| hlist_add_head(&entry->node, &cache->list); | |
| return true; | |
| } | |
| return false; | |
| } | |
| static inline struct io_cache_entry *io_alloc_cache_get(struct io_alloc_cache *cache) | |
| { | |
| if (!hlist_empty(&cache->list)) { | |
| struct hlist_node *node = cache->list.first; | |
| hlist_del(node); | |
| cache->nr_cached--; | |
| return container_of(node, struct io_cache_entry, node); | |
| } | |
| return NULL; | |
| } | |
| static inline void io_alloc_cache_init(struct io_alloc_cache *cache) | |
| { | |
| INIT_HLIST_HEAD(&cache->list); | |
| cache->nr_cached = 0; | |
| } | |
| static inline void io_alloc_cache_free(struct io_alloc_cache *cache, | |
| void (*free)(struct io_cache_entry *)) | |
| { | |
| while (!hlist_empty(&cache->list)) { | |
| struct hlist_node *node = cache->list.first; | |
| hlist_del(node); | |
| free(container_of(node, struct io_cache_entry, node)); | |
| } | |
| cache->nr_cached = 0; | |
| } | |
| #endif |