提交 4503901f 编写于 作者: H Hongze Cheng

more

上级 c0e308f2
...@@ -23,23 +23,23 @@ extern "C" { ...@@ -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; ...@@ -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 { ...@@ -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) { ...@@ -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) { ...@@ -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) { ...@@ -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) { ...@@ -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);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册