From e4278f2050a276f07e23d630adc78ee4e4c143dc Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 12 Oct 2012 17:02:30 +0200 Subject: score: Append to free list in _Heap_Extend() --- cpukit/score/inline/rtems/score/heap.inl | 13 +++++++++++++ cpukit/score/src/heapextend.c | 11 ++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) (limited to 'cpukit/score') diff --git a/cpukit/score/inline/rtems/score/heap.inl b/cpukit/score/inline/rtems/score/heap.inl index 6a89555ede..b9553714c4 100644 --- a/cpukit/score/inline/rtems/score/heap.inl +++ b/cpukit/score/inline/rtems/score/heap.inl @@ -87,6 +87,19 @@ RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after( next->prev = new_block; } +RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_before( + Heap_Block *block_next, + Heap_Block *new_block +) +{ + Heap_Block *prev = block_next->prev; + + new_block->next = block_next; + new_block->prev = prev; + prev->next = new_block; + block_next->prev = new_block; +} + RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment diff --git a/cpukit/score/src/heapextend.c b/cpukit/score/src/heapextend.c index f93d71f906..83e0928dba 100644 --- a/cpukit/score/src/heapextend.c +++ b/cpukit/score/src/heapextend.c @@ -28,12 +28,21 @@ static void _Heap_Free_block( Heap_Control *heap, Heap_Block *block ) { Heap_Statistics *const stats = &heap->stats; + Heap_Block *first_free; /* Statistics */ ++stats->used_blocks; --stats->frees; - _Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( block )); + /* + * The _Heap_Free() will place the block to the head of free list. We want + * the new block at the end of the free list. So that initial and earlier + * areas are consumed first. + */ + _Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( block ) ); + first_free = _Heap_Free_list_first( heap ); + _Heap_Free_list_remove( first_free ); + _Heap_Free_list_insert_before( _Heap_Free_list_tail( heap ), first_free ); } static void _Heap_Merge_below( -- cgit v1.2.3