#include "private.h" /*--------------------------------------------------------- */ bool_t lub_heap_extend_upwards(lub_heap_t * this, lub_heap_block_t ** ptr_block, words_t words) { lub_heap_block_t *block = *ptr_block; lub_heap_free_block_t *next_block = (lub_heap_free_block_t *) lub_heap_block_getnext(block); bool_t result = BOOL_FALSE; if (NULL != next_block) { /* Do we have a free block above us? */ if (1 == next_block->tag.free) { int segment; void *tmp; lub_heap_tag_t *tail = lub_heap_block__get_tail((lub_heap_block_t *) next_block); /* work out how many extra words we need */ words -= block->alloc.tag.words; /* remove the block from the tree */ lub_bintree_remove(&this->free_tree, next_block); /* remember the segment status of the next block */ segment = tail->segment; /* try and slice off a chunk of memory */ tmp = lub_heap_slice_from_bottom(this, &next_block, &words, BOOL_FALSE); if (NULL != next_block) { /* put the modified free block back into the tree */ lub_bintree_insert(&this->free_tree, next_block); /* there is still a block above us */ segment = 0; } if (NULL != tmp) { /* we managed to extend upwards */ result = BOOL_TRUE; /* taint the old tail pointer */ tail = lub_heap_block__get_tail(block); lub_heap_taint_memory((char *)tail, LUB_HEAP_TAINT_ALLOC, sizeof(lub_heap_tag_t)); /* fill out the new block details */ block->alloc.tag.words += words; this->stats.alloc_bytes += (words << 2); this->stats.alloc_total_bytes += (words << 2); tail = lub_heap_block__get_tail(block); tail->segment = segment; tail->free = 0; tail->words = block->alloc.tag.words; } } } return result; } /*--------------------------------------------------------- */