2 * UCW Library -- Fast Allocator for Fixed-Size Elements
4 * (c) 2007 Martin Mares <mj@ucw.cz>
6 * This software may be freely distributed and used according to the terms
7 * of the GNU Lesser General Public License.
10 #ifndef _UCW_ELTPOOL_H
11 #define _UCW_ELTPOOL_H
13 #ifdef CONFIG_UCW_CLEAN_ABI
14 #define ep_alloc_slow ucw_ep_alloc_slow
15 #define ep_delete ucw_ep_delete
16 #define ep_new ucw_ep_new
17 #define ep_total_size ucw_ep_total_size
27 * Memory pool of fixed-sized elements.
28 * You should use this one as an opaque handle only, the insides are internal.
31 struct eltpool_chunk *first_chunk;
32 struct eltpool_free *first_free;
36 uint num_allocated; // Just for debugging
40 struct eltpool_chunk {
41 struct eltpool_chunk *next;
42 /* Chunk data continue here */
46 struct eltpool_free *next;
56 * Create a new memory pool for elements of @elt_size bytes.
57 * The pool will allocate chunks of at least @elts_per_chunk elements.
58 * Higher numbers lead to better allocation times but also to bigger
59 * unused memory blocks. Call @ep_delete() to free all pool's resources.
61 * Element pools can be treated as <<trans:respools,resources>>, see <<trans:res_eltpool()>>.
63 struct eltpool *ep_new(uint elt_size, uint elts_per_chunk);
66 * Release a memory pool created by @ep_new() including all
67 * elements allocated from that pool.
69 void ep_delete(struct eltpool *pool);
72 * Return the total number of bytes allocated by a given
73 * memory pool including all internals.
75 u64 ep_total_size(struct eltpool *pool);
83 void *ep_alloc_slow(struct eltpool *pool); /* Internal. Do not call directly. */
85 * Allocate a new element on a given memory pool.
86 * The results is always aligned to a multiple of the element's size.
88 static inline void *ep_alloc(struct eltpool *pool)
90 pool->num_allocated++;
91 #ifdef CONFIG_UCW_FAKE_ELTPOOL
92 return xmalloc(pool->elt_size);
94 struct eltpool_free *elt;
95 if (elt = pool->first_free)
96 pool->first_free = elt->next;
98 elt = ep_alloc_slow(pool);
104 * Release an element previously allocated by @ep_alloc().
105 * Note thet the memory is not really freed (until @mp_delete()),
106 * but it can be reused by future @ep_alloc()'s.
108 static inline void ep_free(struct eltpool *pool, void *p)
110 pool->num_allocated--;
111 #ifdef CONFIG_UCW_FAKE_ELTPOOL
115 struct eltpool_free *elt = p;
116 elt->next = pool->first_free;
117 pool->first_free = elt;