66 lines
1.6 KiB
C
66 lines
1.6 KiB
C
#include "mempool.h"
|
|
#include "nmx_palloc.h"
|
|
|
|
typedef struct mem_block {
|
|
size_t size;
|
|
struct mem_block *next;
|
|
} mem_block_t;
|
|
|
|
struct mem_pool_s{
|
|
mem_block_t *free_list;
|
|
nmx_pool_t *pool;
|
|
size_t pool_size;
|
|
} ;
|
|
|
|
mem_pool_t *create_mem_pool(size_t pool_size) {
|
|
mem_pool_t *mem_pool = (mem_pool_t *)malloc(sizeof(mem_pool_t));
|
|
mem_pool->pool = nmx_create_pool(pool_size);
|
|
mem_pool->free_list = NULL;
|
|
mem_pool->pool_size = pool_size;
|
|
return mem_pool;
|
|
}
|
|
|
|
void *mem_alloc(mem_pool_t *mem_pool, size_t size) {
|
|
mem_block_t *prev = NULL;
|
|
mem_block_t *current = mem_pool->free_list;
|
|
|
|
// find free block
|
|
while (current != NULL) {
|
|
if (current->size >= size) {
|
|
if (prev != NULL) {
|
|
prev->next = current->next;
|
|
} else {
|
|
mem_pool->free_list = current->next;
|
|
}
|
|
return (void *)(current + 1);
|
|
}
|
|
prev = current;
|
|
current = current->next;
|
|
}
|
|
|
|
// no suitable free block, allocate new block
|
|
mem_block_t *new_block = (mem_block_t *)nmx_palloc(mem_pool->pool, sizeof(mem_block_t) + size);
|
|
if (new_block == NULL) {
|
|
return NULL;
|
|
}
|
|
new_block->size = size;
|
|
return (void *)(new_block + 1);
|
|
}
|
|
|
|
void mem_free(mem_pool_t *mem_pool, void *ptr) {
|
|
if (ptr == NULL) {
|
|
return;
|
|
}
|
|
//try free lagre block
|
|
if(nmx_pfree(mem_pool->pool, ptr)) {
|
|
return;
|
|
}
|
|
mem_block_t *block = (mem_block_t *)ptr - 1;
|
|
block->next = mem_pool->free_list;
|
|
mem_pool->free_list = block;
|
|
}
|
|
|
|
void destroy_mem_pool(mem_pool_t *mem_pool) {
|
|
nmx_destroy_pool(mem_pool->pool);
|
|
free(mem_pool);
|
|
} |