more
This commit is contained in:
parent
f748f0710a
commit
8b6eba666f
|
@ -90,8 +90,6 @@ extern "C" {
|
||||||
|
|
||||||
#define tlistPopTail(l) tlistPop(l, (l)->tail_)
|
#define tlistPopTail(l) tlistPop(l, (l)->tail_)
|
||||||
|
|
||||||
#define tlistIterInit(it, l, dir)
|
|
||||||
|
|
||||||
// List iterator
|
// List iterator
|
||||||
#define TD_LIST_FITER 0
|
#define TD_LIST_FITER 0
|
||||||
#define TD_LIST_BITER 1
|
#define TD_LIST_BITER 1
|
||||||
|
|
|
@ -27,7 +27,7 @@ typedef struct SVMemAllocator SVMemAllocator;
|
||||||
|
|
||||||
struct SVArenaNode {
|
struct SVArenaNode {
|
||||||
TD_LIST_NODE(SVArenaNode);
|
TD_LIST_NODE(SVArenaNode);
|
||||||
uint64_t nsize; // current node size
|
uint64_t size; // current node size
|
||||||
void * ptr;
|
void * ptr;
|
||||||
char data[];
|
char data[];
|
||||||
};
|
};
|
||||||
|
@ -45,6 +45,7 @@ void vmaDestroy(SVMemAllocator *pVMA);
|
||||||
void vmaReset(SVMemAllocator *pVMA);
|
void vmaReset(SVMemAllocator *pVMA);
|
||||||
void * vmaMalloc(SVMemAllocator *pVMA, uint64_t size);
|
void * vmaMalloc(SVMemAllocator *pVMA, uint64_t size);
|
||||||
void vmaFree(SVMemAllocator *pVMA, void *ptr);
|
void vmaFree(SVMemAllocator *pVMA, void *ptr);
|
||||||
|
bool vmaIsFull(SVMemAllocator *pVMA);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,6 @@ static void vArenaNodeFree(SVArenaNode *pNode);
|
||||||
SVMemAllocator *vmaCreate(uint64_t capacity, uint64_t ssize, uint64_t lsize) {
|
SVMemAllocator *vmaCreate(uint64_t capacity, uint64_t ssize, uint64_t lsize) {
|
||||||
SVMemAllocator *pVMA = (SVMemAllocator *)malloc(sizeof(*pVMA));
|
SVMemAllocator *pVMA = (SVMemAllocator *)malloc(sizeof(*pVMA));
|
||||||
if (pVMA == NULL) {
|
if (pVMA == NULL) {
|
||||||
// TODO: handle error
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +31,7 @@ SVMemAllocator *vmaCreate(uint64_t capacity, uint64_t ssize, uint64_t lsize) {
|
||||||
|
|
||||||
SVArenaNode *pNode = vArenaNodeNew(capacity);
|
SVArenaNode *pNode = vArenaNodeNew(capacity);
|
||||||
if (pNode == NULL) {
|
if (pNode == NULL) {
|
||||||
// TODO
|
free(pVMA);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,29 +41,79 @@ SVMemAllocator *vmaCreate(uint64_t capacity, uint64_t ssize, uint64_t lsize) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void vmaDestroy(SVMemAllocator *pVMA) {
|
void vmaDestroy(SVMemAllocator *pVMA) {
|
||||||
// TODO
|
if (pVMA) {
|
||||||
|
while (true) {
|
||||||
|
SVArenaNode *pNode = tlistPopTail(&(pVMA->nlist));
|
||||||
|
|
||||||
|
if (pNode) {
|
||||||
|
vArenaNodeFree(pNode);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(pVMA);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void vmaReset(SVMemAllocator *pVMA) {
|
void vmaReset(SVMemAllocator *pVMA) {
|
||||||
// TODO
|
while (tlistNEles(&(pVMA->nlist)) > 1) {
|
||||||
|
SVArenaNode *pNode = tlistPopTail(&(pVMA->nlist));
|
||||||
|
vArenaNodeFree(pNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
SVArenaNode *pNode = tlistHead(&(pVMA->nlist));
|
||||||
|
pNode->ptr = pNode->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *vmaMalloc(SVMemAllocator *pVMA, uint64_t size) {
|
void *vmaMalloc(SVMemAllocator *pVMA, uint64_t size) {
|
||||||
// TODO
|
SVArenaNode *pNode = tlistTail(&(pVMA->nlist));
|
||||||
return NULL;
|
void * ptr;
|
||||||
|
|
||||||
|
if (pNode->size < POINTER_DISTANCE(pNode->ptr, pNode->data) + size) {
|
||||||
|
uint64_t capacity = MAX(pVMA->ssize, size);
|
||||||
|
pNode = vArenaNodeNew(capacity);
|
||||||
|
if (pNode == NULL) {
|
||||||
|
// TODO: handle error
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
tlistAppend(&(pVMA->nlist), pNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = pNode->ptr;
|
||||||
|
pNode->ptr = POINTER_SHIFT(ptr, size);
|
||||||
|
|
||||||
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void vmaFree(SVMemAllocator *pVMA, void *ptr) {
|
void vmaFree(SVMemAllocator *pVMA, void *ptr) {
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool vmaIsFull(SVMemAllocator *pVMA) {
|
||||||
|
SVArenaNode *pNode = tlistTail(&(pVMA->nlist));
|
||||||
|
|
||||||
|
return (tlistNEles(&(pVMA->nlist)) > 1) || (pNode->size < POINTER_DISTANCE(pNode->ptr, pNode->data) + pVMA->lsize);
|
||||||
|
}
|
||||||
|
|
||||||
/* ------------------------ STATIC METHODS ------------------------ */
|
/* ------------------------ STATIC METHODS ------------------------ */
|
||||||
static SVArenaNode *vArenaNodeNew(uint64_t capacity) {
|
static SVArenaNode *vArenaNodeNew(uint64_t capacity) {
|
||||||
SVArenaNode *pNode = NULL;
|
SVArenaNode *pNode = NULL;
|
||||||
// TODO
|
|
||||||
|
pNode = (SVArenaNode *)malloc(sizeof(*pNode) + capacity);
|
||||||
|
if (pNode == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pNode->size = capacity;
|
||||||
|
pNode->ptr = pNode->data;
|
||||||
|
|
||||||
return pNode;
|
return pNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vArenaNodeFree(SVArenaNode *pNode) {
|
static void vArenaNodeFree(SVArenaNode *pNode) {
|
||||||
// TODO
|
if (pNode) {
|
||||||
|
free(pNode);
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue