more
This commit is contained in:
parent
c0e308f275
commit
4503901f3e
|
@ -23,23 +23,23 @@ extern "C" {
|
||||||
// Single linked list
|
// Single linked list
|
||||||
#define TD_SLIST_NODE(TYPE) \
|
#define TD_SLIST_NODE(TYPE) \
|
||||||
struct { \
|
struct { \
|
||||||
struct type *sl_next_; \
|
struct TYPE *sl_next_; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define TD_SLIST(TYPE) \
|
#define TD_SLIST(TYPE) \
|
||||||
struct { \
|
struct { \
|
||||||
struct TYPE *sl_dl_head_; \
|
struct TYPE *sl_head_; \
|
||||||
int sl_dl_neles_; \
|
int sl_neles_; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define TD_SLIST_HEAD(sl) ((sl)->sl_dl_head_)
|
#define TD_SLIST_HEAD(sl) ((sl)->sl_head_)
|
||||||
#define TD_SLIST_NELES(sl) ((sl)->sl_dl_neles_)
|
#define TD_SLIST_NELES(sl) ((sl)->sl_neles_)
|
||||||
#define TD_SLIST_NODE_NEXT(sln) ((sln)->sl_next_)
|
#define TD_SLIST_NODE_NEXT(sln) ((sln)->sl_next_)
|
||||||
|
|
||||||
#define tSListInit(sl) \
|
#define tSListInit(sl) \
|
||||||
do { \
|
do { \
|
||||||
(sl)->sl_dl_head_ = NULL; \
|
(sl)->sl_head_ = NULL; \
|
||||||
(sl)->sl_dl_neles_ = 0; \
|
(sl)->sl_neles_ = 0; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define tSListPush(sl, sln) \
|
#define tSListPush(sl, sln) \
|
||||||
|
|
|
@ -26,7 +26,7 @@ typedef struct SVArenaNode SVArenaNode;
|
||||||
typedef struct SVMemAllocator SVMemAllocator;
|
typedef struct SVMemAllocator SVMemAllocator;
|
||||||
|
|
||||||
struct SVArenaNode {
|
struct SVArenaNode {
|
||||||
TD_DLIST_NODE(SVArenaNode);
|
TD_SLIST_NODE(SVArenaNode);
|
||||||
uint64_t size; // current node size
|
uint64_t size; // current node size
|
||||||
void * ptr;
|
void * ptr;
|
||||||
char data[];
|
char data[];
|
||||||
|
@ -34,10 +34,11 @@ struct SVArenaNode {
|
||||||
|
|
||||||
struct SVMemAllocator {
|
struct SVMemAllocator {
|
||||||
TD_DLIST_NODE(SVMemAllocator);
|
TD_DLIST_NODE(SVMemAllocator);
|
||||||
uint64_t capacity;
|
uint64_t capacity;
|
||||||
uint64_t ssize;
|
uint64_t ssize;
|
||||||
uint64_t lsize;
|
uint64_t lsize;
|
||||||
TD_DLIST(SVArenaNode) nlist;
|
SVArenaNode *pNode;
|
||||||
|
TD_SLIST(SVArenaNode) nlist;
|
||||||
};
|
};
|
||||||
|
|
||||||
SVMemAllocator *vmaCreate(uint64_t capacity, uint64_t ssize, uint64_t lsize);
|
SVMemAllocator *vmaCreate(uint64_t capacity, uint64_t ssize, uint64_t lsize);
|
||||||
|
|
|
@ -27,30 +27,25 @@ SVMemAllocator *vmaCreate(uint64_t capacity, uint64_t ssize, uint64_t lsize) {
|
||||||
pVMA->capacity = capacity;
|
pVMA->capacity = capacity;
|
||||||
pVMA->ssize = ssize;
|
pVMA->ssize = ssize;
|
||||||
pVMA->lsize = lsize;
|
pVMA->lsize = lsize;
|
||||||
tDListInit(&(pVMA->nlist));
|
tSListInit(&(pVMA->nlist));
|
||||||
|
|
||||||
SVArenaNode *pNode = vArenaNodeNew(capacity);
|
pVMA->pNode = vArenaNodeNew(capacity);
|
||||||
if (pNode == NULL) {
|
if (pVMA->pNode == NULL) {
|
||||||
free(pVMA);
|
free(pVMA);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
tDListAppend(&(pVMA->nlist), pNode);
|
tSListPush(&(pVMA->nlist), pVMA->pNode);
|
||||||
|
|
||||||
return pVMA;
|
return pVMA;
|
||||||
}
|
}
|
||||||
|
|
||||||
void vmaDestroy(SVMemAllocator *pVMA) {
|
void vmaDestroy(SVMemAllocator *pVMA) {
|
||||||
if (pVMA) {
|
if (pVMA) {
|
||||||
while (true) {
|
while (TD_SLIST_NELES(&(pVMA->nlist)) > 1) {
|
||||||
SVArenaNode *pNode = TD_DLIST_TAIL(&(pVMA->nlist));
|
SVArenaNode *pNode = TD_SLIST_HEAD(&(pVMA->nlist));
|
||||||
|
tSListPop(&(pVMA->nlist));
|
||||||
if (pNode) {
|
vArenaNodeFree(pNode);
|
||||||
tDListPop(&(pVMA->nlist), pNode);
|
|
||||||
vArenaNodeFree(pNode);
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free(pVMA);
|
free(pVMA);
|
||||||
|
@ -58,18 +53,18 @@ void vmaDestroy(SVMemAllocator *pVMA) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void vmaReset(SVMemAllocator *pVMA) {
|
void vmaReset(SVMemAllocator *pVMA) {
|
||||||
while (TD_DLIST_NELES(&(pVMA->nlist)) > 1) {
|
while (TD_SLIST_NELES(&(pVMA->nlist)) > 1) {
|
||||||
SVArenaNode *pNode = TD_DLIST_TAIL(&(pVMA->nlist));
|
SVArenaNode *pNode = TD_SLIST_HEAD(&(pVMA->nlist));
|
||||||
tDListPop(&(pVMA->nlist), pNode);
|
tSListPop(&(pVMA->nlist));
|
||||||
vArenaNodeFree(pNode);
|
vArenaNodeFree(pNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
SVArenaNode *pNode = TD_DLIST_HEAD(&(pVMA->nlist));
|
SVArenaNode *pNode = TD_SLIST_HEAD(&(pVMA->nlist));
|
||||||
pNode->ptr = pNode->data;
|
pNode->ptr = pNode->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *vmaMalloc(SVMemAllocator *pVMA, uint64_t size) {
|
void *vmaMalloc(SVMemAllocator *pVMA, uint64_t size) {
|
||||||
SVArenaNode *pNode = TD_DLIST_TAIL(&(pVMA->nlist));
|
SVArenaNode *pNode = TD_SLIST_HEAD(&(pVMA->nlist));
|
||||||
void * ptr;
|
void * ptr;
|
||||||
|
|
||||||
if (pNode->size < POINTER_DISTANCE(pNode->ptr, pNode->data) + size) {
|
if (pNode->size < POINTER_DISTANCE(pNode->ptr, pNode->data) + size) {
|
||||||
|
@ -80,7 +75,7 @@ void *vmaMalloc(SVMemAllocator *pVMA, uint64_t size) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
tDListAppend(&(pVMA->nlist), pNode);
|
tSListPush(&(pVMA->nlist), pNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = pNode->ptr;
|
ptr = pNode->ptr;
|
||||||
|
@ -94,9 +89,9 @@ void vmaFree(SVMemAllocator *pVMA, void *ptr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool vmaIsFull(SVMemAllocator *pVMA) {
|
bool vmaIsFull(SVMemAllocator *pVMA) {
|
||||||
SVArenaNode *pNode = TD_DLIST_TAIL(&(pVMA->nlist));
|
SVArenaNode *pNode = TD_SLIST_HEAD(&(pVMA->nlist));
|
||||||
|
|
||||||
return (TD_DLIST_NELES(&(pVMA->nlist)) > 1) ||
|
return (TD_SLIST_NELES(&(pVMA->nlist)) > 1) ||
|
||||||
(pNode->size < POINTER_DISTANCE(pNode->ptr, pNode->data) + pVMA->lsize);
|
(pNode->size < POINTER_DISTANCE(pNode->ptr, pNode->data) + pVMA->lsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue