more
This commit is contained in:
parent
aaf9ca18c5
commit
c0e308f275
|
@ -28,85 +28,106 @@ extern "C" {
|
||||||
|
|
||||||
#define TD_SLIST(TYPE) \
|
#define TD_SLIST(TYPE) \
|
||||||
struct { \
|
struct { \
|
||||||
struct TYPE *sl_head_; \
|
struct TYPE *sl_dl_head_; \
|
||||||
|
int sl_dl_neles_; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define TD_SLIST_HEAD(sl) ((sl)->sl_head_)
|
#define TD_SLIST_HEAD(sl) ((sl)->sl_dl_head_)
|
||||||
|
#define TD_SLIST_NELES(sl) ((sl)->sl_dl_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_head_ = NULL; \
|
(sl)->sl_dl_head_ = NULL; \
|
||||||
|
(sl)->sl_dl_neles_ = 0; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define tSListPrepend(sl, sln) \
|
#define tSListPush(sl, sln) \
|
||||||
do { \
|
do { \
|
||||||
TD_SLIST_NODE_NEXT(sln) = TD_SLIST_HEAD(sl); \
|
TD_SLIST_NODE_NEXT(sln) = TD_SLIST_HEAD(sl); \
|
||||||
TD_SLIST_HEAD(sl) = (sln); \
|
TD_SLIST_HEAD(sl) = (sln); \
|
||||||
} while (0);
|
TD_SLIST_NELES(sl) += 1; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define tSListPop(sl) \
|
||||||
|
do { \
|
||||||
|
TD_SLIST_HEAD(sl) = TD_SLIST_NODE_NEXT(TD_SLIST_HEAD(sl)); \
|
||||||
|
TD_SLIST_NELES(sl) -= 1; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
// Double linked list
|
// Double linked list
|
||||||
#define TD_DLIST_NODE(TYPE) \
|
#define TD_DLIST_NODE(TYPE) \
|
||||||
struct { \
|
struct { \
|
||||||
TYPE *prev_; \
|
TYPE *dl_prev_; \
|
||||||
TYPE *next_; \
|
TYPE *dl_next_; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define TD_DLIST(TYPE) \
|
#define TD_DLIST(TYPE) \
|
||||||
struct { \
|
struct { \
|
||||||
TYPE *head_; \
|
struct TYPE *dl_head_; \
|
||||||
TYPE *tail_; \
|
struct TYPE *dl_tail_; \
|
||||||
int neles_; \
|
int dl_neles_; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define tDListInit(l) \
|
#define TD_DLIST_NODE_PREV(dln) ((dln)->dl_prev_)
|
||||||
(l)->head_ = (l)->tail_ = NULL; \
|
#define TD_DLIST_NODE_NEXT(dln) ((dln)->dl_next_)
|
||||||
(l)->neles_ = 0;
|
#define TD_DLIST_HEAD(dl) ((dl)->dl_head_)
|
||||||
|
#define TD_DLIST_TAIL(dl) ((dl)->dl_tail_)
|
||||||
|
#define TD_DLIST_NELES(dl) ((dl)->dl_neles_)
|
||||||
|
|
||||||
#define tlistHead(l) (l)->head_
|
#define tDListInit(dl) \
|
||||||
#define tlistTail(l) (l)->tail_
|
do { \
|
||||||
#define tlistNEles(l) (l)->neles_
|
TD_DLIST_HEAD(dl) = TD_DLIST_TAIL(dl) = NULL; \
|
||||||
|
TD_DLIST_NELES(dl) = 0; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define tlistAppend(l, n) \
|
#define tDListAppend(dl, dln) \
|
||||||
if ((l)->head_ == NULL) { \
|
do { \
|
||||||
(n)->prev_ = (n)->next_ = NULL; \
|
if (TD_DLIST_HEAD(dl) == NULL) { \
|
||||||
(l)->head_ = (l)->tail_ = (n); \
|
TD_DLIST_NODE_PREV(dln) = TD_DLIST_NODE_NEXT(dln) = NULL; \
|
||||||
|
TD_DLIST_HEAD(dl) = TD_DLIST_TAIL(dl) = (dln); \
|
||||||
} else { \
|
} else { \
|
||||||
(n)->prev_ = (l)->tail_; \
|
TD_DLIST_NODE_PREV(dln) = TD_DLIST_TAIL(dl); \
|
||||||
(n)->next_ = NULL; \
|
TD_DLIST_NODE_NEXT(dln) = NULL; \
|
||||||
(l)->tail_->next_ = (n); \
|
TD_DLIST_NODE_NEXT(TD_DLIST_TAIL(dl)) = (dln); \
|
||||||
(l)->tail_ = (n); \
|
TD_DLIST_TAIL(dl) = (dln); \
|
||||||
} \
|
} \
|
||||||
(l)->neles_ += 1;
|
TD_DLIST_NELES(dl) += 1; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define tlistPrepend(l, n) \
|
#define tDListPrepend(dl, dln) \
|
||||||
if ((l)->head_ == NULL) { \
|
do { \
|
||||||
(n)->prev_ = (n)->next_ = NULL; \
|
if (TD_DLIST_HEAD(dl) == NULL) { \
|
||||||
(l)->head_ = (l)->tail_ = (n); \
|
TD_DLIST_NODE_PREV(dln) = TD_DLIST_NODE_NEXT(dln) = NULL; \
|
||||||
|
TD_DLIST_HEAD(dl) = TD_DLIST_TAIL(dl) = (dln); \
|
||||||
} else { \
|
} else { \
|
||||||
(n)->prev_ = NULL; \
|
TD_DLIST_NODE_PREV(dln) = NULL; \
|
||||||
(n)->next_ = (l)->head_; \
|
TD_DLIST_NODE_NEXT(dln) = TD_DLIST_HEAD(dl); \
|
||||||
(l)->head_->prev_ = (n); \
|
TD_DLIST_NODE_PREV(TD_DLIST_HEAD(dl)) = (dln); \
|
||||||
(l)->head_ = (n); \
|
TD_DLIST_HEAD(dl) = (dln); \
|
||||||
} \
|
} \
|
||||||
(l)->neles_ += 1;
|
TD_DLIST_NELES(dl) += 1; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define tlistPop(l, n) \
|
#define tDListPop(dl, dln) \
|
||||||
if ((l)->head_ == (n)) { \
|
do { \
|
||||||
(l)->head_ = (n)->next_; \
|
if (TD_DLIST_HEAD(dl) == (dln)) { \
|
||||||
|
TD_DLIST_HEAD(dl) = TD_DLIST_NODE_NEXT(dln); \
|
||||||
} \
|
} \
|
||||||
if ((l)->tail_ == (n)) { \
|
if (TD_DLIST_TAIL(dl) == (dln)) { \
|
||||||
(l)->tail_ = (n)->prev_; \
|
TD_DLIST_TAIL(dl) = TD_DLIST_NODE_PREV(dln); \
|
||||||
} \
|
} \
|
||||||
if ((n)->prev_ != NULL) { \
|
if (TD_DLIST_NODE_PREV(dln) != NULL) { \
|
||||||
(n)->prev_->next_ = (n)->next_; \
|
TD_DLIST_NODE_NEXT(TD_DLIST_NODE_PREV(dln)) = TD_DLIST_NODE_NEXT(dln); \
|
||||||
} \
|
} \
|
||||||
if ((n)->next_ != NULL) { \
|
if (TD_DLIST_NODE_NEXT(dln) != NULL) { \
|
||||||
(n)->next_->prev_ = (n)->prev_; \
|
TD_DLIST_NODE_PREV(TD_DLIST_NODE_NEXT(dln)) = TD_DLIST_NODE_PREV(dln); \
|
||||||
} \
|
} \
|
||||||
(l)->neles_ -= 1; \
|
TD_DLIST_NELES(dl) -= 1; \
|
||||||
(n)->prev_ = (n)->next_ = NULL;
|
TD_DLIST_NODE_PREV(dln) = TD_DLIST_NODE_NEXT(dln) = NULL; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#if 0
|
||||||
// List iterator
|
// List iterator
|
||||||
#define TD_LIST_FITER 0
|
#define TD_LIST_FITER 0
|
||||||
#define TD_LIST_BITER 1
|
#define TD_LIST_BITER 1
|
||||||
|
@ -122,9 +143,9 @@ extern "C" {
|
||||||
(it)->it_dir_ = (dir); \
|
(it)->it_dir_ = (dir); \
|
||||||
(it)->it_list_ = l; \
|
(it)->it_list_ = l; \
|
||||||
if ((dir) == TD_LIST_FITER) { \
|
if ((dir) == TD_LIST_FITER) { \
|
||||||
(it)->it_next_ = (l)->head_; \
|
(it)->it_next_ = (l)->dl_head_; \
|
||||||
} else { \
|
} else { \
|
||||||
(it)->it_next_ = (l)->tail_; \
|
(it)->it_next_ = (l)->dl_tail_; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define tlistIterNext(it) \
|
#define tlistIterNext(it) \
|
||||||
|
@ -139,6 +160,7 @@ extern "C" {
|
||||||
} \
|
} \
|
||||||
(it)->it_ptr_; \
|
(it)->it_ptr_; \
|
||||||
})
|
})
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ SVMemAllocator *vmaCreate(uint64_t capacity, uint64_t ssize, uint64_t lsize) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
tlistAppend(&(pVMA->nlist), pNode);
|
tDListAppend(&(pVMA->nlist), pNode);
|
||||||
|
|
||||||
return pVMA;
|
return pVMA;
|
||||||
}
|
}
|
||||||
|
@ -43,10 +43,10 @@ SVMemAllocator *vmaCreate(uint64_t capacity, uint64_t ssize, uint64_t lsize) {
|
||||||
void vmaDestroy(SVMemAllocator *pVMA) {
|
void vmaDestroy(SVMemAllocator *pVMA) {
|
||||||
if (pVMA) {
|
if (pVMA) {
|
||||||
while (true) {
|
while (true) {
|
||||||
SVArenaNode *pNode = tlistTail(&(pVMA->nlist));
|
SVArenaNode *pNode = TD_DLIST_TAIL(&(pVMA->nlist));
|
||||||
|
|
||||||
if (pNode) {
|
if (pNode) {
|
||||||
tlistPop(&(pVMA->nlist), pNode);
|
tDListPop(&(pVMA->nlist), pNode);
|
||||||
vArenaNodeFree(pNode);
|
vArenaNodeFree(pNode);
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
|
@ -58,18 +58,18 @@ void vmaDestroy(SVMemAllocator *pVMA) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void vmaReset(SVMemAllocator *pVMA) {
|
void vmaReset(SVMemAllocator *pVMA) {
|
||||||
while (tlistNEles(&(pVMA->nlist)) > 1) {
|
while (TD_DLIST_NELES(&(pVMA->nlist)) > 1) {
|
||||||
SVArenaNode *pNode = tlistTail(&(pVMA->nlist));
|
SVArenaNode *pNode = TD_DLIST_TAIL(&(pVMA->nlist));
|
||||||
tlistPop(&(pVMA->nlist), pNode);
|
tDListPop(&(pVMA->nlist), pNode);
|
||||||
vArenaNodeFree(pNode);
|
vArenaNodeFree(pNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
SVArenaNode *pNode = tlistHead(&(pVMA->nlist));
|
SVArenaNode *pNode = TD_DLIST_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 = tlistTail(&(pVMA->nlist));
|
SVArenaNode *pNode = TD_DLIST_TAIL(&(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 +80,7 @@ void *vmaMalloc(SVMemAllocator *pVMA, uint64_t size) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
tlistAppend(&(pVMA->nlist), pNode);
|
tDListAppend(&(pVMA->nlist), pNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = pNode->ptr;
|
ptr = pNode->ptr;
|
||||||
|
@ -94,9 +94,10 @@ void vmaFree(SVMemAllocator *pVMA, void *ptr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool vmaIsFull(SVMemAllocator *pVMA) {
|
bool vmaIsFull(SVMemAllocator *pVMA) {
|
||||||
SVArenaNode *pNode = tlistTail(&(pVMA->nlist));
|
SVArenaNode *pNode = TD_DLIST_TAIL(&(pVMA->nlist));
|
||||||
|
|
||||||
return (tlistNEles(&(pVMA->nlist)) > 1) || (pNode->size < POINTER_DISTANCE(pNode->ptr, pNode->data) + pVMA->lsize);
|
return (TD_DLIST_NELES(&(pVMA->nlist)) > 1) ||
|
||||||
|
(pNode->size < POINTER_DISTANCE(pNode->ptr, pNode->data) + pVMA->lsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------ STATIC METHODS ------------------------ */
|
/* ------------------------ STATIC METHODS ------------------------ */
|
||||||
|
|
|
@ -50,7 +50,7 @@ int vnodeOpenBufPool(SVnode *pVnode) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
tlistAppend(&(pVnode->pBufPool->free), pVMA);
|
tDListAppend(&(pVnode->pBufPool->free), pVMA);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -61,16 +61,16 @@ void vnodeCloseBufPool(SVnode *pVnode) {
|
||||||
vmaDestroy(pVnode->pBufPool->inuse);
|
vmaDestroy(pVnode->pBufPool->inuse);
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
SVMemAllocator *pVMA = tlistHead(&(pVnode->pBufPool->incycle));
|
SVMemAllocator *pVMA = TD_DLIST_HEAD(&(pVnode->pBufPool->incycle));
|
||||||
if (pVMA == NULL) break;
|
if (pVMA == NULL) break;
|
||||||
tlistPop(&(pVnode->pBufPool->incycle), pVMA);
|
tDListPop(&(pVnode->pBufPool->incycle), pVMA);
|
||||||
vmaDestroy(pVMA);
|
vmaDestroy(pVMA);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
SVMemAllocator *pVMA = tlistHead(&(pVnode->pBufPool->free));
|
SVMemAllocator *pVMA = TD_DLIST_HEAD(&(pVnode->pBufPool->free));
|
||||||
if (pVMA == NULL) break;
|
if (pVMA == NULL) break;
|
||||||
tlistPop(&(pVnode->pBufPool->free), pVMA);
|
tDListPop(&(pVnode->pBufPool->free), pVMA);
|
||||||
vmaDestroy(pVMA);
|
vmaDestroy(pVMA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,9 +85,9 @@ void *vnodeMalloc(SVnode *pVnode, uint64_t size) {
|
||||||
if (pBufPool->inuse == NULL) {
|
if (pBufPool->inuse == NULL) {
|
||||||
while (true) {
|
while (true) {
|
||||||
// TODO: add sem_wait and sem_post
|
// TODO: add sem_wait and sem_post
|
||||||
pBufPool->inuse = tlistHead(&(pBufPool->free));
|
pBufPool->inuse = TD_DLIST_HEAD(&(pBufPool->free));
|
||||||
if (pBufPool->inuse) {
|
if (pBufPool->inuse) {
|
||||||
tlistPop(&(pBufPool->free), pBufPool->inuse);
|
tDListPop(&(pBufPool->free), pBufPool->inuse);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue