⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rf_freelist.h

📁 RAIDFrame是个非常好的磁盘阵列RAID仿真工具
💻 H
📖 第 1 页 / 共 2 页
字号:
	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 + -