#include <stdbool.h>
#include <string.h>
-#define ALIGN(value, align) (((value) + (align) - 1) & ~((align) - 1))
-
#define SLAB_MAGIC_ALLOCATED 0xcafe4321
#define SLAB_MAGIC_FREE 0x7ee01234
-#ifdef DEBUG
+#ifndef NDEBUG
#define SET_MAGIC(element, value) (element)->magic = (value)
#define CHECK_MAGIC(element, value) assert((element)->magic == (value))
#else
*/
intptr_t owner;
-#ifdef DEBUG
+#ifndef NDEBUG
intptr_t magic;
#endif
};
unsigned num_items)
{
mtx_init(&parent->mutex, mtx_plain);
- parent->element_size = ALIGN(sizeof(struct slab_element_header) + item_size,
- sizeof(intptr_t));
+ parent->element_size = ALIGN_POT(sizeof(struct slab_element_header) + item_size,
+ sizeof(intptr_t));
parent->num_elements = num_items;
}
*/
void slab_destroy_child(struct slab_child_pool *pool)
{
+ if (!pool->parent)
+ return; /* the slab probably wasn't even created */
+
mtx_lock(&pool->parent->mutex);
while (pool->pages) {
* Allocate an object from the slab. Single-threaded (no mutex).
*/
void *
-slab_alloc_st(struct slab_mempool *pool)
+slab_alloc_st(struct slab_mempool *mempool)
{
- return slab_alloc(&pool->child);
+ return slab_alloc(&mempool->child);
}
/**
* Free an object allocated from the slab. Single-threaded (no mutex).
*/
void
-slab_free_st(struct slab_mempool *pool, void *ptr)
+slab_free_st(struct slab_mempool *mempool, void *ptr)
{
- slab_free(&pool->child, ptr);
+ slab_free(&mempool->child, ptr);
}
void
-slab_destroy(struct slab_mempool *pool)
+slab_destroy(struct slab_mempool *mempool)
{
- slab_destroy_child(&pool->child);
- slab_destroy_parent(&pool->parent);
+ slab_destroy_child(&mempool->child);
+ slab_destroy_parent(&mempool->parent);
}
/**
* \param num_items Number of objects to allocate at once.
*/
void
-slab_create(struct slab_mempool *pool,
+slab_create(struct slab_mempool *mempool,
unsigned item_size,
unsigned num_items)
{
- slab_create_parent(&pool->parent, item_size, num_items);
- slab_create_child(&pool->child, &pool->parent);
+ slab_create_parent(&mempool->parent, item_size, num_items);
+ slab_create_child(&mempool->child, &mempool->parent);
}