|
|
@ -161,9 +161,7 @@ RMEMAPI intptr_t BiStackMargins(BiStack destack); |
|
|
|
|
|
|
|
#if defined(RMEM_IMPLEMENTATION) |
|
|
|
|
|
|
|
#include <stdio.h> // Required for: |
|
|
|
#include <stdlib.h> // Required for: |
|
|
|
#include <string.h> // Required for: |
|
|
|
#include <stdio.h> // Required for: malloc(), calloc(), free() |
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
// Defines and Macros |
|
|
@ -205,7 +203,7 @@ MemPool CreateMemPool(const size_t size) |
|
|
|
mempool.stack.size = size; |
|
|
|
mempool.stack.mem = malloc(mempool.stack.size*sizeof *mempool.stack.mem); |
|
|
|
|
|
|
|
if (mempool.stack.mem==NULL) |
|
|
|
if (mempool.stack.mem == NULL) |
|
|
|
{ |
|
|
|
mempool.stack.size = 0UL; |
|
|
|
return mempool; |
|
|
@ -252,7 +250,9 @@ void *MemPoolAlloc(MemPool *const mempool, const size_t size) |
|
|
|
const size_t BUCKET_INDEX = (ALLOC_SIZE >> MEMPOOL_BUCKET_BITS) - 1; |
|
|
|
|
|
|
|
// If the size is small enough, let's check if our buckets has a fitting memory block. |
|
|
|
if (BUCKET_INDEX < MEMPOOL_BUCKET_SIZE && mempool->buckets[BUCKET_INDEX] != NULL && mempool->buckets[BUCKET_INDEX]->size >= ALLOC_SIZE) |
|
|
|
if ((BUCKET_INDEX < MEMPOOL_BUCKET_SIZE) && |
|
|
|
(mempool->buckets[BUCKET_INDEX] != NULL) && |
|
|
|
(mempool->buckets[BUCKET_INDEX]->size >= ALLOC_SIZE)) |
|
|
|
{ |
|
|
|
new_mem = mempool->buckets[BUCKET_INDEX]; |
|
|
|
mempool->buckets[BUCKET_INDEX] = mempool->buckets[BUCKET_INDEX]->next; |
|
|
@ -424,9 +424,9 @@ size_t GetMemPoolFreeMemory(const MemPool mempool) |
|
|
|
{ |
|
|
|
size_t total_remaining = (uintptr_t)mempool.stack.base - (uintptr_t)mempool.stack.mem; |
|
|
|
|
|
|
|
for (MemNode *n=mempool.freeList.head; n != NULL; n = n->next) total_remaining += n->size; |
|
|
|
for (MemNode *n = mempool.freeList.head; n != NULL; n = n->next) total_remaining += n->size; |
|
|
|
|
|
|
|
for (n">size_t i=0; i<MEMPOOL_BUCKET_SIZE; i++) for (MemNode *n = mempool.buckets[i]; n != NULL; n = n->next) total_remaining += n->size; |
|
|
|
for (kt">int i = 0; i < MEMPOOL_BUCKET_SIZE; i++) for (MemNode *n = mempool.buckets[i]; n != NULL; n = n->next) total_remaining += n->size; |
|
|
|
|
|
|
|
return total_remaining; |
|
|
|
} |
|
|
@ -436,7 +436,7 @@ void MemPoolReset(MemPool *const mempool) |
|
|
|
if (mempool == NULL) return; |
|
|
|
mempool->freeList.head = mempool->freeList.tail = NULL; |
|
|
|
mempool->freeList.len = 0; |
|
|
|
for (n">size_t i = 0; i < MEMPOOL_BUCKET_SIZE; i++) mempool->buckets[i] = NULL; |
|
|
|
for (kt">int i = 0; i < MEMPOOL_BUCKET_SIZE; i++) mempool->buckets[i] = NULL; |
|
|
|
mempool->stack.base = mempool->stack.mem + mempool->stack.size; |
|
|
|
} |
|
|
|
|
|
|
@ -453,7 +453,7 @@ bool MemPoolDefrag(MemPool *const mempool) |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
for (n">size_t i=0; i<MEMPOOL_BUCKET_SIZE; i++) |
|
|
|
for (kt">int i = 0; i < MEMPOOL_BUCKET_SIZE; i++) |
|
|
|
{ |
|
|
|
while (mempool->buckets[i] != NULL) |
|
|
|
{ |
|
|
@ -593,7 +593,7 @@ ObjPool CreateObjPool(const size_t objsize, const size_t len) |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
for (n">size_t i=0; i<objpool.freeBlocks; i++) |
|
|
|
for (kt">int i = 0; i < objpool.freeBlocks; i++) |
|
|
|
{ |
|
|
|
union ObjInfo block = { .byte = &objpool.stack.mem[i*objpool.objSize] }; |
|
|
|
*block.index = i + 1; |
|
|
@ -617,7 +617,7 @@ ObjPool CreateObjPoolFromBuffer(void *const buf, const size_t objsize, const siz |
|
|
|
objpool.stack.size = objpool.freeBlocks = len; |
|
|
|
objpool.stack.mem = buf; |
|
|
|
|
|
|
|
for (n">size_t i=0; i<objpool.freeBlocks; i++) |
|
|
|
for (kt">int i = 0; i < objpool.freeBlocks; i++) |
|
|
|
{ |
|
|
|
union ObjInfo block = { .byte = &objpool.stack.mem[i*objpool.objSize] }; |
|
|
|
*block.index = i + 1; |
|
|
@ -655,6 +655,7 @@ void *ObjPoolAlloc(ObjPool *const objpool) |
|
|
|
// Head = &pool[*Head * pool.objsize]; |
|
|
|
objpool->stack.base = (objpool->freeBlocks != 0UL)? objpool->stack.mem + (*ret.index*objpool->objSize) : NULL; |
|
|
|
memset(ret.byte, 0, objpool->objSize); |
|
|
|
|
|
|
|
return ret.byte; |
|
|
|
} |
|
|
|
else return NULL; |
|
|
|