mirror of https://gitlab.com/rnger/amath
Take advantage of memory pools
This commit is contained in:
parent
d7add409cd
commit
d7fe11d56a
|
@ -35,13 +35,17 @@
|
|||
#include <exec/memory.h>
|
||||
#include <exec/semaphores.h>
|
||||
#include <clib/exec_protos.h>
|
||||
#define ALLOC_MEM(x) AllocVec(x, MEMF_ANY | MEMF_CLEAR)
|
||||
#define FREE_MEM(x) FreeVec(x)
|
||||
#define ALLOC_LIST(x) AllocVec(x, MEMF_ANY | MEMF_CLEAR)
|
||||
#define FREE_LIST(x) FreeVec(x)
|
||||
#define ALLOC_MEM(x, y) AllocPooled(x, y)
|
||||
#define FREE_MEM(x, y, z) FreePooled(x, y, z)
|
||||
#define Debug(x, y, z)
|
||||
#else
|
||||
#include <stdlib.h>
|
||||
#define ALLOC_MEM(x) calloc(1L,x)
|
||||
#define FREE_MEM(x) free(x)
|
||||
#define ALLOC_LIST(x) calloc(1L, x)
|
||||
#define FREE_LIST(x) free(x)
|
||||
#define ALLOC_MEM(x, y) calloc(1L, y)
|
||||
#define FREE_MEM(x, y, z) free(y)
|
||||
#define Debug(x, y, z)
|
||||
#endif
|
||||
|
||||
|
@ -67,6 +71,7 @@ struct MemoryBlock
|
|||
struct MemoryList
|
||||
{
|
||||
struct MemoryBlock *first;
|
||||
void *pool;
|
||||
size_t peak;
|
||||
size_t size;
|
||||
long count;
|
||||
|
@ -90,13 +95,16 @@ void* AllocMemSafe(size_t size)
|
|||
|
||||
if (list == nullptr)
|
||||
{
|
||||
list = (struct MemoryList*)ALLOC_MEM(sizeof(struct MemoryList));
|
||||
list = (struct MemoryList *)ALLOC_LIST(sizeof(struct MemoryList));
|
||||
if (!list)
|
||||
{
|
||||
alloc_error("list", sizeof(struct MemoryList));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(AMIGA)
|
||||
list->pool = CreatePool(MEMF_ANY, 4096, 512);
|
||||
#endif
|
||||
list->first = nullptr;
|
||||
list->peak = 0;
|
||||
list->size = 0;
|
||||
|
@ -111,17 +119,17 @@ void* AllocMemSafe(size_t size)
|
|||
allocsize = (size + 3) & ~0x03;
|
||||
#endif
|
||||
|
||||
newblock = (struct MemoryBlock*)ALLOC_MEM(sizeof(struct MemoryBlock));
|
||||
if (!newblock)
|
||||
newblock = (struct MemoryBlock *)ALLOC_MEM(list->pool, sizeof(struct MemoryBlock));
|
||||
if (newblock == NULL)
|
||||
{
|
||||
alloc_error("block", sizeof(struct MemoryBlock));
|
||||
return 0;
|
||||
}
|
||||
|
||||
newblock->address = (struct MemoryBlock*)ALLOC_MEM(allocsize);
|
||||
if (!newblock->address)
|
||||
newblock->address = (struct MemoryBlock *)ALLOC_MEM(list->pool, allocsize);
|
||||
if (newblock->address == NULL)
|
||||
{
|
||||
FREE_MEM(newblock);
|
||||
FREE_MEM(list->pool, newblock, sizeof(struct MemoryBlock));
|
||||
alloc_error("memory", allocsize);
|
||||
return 0;
|
||||
}
|
||||
|
@ -185,13 +193,13 @@ void RemoveMemSafe(void* block, bool deallocate)
|
|||
|
||||
if (deallocate)
|
||||
{
|
||||
FREE_MEM(current->address);
|
||||
FREE_MEM(list->pool, current->address, current->size);
|
||||
}
|
||||
|
||||
current->address = nullptr;
|
||||
current->next = nullptr;
|
||||
current->size = 0;
|
||||
FREE_MEM(current);
|
||||
FREE_MEM(list->pool, current, sizeof(struct MemoryBlock));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -227,12 +235,16 @@ void FreeAllSafe()
|
|||
while (current != nullptr)
|
||||
{
|
||||
next = current->next;
|
||||
FREE_MEM(current->address);
|
||||
FREE_MEM(current);
|
||||
FREE_MEM(list->pool, current->address, current->size);
|
||||
FREE_MEM(list->pool, current, sizeof(struct MemoryBlock));
|
||||
current = next;
|
||||
}
|
||||
|
||||
FREE_MEM(list);
|
||||
#if defined(AMIGA)
|
||||
DeletePool(list->pool);
|
||||
#endif
|
||||
|
||||
FREE_LIST(list);
|
||||
list = nullptr;
|
||||
}
|
||||
|
||||
|
@ -243,7 +255,8 @@ void MemUsage(long* blocks, long* size, long* peak)
|
|||
{
|
||||
*blocks = list->count;
|
||||
*size = (long)list->size;
|
||||
*peak = (long)list->peak;;
|
||||
*peak = (long)list->peak;
|
||||
;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue