Lines Matching refs:fl

55 static FreeListBlock *_new_FreeListBlock(FreeList *fl);
56 static FreeListBlock *_del_FreeListBlock(FreeListBlock *fl);
57 static void _thread_FreeListBlock(FreeList *fl, FreeListBlock *block);
74 FreeList *fl; /* The new free-list container */
93 fl = (FreeList *) malloc(sizeof(FreeList));
94 if(!fl) {
103 fl->node_size = node_size;
104 fl->blocking_factor = blocking_factor;
105 fl->nbusy = 0;
106 fl->ntotal = 0;
107 fl->block = NULL;
108 fl->free_list = NULL;
112 fl->block = _new_FreeListBlock(fl);
113 if(!fl->block) {
115 return _del_FreeList(fl, 1);
120 fl->free_list = fl->block->nodes;
124 return fl;
133 * fl FreeList * The free-list to be reset, or NULL.
135 void _rst_FreeList(FreeList *fl)
137 if(fl) {
142 for(block=fl->block; block; block=block->next)
143 _thread_FreeListBlock(fl, block);
147 fl->free_list = NULL;
148 for(block=fl->block; block; block=block->next) {
152 char *last_node = block->nodes + fl->node_size *
153 (fl->blocking_factor - 1);
159 *(void **)last_node = fl->free_list;
160 fl->free_list = block->nodes;
165 fl->nbusy = 0;
173 * fl FreeList * The free-list to be deleted, or NULL.
184 FreeList *_del_FreeList(FreeList *fl, int force)
186 if(fl) {
190 if(!force && _busy_FreeListNodes(fl) != 0) {
198 FreeListBlock *next = fl->block;
205 fl->block = NULL;
206 fl->free_list = NULL;
210 free(fl);
219 * fl FreeList * The free-list to return an object from.
224 * is insufficient memory, or 'fl' is NULL.
226 void *_new_FreeListNode(FreeList *fl)
232 if(!fl)
238 if(!fl->free_list) {
239 FreeListBlock *block = _new_FreeListBlock(fl);
245 block->next = fl->block;
246 fl->block = block;
250 fl->free_list = fl->block->nodes;
255 node = fl->free_list;
256 fl->free_list = *(void **)node;
260 fl->nbusy++;
271 * fl FreeList * The free-list from which the object was taken.
276 void *_del_FreeListNode(FreeList *fl, void *object)
281 if(!fl)
287 *(void **)object = fl->free_list;
288 fl->free_list = object;
292 fl->nbusy--;
301 * fl FreeList * The list to count wrt, or NULL.
303 * return long The number of nodes (or 0 if fl==NULL).
305 long _busy_FreeListNodes(FreeList *fl)
307 return fl ? fl->nbusy : 0;
315 * fl FreeList * The list to count wrt, or NULL.
317 * return long The number of unused nodes (or 0 if fl==NULL).
319 long _idle_FreeListNodes(FreeList *fl)
321 return fl ? (fl->ntotal - fl->nbusy) : 0;
330 * fl FreeList * The free-list to allocate the list for.
335 static FreeListBlock *_new_FreeListBlock(FreeList *fl)
354 block->nodes = (char *) malloc(fl->node_size * fl->blocking_factor);
360 _thread_FreeListBlock(fl, block);
364 fl->ntotal += fl->blocking_factor;
372 * fl FreeList * The freelist that contains the block.
375 static void _thread_FreeListBlock(FreeList *fl, FreeListBlock *block)
379 for(i=0; i<fl->blocking_factor - 1; i++, mem += fl->node_size)
380 *(void **)mem = mem + fl->node_size; /* Link to the next node */
388 * fl FreeListBlock * The block to be deleted, or NULL.
392 static FreeListBlock *_del_FreeListBlock(FreeListBlock *fl)
394 if(fl) {
395 fl->next = NULL;
396 if(fl->nodes)
397 free(fl->nodes);
398 fl->nodes = NULL;
399 free(fl);