Rename struct slab_alloc to struct slab_allocator.
[barrelfish] / include / barrelfish / slab.h
1 /**
2  * \file
3  * \brief Simple slab allocator
4  */
5
6 /*
7  * Copyright (c) 2008, ETH Zurich.
8  * All rights reserved.
9  *
10  * This file is distributed under the terms in the attached LICENSE file.
11  * If you do not find this file, copies can be found by writing to:
12  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
13  */
14
15 #ifndef LIBBARRELFISH_SLAB_H
16 #define LIBBARRELFISH_SLAB_H
17
18 #include <sys/cdefs.h>
19
20 __BEGIN_DECLS
21
22 // forward declarations
23 struct slab_allocator;
24 struct block_head;
25
26 typedef errval_t (*slab_refill_func_t)(struct slab_allocator *slabs);
27
28 struct slab_head {
29     struct slab_head *next; ///< Next slab in the allocator
30     uint32_t total, free;   ///< Count of total and free blocks in this slab
31     struct block_head *blocks; ///< Pointer to free block list
32 };
33
34 struct slot_allocator;
35
36 struct slab_allocator {
37     struct slab_head *slabs;    ///< Pointer to list of slabs
38     size_t blocksize;           ///< Size of blocks managed by this allocator
39     slab_refill_func_t refill_func;  ///< Refill function
40 };
41
42 void slab_init(struct slab_allocator *slabs, size_t blocksize,
43                slab_refill_func_t refill_func);
44 void slab_grow(struct slab_allocator *slabs, void *buf, size_t buflen);
45 void *slab_alloc(struct slab_allocator *slabs);
46 void slab_free(struct slab_allocator *slabs, void *block);
47 size_t slab_freecount(struct slab_allocator *slabs);
48 errval_t slab_default_refill(struct slab_allocator *slabs);
49
50 // size of block header
51 #define SLAB_BLOCK_HDRSIZE (sizeof(void *))
52 // should be able to fit the header into the block
53 #define SLAB_REAL_BLOCKSIZE(blocksize) \
54     (((blocksize) > SLAB_BLOCK_HDRSIZE) ? (blocksize) : SLAB_BLOCK_HDRSIZE)
55
56 /// Macro to compute the static buffer size required for a given allocation
57 #define SLAB_STATIC_SIZE(nblocks, blocksize) \
58         ((nblocks) * SLAB_REAL_BLOCKSIZE(blocksize) + sizeof(struct slab_head))
59
60 __END_DECLS
61
62 #endif // LIBBARRELFISH_SLAB_H