12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #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;
- }
- /*--------------------------------------------------------- */
|