From 8d1d7b7b4a48187f5849548bbc6bb543d6de33ba Mon Sep 17 00:00:00 2001 From: "bozo.kopic" Date: Mon, 27 Jun 2022 01:13:26 +0200 Subject: WIP native implementation --- src_c/pool.c | 88 ------------------------------------------------------------ 1 file changed, 88 deletions(-) delete mode 100644 src_c/pool.c (limited to 'src_c/pool.c') diff --git a/src_c/pool.c b/src_c/pool.c deleted file mode 100644 index 4bd8250..0000000 --- a/src_c/pool.c +++ /dev/null @@ -1,88 +0,0 @@ -#include -#include "pool.h" - - -#define PAGE_SIZE 4096 - - -typedef struct header_t { - struct header_t *next; -} header_t; - - -struct opcut_pool_t { - hat_allocator_t *a; - size_t item_size; - header_t *blocks; - header_t *items; -}; - - -static void allocate_block(opcut_pool_t *pool) { - size_t items_per_block = - (PAGE_SIZE - sizeof(header_t)) / (sizeof(header_t) + pool->item_size); - if (items_per_block < 1) - items_per_block = 1; - - header_t *block = hat_allocator_alloc( - pool->a, sizeof(header_t) + - items_per_block * (sizeof(header_t) + pool->item_size)); - if (!block) - return; - block->next = pool->blocks; - pool->blocks = block; - - for (size_t i = 0; i < items_per_block; ++i) { - header_t *header = (void *)block + sizeof(header_t) + - i * (sizeof(header_t) + pool->item_size); - header->next = pool->items; - pool->items = header; - } -} - - -opcut_pool_t *opcut_pool_create(hat_allocator_t *a, size_t item_size) { - opcut_pool_t *pool = hat_allocator_alloc(a, sizeof(opcut_pool_t)); - if (!pool) - return NULL; - - if (item_size % sizeof(void *) != 0) - item_size += sizeof(void *) - (item_size % sizeof(void *)); - - pool->a = a; - pool->item_size = item_size; - pool->blocks = NULL; - pool->items = NULL; - - return pool; -} - - -void opcut_pool_destroy(opcut_pool_t *pool) { - while (pool->blocks) { - header_t *block = pool->blocks; - pool->blocks = block->next; - hat_allocator_free(pool->a, block); - } - hat_allocator_free(pool->a, pool); -} - - -void *opcut_pool_alloc(opcut_pool_t *pool) { - if (!pool->items) - allocate_block(pool); - - if (!pool->items) - return NULL; - - header_t *header = pool->items; - pool->items = header->next; - return header + 1; -} - - -void opcut_pool_free(opcut_pool_t *pool, void *item) { - header_t *header = (header_t *)item - 1; - header->next = pool->items; - pool->items = header; -} -- cgit v1.2.3-70-g09d2