#include #include "private.h" /*--------------------------------------------------------- */ bool_t lub_heap_extend_both_ways(lub_heap_t *this, lub_heap_block_t **ptr_block, const words_t words) { lub_heap_block_t *block = *ptr_block; lub_heap_free_block_t *prev_block = (lub_heap_free_block_t*)lub_heap_block_getprevious(block); lub_heap_free_block_t *next_block = (lub_heap_free_block_t*)lub_heap_block_getnext(block); bool_t result = BOOL_FALSE; if(prev_block && prev_block->tag.free && next_block && next_block->tag.free) { /* OK we have a free block above and below us */ if(words <= (prev_block->tag.words + next_block->tag.words)) { /* There is sufficient space to extend */ words_t delta = words - next_block->tag.words; /* maximise the upward extension */ result = lub_heap_extend_downwards(this,&block,delta); assert(BOOL_TRUE == result); result = lub_heap_extend_upwards(this,&block,next_block->tag.words); assert(BOOL_TRUE == result); } } return result; } /*--------------------------------------------------------- */