📄 rf_freelist.h
字号:
void *_p; \ int _i; \ RF_LOCK_MUTEX((_fl_)->lock); \ RF_ASSERT(sizeof(*(_obj_))==((_fl_)->obj_size)); \ if (_fl_->objlist) { \ _obj_ = _cast_((_fl_)->objlist); \ (_fl_)->objlist = (void *)((_obj_)->_nextp_); \ (_fl_)->free_cnt--; \ } \ else { \ /* \ * Allocate one at a time so we can free \ * one at a time without cleverness when arena \ * is full. \ */ \ RF_Calloc(_obj_,1,(_fl_)->obj_size,_cast_); \ if (_obj_) { \ if (_init_ (_obj_,_arg_)) { \ RF_Free(_obj_,(_fl_)->obj_size); \ _obj_ = NULL; \ } \ else { \ for(_i=1;_i<(_fl_)->obj_inc;_i++) { \ RF_Calloc(_p,1,(_fl_)->obj_size,(void *)); \ if (_p) { \ if (_init_ (_p,_arg_)) { \ RF_Free(_p,(_fl_)->obj_size); \ _p = NULL; \ break; \ } \ (_cast_(_p))->_nextp_ = (_fl_)->objlist; \ (_fl_)->objlist = _p; \ } \ else { \ break; \ } \ } \ } \ } \ RF_FREELIST_STAT_GROW(_fl_); \ } \ RF_FREELIST_STAT_ALLOC(_fl_); \ RF_UNLOCK_MUTEX((_fl_)->lock); \}/* * fl = freelist * obj = object to allocate * nextp = name of "next" pointer in obj * cast = cast of obj assignment * init = init obj func */#define RF_FREELIST_GET_INIT_NOUNLOCK(_fl_,_obj_,_nextp_,_cast_,_init_) { \ void *_p; \ int _i; \ RF_LOCK_MUTEX((_fl_)->lock); \ RF_ASSERT(sizeof(*(_obj_))==((_fl_)->obj_size)); \ if (_fl_->objlist) { \ _obj_ = _cast_((_fl_)->objlist); \ (_fl_)->objlist = (void *)((_obj_)->_nextp_); \ (_fl_)->free_cnt--; \ } \ else { \ /* \ * Allocate one at a time so we can free \ * one at a time without cleverness when arena \ * is full. \ */ \ RF_Calloc(_obj_,1,(_fl_)->obj_size,_cast_); \ if (_obj_) { \ if (_init_ (_obj_)) { \ RF_Free(_obj_,(_fl_)->obj_size); \ _obj_ = NULL; \ } \ else { \ for(_i=1;_i<(_fl_)->obj_inc;_i++) { \ RF_Calloc(_p,1,(_fl_)->obj_size,(void *)); \ if (_p) { \ if (_init_ (_p)) { \ RF_Free(_p,(_fl_)->obj_size); \ _p = NULL; \ break; \ } \ (_cast_(_p))->_nextp_ = (_fl_)->objlist; \ (_fl_)->objlist = _p; \ } \ else { \ break; \ } \ } \ } \ } \ RF_FREELIST_STAT_GROW(_fl_); \ } \ RF_FREELIST_STAT_ALLOC(_fl_); \}/* * fl = freelist * obj = object to allocate * nextp = name of "next" pointer in obj * cast = cast of obj assignment */#define RF_FREELIST_GET(_fl_,_obj_,_nextp_,_cast_) { \ void *_p; \ int _i; \ RF_LOCK_MUTEX((_fl_)->lock); \ RF_ASSERT(sizeof(*(_obj_))==((_fl_)->obj_size)); \ if (_fl_->objlist) { \ _obj_ = _cast_((_fl_)->objlist); \ (_fl_)->objlist = (void *)((_obj_)->_nextp_); \ (_fl_)->free_cnt--; \ } \ else { \ /* \ * Allocate one at a time so we can free \ * one at a time without cleverness when arena \ * is full. \ */ \ RF_Calloc(_obj_,1,(_fl_)->obj_size,_cast_); \ if (_obj_) { \ for(_i=1;_i<(_fl_)->obj_inc;_i++) { \ RF_Calloc(_p,1,(_fl_)->obj_size,(void *)); \ if (_p) { \ (_cast_(_p))->_nextp_ = (_fl_)->objlist; \ (_fl_)->objlist = _p; \ } \ else { \ break; \ } \ } \ } \ RF_FREELIST_STAT_GROW(_fl_); \ } \ RF_FREELIST_STAT_ALLOC(_fl_); \ RF_UNLOCK_MUTEX((_fl_)->lock); \}/* * fl = freelist * obj = object to allocate * nextp = name of "next" pointer in obj * cast = cast of obj assignment * num = num objs to return */#define RF_FREELIST_GET_N(_fl_,_obj_,_nextp_,_cast_,_num_) { \ void *_p, *_l, *_f; \ int _i, _n; \ _l = _f = NULL; \ _n = 0; \ RF_LOCK_MUTEX((_fl_)->lock); \ RF_ASSERT(sizeof(*(_obj_))==((_fl_)->obj_size)); \ for(_n=0;_n<_num_;_n++) { \ if (_fl_->objlist) { \ _obj_ = _cast_((_fl_)->objlist); \ (_fl_)->objlist = (void *)((_obj_)->_nextp_); \ (_fl_)->free_cnt--; \ } \ else { \ /* \ * Allocate one at a time so we can free \ * one at a time without cleverness when arena \ * is full. \ */ \ RF_Calloc(_obj_,1,(_fl_)->obj_size,_cast_); \ if (_obj_) { \ for(_i=1;_i<(_fl_)->obj_inc;_i++) { \ RF_Calloc(_p,1,(_fl_)->obj_size,(void *)); \ if (_p) { \ (_cast_(_p))->_nextp_ = (_fl_)->objlist; \ (_fl_)->objlist = _p; \ } \ else { \ break; \ } \ } \ } \ RF_FREELIST_STAT_GROW(_fl_); \ } \ if (_f == NULL) \ _f = _obj_; \ if (_obj_) { \ (_cast_(_obj_))->_nextp_ = _l; \ _l = _obj_; \ RF_FREELIST_STAT_ALLOC(_fl_); \ } \ else { \ (_cast_(_f))->_nextp_ = (_fl_)->objlist; \ (_fl_)->objlist = _l; \ _n = _num_; \ } \ } \ RF_UNLOCK_MUTEX((_fl_)->lock); \}/* * fl = freelist * obj = object to free * nextp = name of "next" pointer in obj */#define RF_FREELIST_FREE(_fl_,_obj_,_nextp_) { \ RF_LOCK_MUTEX((_fl_)->lock); \ if ((_fl_)->free_cnt == (_fl_)->max_free_cnt) { \ RF_Free(_obj_,(_fl_)->obj_size); \ } \ else { \ RF_ASSERT((_fl_)->free_cnt < (_fl_)->max_free_cnt); \ (_obj_)->_nextp_ = (_fl_)->objlist; \ (_fl_)->objlist = (void *)(_obj_); \ (_fl_)->free_cnt++; \ } \ RF_FREELIST_STAT_FREE(_fl_); \ RF_UNLOCK_MUTEX((_fl_)->lock); \}/* * fl = freelist * obj = object to free * nextp = name of "next" pointer in obj * num = num to free (debugging) */#define RF_FREELIST_FREE_N(_fl_,_obj_,_nextp_,_cast_,_num_) { \ void *_no; \ int _n; \ _n = 0; \ RF_LOCK_MUTEX((_fl_)->lock); \ while(_obj_) { \ _no = (_cast_(_obj_))->_nextp_; \ if ((_fl_)->free_cnt == (_fl_)->max_free_cnt) { \ RF_Free(_obj_,(_fl_)->obj_size); \ } \ else { \ RF_ASSERT((_fl_)->free_cnt < (_fl_)->max_free_cnt); \ (_obj_)->_nextp_ = (_fl_)->objlist; \ (_fl_)->objlist = (void *)(_obj_); \ (_fl_)->free_cnt++; \ } \ _n++; \ _obj_ = _no; \ RF_FREELIST_STAT_FREE(_fl_); \ } \ RF_ASSERT(_n==(_num_)); \ RF_UNLOCK_MUTEX((_fl_)->lock); \}/* * fl = freelist * obj = object to free * nextp = name of "next" pointer in obj * clean = undo for init */#define RF_FREELIST_FREE_CLEAN(_fl_,_obj_,_nextp_,_clean_) { \ RF_LOCK_MUTEX((_fl_)->lock); \ if ((_fl_)->free_cnt == (_fl_)->max_free_cnt) { \ _clean_ (_obj_); \ RF_Free(_obj_,(_fl_)->obj_size); \ } \ else { \ RF_ASSERT((_fl_)->free_cnt < (_fl_)->max_free_cnt); \ (_obj_)->_nextp_ = (_fl_)->objlist; \ (_fl_)->objlist = (void *)(_obj_); \ (_fl_)->free_cnt++; \ } \ RF_FREELIST_STAT_FREE(_fl_); \ RF_UNLOCK_MUTEX((_fl_)->lock); \}/* * fl = freelist * obj = object to free * nextp = name of "next" pointer in obj * clean = undo for init * arg = arg for undo func */#define RF_FREELIST_FREE_CLEAN_ARG(_fl_,_obj_,_nextp_,_clean_,_arg_) { \ RF_LOCK_MUTEX((_fl_)->lock); \ if ((_fl_)->free_cnt == (_fl_)->max_free_cnt) { \ _clean_ (_obj_,_arg_); \ RF_Free(_obj_,(_fl_)->obj_size); \ } \ else { \ RF_ASSERT((_fl_)->free_cnt < (_fl_)->max_free_cnt); \ (_obj_)->_nextp_ = (_fl_)->objlist; \ (_fl_)->objlist = (void *)(_obj_); \ (_fl_)->free_cnt++; \ } \ RF_FREELIST_STAT_FREE(_fl_); \ RF_UNLOCK_MUTEX((_fl_)->lock); \}/* * fl = freelist * obj = object to free * nextp = name of "next" pointer in obj * clean = undo for init */#define RF_FREELIST_FREE_CLEAN_NOUNLOCK(_fl_,_obj_,_nextp_,_clean_) { \ RF_LOCK_MUTEX((_fl_)->lock); \ if ((_fl_)->free_cnt == (_fl_)->max_free_cnt) { \ _clean_ (_obj_); \ RF_Free(_obj_,(_fl_)->obj_size); \ } \ else { \ RF_ASSERT((_fl_)->free_cnt < (_fl_)->max_free_cnt); \ (_obj_)->_nextp_ = (_fl_)->objlist; \ (_fl_)->objlist = (void *)(_obj_); \ (_fl_)->free_cnt++; \ } \ RF_FREELIST_STAT_FREE(_fl_); \}/* * fl = freelist * nextp = name of "next" pointer in obj * cast = cast to object type */#define RF_FREELIST_DESTROY(_fl_,_nextp_,_cast_) { \ void *_cur, *_next; \ RF_FREELIST_STAT_REPORT(_fl_); \ rf_mutex_destroy(&((_fl_)->lock)); \ for(_cur=(_fl_)->objlist;_cur;_cur=_next) { \ _next = (_cast_ _cur)->_nextp_; \ RF_Free(_cur,(_fl_)->obj_size); \ } \ RF_Free(_fl_,sizeof(RF_FreeList_t)); \}/* * fl = freelist * nextp = name of "next" pointer in obj * cast = cast to object type * clean = func to undo obj init */#define RF_FREELIST_DESTROY_CLEAN(_fl_,_nextp_,_cast_,_clean_) { \ void *_cur, *_next; \ RF_FREELIST_STAT_REPORT(_fl_); \ rf_mutex_destroy(&((_fl_)->lock)); \ for(_cur=(_fl_)->objlist;_cur;_cur=_next) { \ _next = (_cast_ _cur)->_nextp_; \ _clean_ (_cur); \ RF_Free(_cur,(_fl_)->obj_size); \ } \ RF_Free(_fl_,sizeof(RF_FreeList_t)); \}/* * fl = freelist * nextp = name of "next" pointer in obj * cast = cast to object type * clean = func to undo obj init * arg = arg for undo func */#define RF_FREELIST_DESTROY_CLEAN_ARG(_fl_,_nextp_,_cast_,_clean_,_arg_) { \ void *_cur, *_next; \ RF_FREELIST_STAT_REPORT(_fl_); \ rf_mutex_destroy(&((_fl_)->lock)); \ for(_cur=(_fl_)->objlist;_cur;_cur=_next) { \ _next = (_cast_ _cur)->_nextp_; \ _clean_ (_cur,_arg_); \ RF_Free(_cur,(_fl_)->obj_size); \ } \ RF_Free(_fl_,sizeof(RF_FreeList_t)); \}#endif /* !_RF__RF_FREELIST_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -