static void heap_garbage_collection(void *arg) { BlockHeap *bh; for (bh = heap_list; bh != NULL; bh = bh->next) BlockHeapGarbageCollect(bh); }
void * _BlockHeapAlloc(BlockHeap * bh) { Block *walker; dlink_node *new_node; assert(bh != NULL); if (bh == NULL) { return(NULL); } if (bh->freeElems == 0) { /* Allocate new block and assign */ /* newblock returns 1 if unsuccessful, 0 if not */ if (newblock(bh)) { /* That didn't work..try to garbage collect */ BlockHeapGarbageCollect(bh); if(bh->freeElems == 0) { outofmemory(); /* Well that didn't work either...bail */ } } } for (walker = bh->base; walker != NULL; walker = walker->next) { if (walker->freeElems > 0) { bh->freeElems--; walker->freeElems--; new_node = walker->free_list.head; dlinkDelete(new_node, &walker->free_list); dlinkAdd(new_node->data, new_node, &walker->used_list); assert(new_node->data != NULL); if(new_node->data == NULL) outofmemory(); return (new_node->data); } } assert(0 == 1); return(NULL); /* If you get here, something bad happened ! */ }
/*! \brief Returns a pointer to a struct within our BlockHeap that's free for * the taking. * \param bh Pointer to the Blockheap * \return Address pointer to allocated data space, or NULL if unsuccessful */ void * BlockHeapAlloc(BlockHeap *bh) { Block *walker = NULL; dlink_node *new_node = NULL; assert(bh != NULL); if (bh->freeElems == 0) { /* Allocate new block and assign */ /* newblock returns 1 if unsuccessful, 0 if not */ if (newblock(bh)) { /* That didn't work..try to garbage collect */ BlockHeapGarbageCollect(bh); if (newblock(bh)) outofmemory(); /* Well that didn't work either...bail */ } } for (walker = bh->base; walker != NULL; walker = walker->next) { if (walker->freeElems > 0) { --bh->freeElems; --walker->freeElems; new_node = walker->free_list.head; dlinkDelete(new_node, &walker->free_list); assert(new_node->data != NULL); memset(new_node->data, 0, bh->elemSize); return new_node->data; } } assert(0 == 1); outofmemory(); return NULL; }
static void client_heap_gc(void *unused) { BlockHeapGarbageCollect(client_heap); BlockHeapGarbageCollect(lclient_heap); }
static void linebuf_garbage_collect(void *unused) { BlockHeapGarbageCollect(linebuf_heap); }