Add flags member in blknode data structure
[eleutheria.git] / malloc / mpool.h
blob510d6cf63ad7fb8d40668040d4726cdb3833cbb4
1 #include <sys/queue.h>
3 #define MPOOL_DEBUG
4 #define MPOOL_STATS
6 #ifdef MPOOL_DEBUG
7 #define DPRINTF(a) printf a
8 #else
9 #define DPRINTF(a)
10 #endif
12 #define NODE_AVAIL (1 << 0) /* If not set, node is reserved, else available */
13 #define NODE_LR (1 << 1) /* If not set, node is left buddy, else right buddy */
15 typedef struct blknode {
16 unsigned char flags; /* availability and left-right buddiness */
17 size_t logsize; /* logarithm of size with base 2 */
18 void *ptr;
19 LIST_ENTRY(blknode) next_block;
20 } blknode_t;
22 typedef struct mpool {
23 void *mem;
24 size_t nblocks; /* nblocks = logsize + 1 */
25 size_t maxlogsize; /* logarithm of maximum size of chunk with base 2 */
26 size_t minlogsize; /* logarithm of minimum size of chunk with base 2 */
27 #ifdef MPOOL_STATS
28 size_t nsplits; /* number of splits made */
29 size_t nmerges; /* number of merges made */
30 #endif
31 LIST_HEAD(blkhead, blknode) *blktable;
32 } mpool_t;
34 typedef struct blkhead blkhead_t;
36 typedef enum {
37 MP_OK,
38 MP_EBADVAL,
39 MP_ENOMEM
40 } mpret_t;
42 /* Function prototypes */
43 mpret_t mpool_init(mpool_t **mpool, size_t maxlogsize, size_t minlogsize);
44 void *mpool_alloc(mpool_t *mpool, size_t size);
45 void mpool_free(mpool_t *mpool, void *ptr);
46 void mpool_destroy(mpool_t *mpool);
48 void mpool_printblks(const mpool_t *mpool);
49 void mpool_stat_get_nodes(const mpool_t *mpool, size_t *avail, size_t *used);
50 void mpool_stat_get_bytes(const mpool_t *mpool, size_t *avail, size_t *used);
51 #ifdef MPOOL_STATS
52 size_t mpool_stat_get_splits(const mpool_t *mpool);
53 size_t mpool_stat_get_merges(const mpool_t *mpool);
54 #endif