static void free_blocks(union block_hdr *blok, const char *pool_tag) { /* Puts new blocks at head of block list, point next pointer of * last block in chain to free blocks we already had. */ union block_hdr *old_free_list = block_freelist; if (!blok) return; /* Shouldn't be freeing an empty pool */ block_freelist = blok; /* Adjust first_avail pointers */ while (blok->h.next) { chk_on_blk_list(blok, old_free_list, pool_tag); blok->h.first_avail = (char *) (blok + 1); blok = blok->h.next; } chk_on_blk_list(blok, old_free_list, pool_tag); blok->h.first_avail = (char *) (blok + 1); blok->h.next = old_free_list; }
static void free_blocks(union block_hdr *blok) { #ifdef ALLOC_USE_MALLOC union block_hdr *next; for (; blok; blok = next) { next = blok->h.next; free(blok); } #else #ifdef ALLOC_STATS unsigned num_blocks; #endif /* First, put new blocks at the head of the free list --- * we'll eventually bash the 'next' pointer of the last block * in the chain to point to the free blocks we already had. */ union block_hdr *old_free_list; if (blok == NULL) return; /* Sanity check --- freeing empty pool? */ ep_acquire_mutex(alloc_mutex); old_free_list = block_freelist; block_freelist = blok; /* * Next, adjust first_avail pointers of each block --- have to do it * sooner or later, and it simplifies the search in new_block to do it * now. */ #ifdef ALLOC_STATS num_blocks = 1; #endif while (blok->h.next != NULL) { #ifdef ALLOC_STATS ++num_blocks; #endif chk_on_blk_list(blok, old_free_list); blok->h.first_avail = (char *) (blok + 1); debug_fill(blok->h.first_avail, blok->h.endp - blok->h.first_avail); #ifdef POOL_DEBUG blok->h.owning_pool = FREE_POOL; #endif blok = blok->h.next; } chk_on_blk_list(blok, old_free_list); blok->h.first_avail = (char *) (blok + 1); debug_fill(blok->h.first_avail, blok->h.endp - blok->h.first_avail); #ifdef POOL_DEBUG blok->h.owning_pool = FREE_POOL; #endif /* Finally, reset next pointer to get the old free blocks back */ blok->h.next = old_free_list; #ifdef ALLOC_STATS if (num_blocks > max_blocks_in_one_free) { max_blocks_in_one_free = num_blocks; } ++num_free_blocks_calls; num_blocks_freed += num_blocks; #endif ep_release_mutex(alloc_mutex); #endif }