/* ************************************************************************ */ int _BlockHeapFree(BlockHeap * bh, void *ptr) { Block *block; struct MemBlock *memblock; assert(bh != NULL); assert(ptr != NULL); if (bh == NULL) { ilog(L_NOTICE, "balloc.c:BlockHeapFree() bh == NULL"); return(1); } if (ptr == NULL) { ilog(L_NOTICE, "balloc.BlockHeapFree() ptr == NULL"); return(1); } memblock = (void *)((size_t)ptr - sizeof(MemBlock)); assert(memblock->block != NULL); if(memblock->block == NULL) { outofmemory(); } /* Is this block really on the used list? */ assert(dlinkFind(&memblock->block->used_list, memblock) == NULL); block = memblock->block; bh->freeElems++; block->freeElems++; mem_frob(ptr, bh->elemSize); dlinkDelete(&memblock->self, &block->used_list); dlinkAdd(ptr, &memblock->self, &block->free_list); return(0); }
/*! \brief Returns an element to the free pool, does not free() * \param bh Pointer to BlockHeap containing element * \param ptr Pointer to element to be "freed" * \return 0 if successful, 1 if element not contained within BlockHeap */ int BlockHeapFree(BlockHeap *bh, void *ptr) { Block *block = NULL; struct MemBlock *memblock = NULL; assert(bh != NULL); assert(ptr != NULL); memblock = (void *)((size_t)ptr - sizeof(MemBlock)); assert(memblock->block != NULL); if (memblock->block == NULL) outofmemory(); block = memblock->block; ++bh->freeElems; ++block->freeElems; mem_frob(ptr, bh->elemSize); dlinkAdd(ptr, &memblock->self, &block->free_list); return 0; }