Changeset b2a0214 in rtems
- Timestamp:
- 06/07/10 09:35:01 (13 years ago)
- Branches:
- 4.11, 5, master
- Children:
- 77787df
- Parents:
- b0e81c96
- Location:
- cpukit
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
cpukit/ChangeLog
rb0e81c96 rb2a0214 1 2010-06-07 Sebastian Huber <sebastian.huber@embedded-brains.de> 2 3 * score/include/rtems/score/heap.h: Declare 4 _Heap_Get_first_and_last_block(). Removed Heap_Extend_status. 5 Changed return type of _Heap_Extend() to bool. 6 * score/inline/rtems/score/heap.inl: Define 7 _Heap_Set_last_block_size(). 8 * score/src/heap.c: Define and use _Heap_Get_first_and_last_block(). 9 * score/src/heapgetinfo.c: Removed assert statements. Do not count 10 the last block. This ensures that all size values are an integral 11 multiple of the page size which is consistent with the other 12 statistics. 13 * score/src/heapextend.c: Implemented support for scattered heap 14 areas. 15 * score/src/heapwalk.c: Dump also last block. Changes for new first 16 and last block values. 17 * ./score/src/pheapextend.c, rtems/src/regionextend.c: Update for 18 _Heap_Extend() changes. 19 1 20 2010-06-03 Chris Johns <chrisj@rtems.org> 2 21 -
cpukit/rtems/src/regionextend.c
rb0e81c96 rb2a0214 50 50 { 51 51 uintptr_t amount_extended; 52 Heap_Extend_status heap_status;52 bool extend_ok; 53 53 Objects_Locations location; 54 54 rtems_status_code return_status; … … 65 65 case OBJECTS_LOCAL: 66 66 67 heap_status= _Heap_Extend(67 extend_ok = _Heap_Extend( 68 68 &the_region->Memory, 69 69 starting_address, … … 72 72 ); 73 73 74 if ( heap_status == HEAP_EXTEND_SUCCESSFUL) {74 if ( extend_ok ) { 75 75 the_region->length += amount_extended; 76 76 the_region->maximum_segment_size += amount_extended; 77 77 return_status = RTEMS_SUCCESSFUL; 78 } else if ( heap_status == HEAP_EXTEND_ERROR ){78 } else { 79 79 return_status = RTEMS_INVALID_ADDRESS; 80 } else /* if ( heap_status == HEAP_EXTEND_NOT_IMPLEMENTED ) */ {81 return_status = RTEMS_NOT_IMPLEMENTED;82 80 } 83 81 break; -
cpukit/score/include/rtems/score/heap.h
rb0e81c96 rb2a0214 93 93 * <tr> 94 94 * <td>first_block->prev_size</td> 95 * <td colspan=2>page size (the value is arbitrary)</td> 95 * <td colspan=2> 96 * subordinate heap area end address (this will be used to maintain a 97 * linked list of scattered heap areas) 98 * </td> 96 99 * </tr> 97 100 * <tr> … … 312 315 313 316 /** 314 * @brief See _Heap_Extend().315 */316 typedef enum {317 HEAP_EXTEND_SUCCESSFUL,318 HEAP_EXTEND_ERROR,319 HEAP_EXTEND_NOT_IMPLEMENTED320 } Heap_Extend_status;321 322 /**323 317 * @brief See _Heap_Resize_block(). 324 318 */ … … 330 324 331 325 /** 326 * @brief Gets the first and last block for the heap area with begin 327 * @a heap_area_begin and size @a heap_area_size. 328 * 329 * A page size of @a page_size and minimal block size of @a min_block_size will 330 * be used for calculation. 331 * 332 * Nothing will be written to this area. 333 * 334 * In case of success the pointers to the first and last block will be returned 335 * via @a first_block_ptr and @a last_block_ptr. 336 * 337 * Returns @c true if the area is big enough, and @c false otherwise. 338 */ 339 bool _Heap_Get_first_and_last_block( 340 uintptr_t heap_area_begin, 341 uintptr_t heap_area_size, 342 uintptr_t page_size, 343 uintptr_t min_block_size, 344 Heap_Block **first_block_ptr, 345 Heap_Block **last_block_ptr 346 ); 347 348 /** 332 349 * @brief Initializes the heap control block @a heap to manage the area 333 350 * starting at @a area_begin of size @a area_size bytes. … … 351 368 * 352 369 * The extended space available for allocation will be returned in 353 * @a amount_extended. 354 * 355 * The memory area must start at the end of the currently used memory area. 356 */ 357 Heap_Extend_status _Heap_Extend( 370 * @a amount_extended. This pointer may be @c NULL. 371 * 372 * The memory area must be big enough to contain some maintainance blocks. It 373 * must not overlap parts of the current heap areas. Disconnected subordinate 374 * heap areas will lead to used blocks which cover the gaps. 375 * 376 * Returns @c true in case of success, and @c false otherwise. 377 */ 378 bool _Heap_Extend( 358 379 Heap_Control *heap, 359 380 void *area_begin, … … 369 390 * 370 391 * If the boundary parameter @a boundary is not equal to zero, the allocated 371 * memory area will fulfill a boundary constraint. The bou dnary value392 * memory area will fulfill a boundary constraint. The boundary value 372 393 * specifies the set of addresses which are aligned by the boundary value. The 373 394 * interior of the allocated memory area will not contain an element of this -
cpukit/score/inline/rtems/score/heap.inl
rb0e81c96 rb2a0214 201 201 202 202 /** 203 * @brief Sets the size of the last block for heap @a heap. 204 * 205 * The next block of the last block will be the first block. Since the first 206 * block indicates that the previous block is used, this ensures that the last 207 * block appears as used for the _Heap_Is_used() and _Heap_Is_free() functions. 208 * 209 * This feature will be used to terminate the scattered heap area list. See 210 * also _Heap_Extend(). 211 */ 212 RTEMS_INLINE_ROUTINE void _Heap_Set_last_block_size( Heap_Control *heap ) 213 { 214 _Heap_Block_set_size( 215 heap->last_block, 216 (uintptr_t) heap->first_block - (uintptr_t) heap->last_block 217 ); 218 } 219 220 /** 203 221 * @brief Returns the size of the allocatable area in bytes. 204 222 * -
cpukit/score/src/heap.c
rb0e81c96 rb2a0214 11 11 * On-Line Applications Research Corporation (OAR). 12 12 * 13 * Copyright (c) 2009 embedded brains GmbH.13 * Copyright (c) 2009, 2010 embedded brains GmbH. 14 14 * 15 15 * The license and distribution terms for this file may be … … 124 124 */ 125 125 126 uintptr_t _Heap_Initialize( 127 Heap_Control *heap, 128 void *heap_area_begin_ptr, 126 bool _Heap_Get_first_and_last_block( 127 uintptr_t heap_area_begin, 129 128 uintptr_t heap_area_size, 130 uintptr_t page_size 131 ) 132 { 133 Heap_Statistics *const stats = &heap->stats; 134 uintptr_t const heap_area_begin = (uintptr_t) heap_area_begin_ptr; 129 uintptr_t page_size, 130 uintptr_t min_block_size, 131 Heap_Block **first_block_ptr, 132 Heap_Block **last_block_ptr 133 ) 134 { 135 135 uintptr_t const heap_area_end = heap_area_begin + heap_area_size; 136 uintptr_t alloc_area_begin = heap_area_begin + HEAP_BLOCK_HEADER_SIZE; 137 uintptr_t alloc_area_size = 0; 138 uintptr_t first_block_begin = 0; 139 uintptr_t first_block_size = 0; 140 uintptr_t min_block_size = 0; 141 uintptr_t overhead = 0; 142 Heap_Block *first_block = NULL; 143 Heap_Block *last_block = NULL; 144 145 if ( page_size == 0 ) { 146 page_size = CPU_ALIGNMENT; 147 } else { 148 page_size = _Heap_Align_up( page_size, CPU_ALIGNMENT ); 149 150 if ( page_size < CPU_ALIGNMENT ) { 151 /* Integer overflow */ 152 return 0; 153 } 154 } 155 min_block_size = _Heap_Align_up( sizeof( Heap_Block ), page_size ); 156 157 alloc_area_begin = _Heap_Align_up( alloc_area_begin, page_size ); 158 first_block_begin = alloc_area_begin - HEAP_BLOCK_HEADER_SIZE; 159 overhead = HEAP_BLOCK_HEADER_SIZE + (first_block_begin - heap_area_begin); 160 first_block_size = heap_area_size - overhead; 161 first_block_size = _Heap_Align_down ( first_block_size, page_size ); 162 alloc_area_size = first_block_size - HEAP_BLOCK_HEADER_SIZE; 136 uintptr_t const alloc_area_begin = 137 _Heap_Align_up( heap_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size ); 138 uintptr_t const first_block_begin = 139 alloc_area_begin - HEAP_BLOCK_HEADER_SIZE; 140 uintptr_t const overhead = 141 HEAP_BLOCK_HEADER_SIZE + (first_block_begin - heap_area_begin); 142 uintptr_t const first_block_size = 143 _Heap_Align_down( heap_area_size - overhead, page_size ); 144 Heap_Block *const first_block = (Heap_Block *) first_block_begin; 145 Heap_Block *const last_block = 146 _Heap_Block_at( first_block, first_block_size ); 163 147 164 148 if ( … … 168 152 ) { 169 153 /* Invalid area or area too small */ 154 return false; 155 } 156 157 *first_block_ptr = first_block; 158 *last_block_ptr = last_block; 159 160 return true; 161 } 162 163 uintptr_t _Heap_Initialize( 164 Heap_Control *heap, 165 void *heap_area_begin_ptr, 166 uintptr_t heap_area_size, 167 uintptr_t page_size 168 ) 169 { 170 Heap_Statistics *const stats = &heap->stats; 171 uintptr_t const heap_area_begin = (uintptr_t) heap_area_begin_ptr; 172 uintptr_t const heap_area_end = heap_area_begin + heap_area_size; 173 uintptr_t first_block_begin = 0; 174 uintptr_t first_block_size = 0; 175 uintptr_t last_block_begin = 0; 176 uintptr_t min_block_size = 0; 177 bool area_ok = false; 178 Heap_Block *first_block = NULL; 179 Heap_Block *last_block = NULL; 180 181 if ( page_size == 0 ) { 182 page_size = CPU_ALIGNMENT; 183 } else { 184 page_size = _Heap_Align_up( page_size, CPU_ALIGNMENT ); 185 186 if ( page_size < CPU_ALIGNMENT ) { 187 /* Integer overflow */ 188 return 0; 189 } 190 } 191 min_block_size = _Heap_Align_up( sizeof( Heap_Block ), page_size ); 192 193 area_ok = _Heap_Get_first_and_last_block( 194 heap_area_begin, 195 heap_area_size, 196 page_size, 197 min_block_size, 198 &first_block, 199 &last_block 200 ); 201 if ( !area_ok ) { 170 202 return 0; 171 203 } 172 204 205 first_block_begin = (uintptr_t) first_block; 206 last_block_begin = (uintptr_t) last_block; 207 first_block_size = last_block_begin - first_block_begin; 208 173 209 /* First block */ 174 first_block = (Heap_Block *) first_block_begin; 175 first_block->prev_size = page_size; 210 first_block->prev_size = heap_area_end; 176 211 first_block->size_and_flag = first_block_size | HEAP_PREV_BLOCK_USED; 177 212 first_block->next = _Heap_Free_list_tail( heap ); 178 213 first_block->prev = _Heap_Free_list_head( heap ); 179 180 /*181 * Last block.182 *183 * The next block of the last block is the first block. Since the first184 * block indicates that the previous block is used, this ensures that the185 * last block appears as used for the _Heap_Is_used() and _Heap_Is_free()186 * functions.187 */188 last_block = _Heap_Block_at( first_block, first_block_size );189 last_block->prev_size = first_block_size;190 last_block->size_and_flag = first_block_begin - (uintptr_t) last_block;191 214 192 215 /* Heap control */ … … 199 222 _Heap_Free_list_head( heap )->next = first_block; 200 223 _Heap_Free_list_tail( heap )->prev = first_block; 224 225 /* Last block */ 226 last_block->prev_size = first_block_size; 227 last_block->size_and_flag = 0; 228 _Heap_Set_last_block_size( heap ); 201 229 202 230 /* Statistics */ … … 223 251 ); 224 252 225 return alloc_area_size;253 return first_block_size; 226 254 } 227 255 -
cpukit/score/src/heapextend.c
rb0e81c96 rb2a0214 11 11 * On-Line Applications Research Corporation (OAR). 12 12 * 13 * Copyright (c) 2010 embedded brains GmbH. 14 * 13 15 * The license and distribution terms for this file may be 14 16 * found in the file LICENSE in this distribution or at … … 26 28 #include <rtems/score/heap.h> 27 29 28 Heap_Extend_status _Heap_Extend( 30 static void _Heap_Free_block( Heap_Control *heap, Heap_Block *block ) 31 { 32 Heap_Statistics *const stats = &heap->stats; 33 34 /* Statistics */ 35 ++stats->used_blocks; 36 --stats->frees; 37 38 _Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( block )); 39 } 40 41 static void _Heap_Merge_below( 29 42 Heap_Control *heap, 30 void *area_begin_ptr, 31 uintptr_t area_size, 32 uintptr_t *amount_extended 43 uintptr_t extend_area_begin, 44 Heap_Block *first_block 45 ) 46 { 47 uintptr_t const page_size = heap->page_size; 48 uintptr_t const new_first_block_alloc_begin = 49 _Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size ); 50 uintptr_t const new_first_block_begin = 51 new_first_block_alloc_begin - HEAP_BLOCK_HEADER_SIZE; 52 uintptr_t const first_block_begin = (uintptr_t) first_block; 53 uintptr_t const new_first_block_size = 54 first_block_begin - new_first_block_begin; 55 Heap_Block *const new_first_block = (Heap_Block *) new_first_block_begin; 56 57 new_first_block->prev_size = first_block->prev_size; 58 new_first_block->size_and_flag = new_first_block_size | HEAP_PREV_BLOCK_USED; 59 60 _Heap_Free_block( heap, new_first_block ); 61 } 62 63 static void _Heap_Merge_above( 64 Heap_Control *heap, 65 Heap_Block *last_block, 66 uintptr_t extend_area_end 67 ) 68 { 69 uintptr_t const page_size = heap->page_size; 70 uintptr_t const last_block_begin = (uintptr_t) last_block; 71 uintptr_t const last_block_new_size = _Heap_Align_down( 72 extend_area_end - last_block_begin - HEAP_BLOCK_HEADER_SIZE, 73 page_size 74 ); 75 Heap_Block *const new_last_block = 76 _Heap_Block_at( last_block, last_block_new_size ); 77 78 new_last_block->size_and_flag = 79 (last_block->size_and_flag - last_block_new_size) 80 | HEAP_PREV_BLOCK_USED; 81 82 _Heap_Block_set_size( last_block, last_block_new_size ); 83 84 _Heap_Free_block( heap, last_block ); 85 } 86 87 static void _Heap_Link_below( 88 Heap_Block *link, 89 Heap_Block *last_block 90 ) 91 { 92 uintptr_t const last_block_begin = (uintptr_t) last_block; 93 uintptr_t const link_begin = (uintptr_t) link; 94 95 last_block->size_and_flag = 96 (link_begin - last_block_begin) | HEAP_PREV_BLOCK_USED; 97 } 98 99 static void _Heap_Link_above( 100 Heap_Block *link, 101 Heap_Block *first_block, 102 Heap_Block *last_block 103 ) 104 { 105 uintptr_t const link_begin = (uintptr_t) link; 106 uintptr_t const first_block_begin = (uintptr_t) first_block; 107 108 _Heap_Block_set_size( link, first_block_begin - link_begin ); 109 110 last_block->size_and_flag |= HEAP_PREV_BLOCK_USED; 111 } 112 113 bool _Heap_Extend( 114 Heap_Control *heap, 115 void *extend_area_begin_ptr, 116 uintptr_t extend_area_size, 117 uintptr_t *extended_size_ptr 33 118 ) 34 119 { 35 120 Heap_Statistics *const stats = &heap->stats; 36 uintptr_t const area_begin = (uintptr_t) area_begin_ptr; 37 uintptr_t const heap_area_begin = heap->area_begin; 38 uintptr_t const heap_area_end = heap->area_end; 39 uintptr_t const new_heap_area_end = heap_area_end + area_size; 40 uintptr_t extend_size = 0; 41 Heap_Block *const last_block = heap->last_block; 42 43 /* 44 * There are five possibilities for the location of starting 45 * address: 46 * 47 * 1. non-contiguous lower address (NOT SUPPORTED) 48 * 2. contiguous lower address (NOT SUPPORTED) 49 * 3. in the heap (ERROR) 50 * 4. contiguous higher address (SUPPORTED) 51 * 5. non-contiguous higher address (NOT SUPPORTED) 52 * 53 * As noted, this code only supports (4). 54 */ 55 56 if ( area_begin >= heap_area_begin && area_begin < heap_area_end ) { 57 return HEAP_EXTEND_ERROR; /* case 3 */ 58 } else if ( area_begin != heap_area_end ) { 59 return HEAP_EXTEND_NOT_IMPLEMENTED; /* cases 1, 2, and 5 */ 60 } 61 62 /* 63 * Currently only case 4 should make it to this point. 64 * The basic trick is to make the extend area look like a used 65 * block and free it. 66 */ 67 68 heap->area_end = new_heap_area_end; 69 70 extend_size = new_heap_area_end 71 - (uintptr_t) last_block - HEAP_BLOCK_HEADER_SIZE; 72 extend_size = _Heap_Align_down( extend_size, heap->page_size ); 73 74 *amount_extended = extend_size; 75 76 if( extend_size >= heap->min_block_size ) { 77 Heap_Block *const new_last_block = _Heap_Block_at( last_block, extend_size ); 78 79 _Heap_Block_set_size( last_block, extend_size ); 80 81 new_last_block->size_and_flag = 82 ((uintptr_t) heap->first_block - (uintptr_t) new_last_block) 83 | HEAP_PREV_BLOCK_USED; 84 85 heap->last_block = new_last_block; 86 87 /* Statistics */ 88 stats->size += extend_size; 89 ++stats->used_blocks; 90 --stats->frees; /* Do not count subsequent call as actual free() */ 91 92 _Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( last_block )); 93 } 94 95 return HEAP_EXTEND_SUCCESSFUL; 96 } 121 Heap_Block *const first_block = heap->first_block; 122 Heap_Block *start_block = first_block; 123 Heap_Block *merge_below_block = NULL; 124 Heap_Block *merge_above_block = NULL; 125 Heap_Block *link_below_block = NULL; 126 Heap_Block *link_above_block = NULL; 127 Heap_Block *extend_first_block = NULL; 128 Heap_Block *extend_last_block = NULL; 129 uintptr_t const page_size = heap->page_size; 130 uintptr_t const min_block_size = heap->min_block_size; 131 uintptr_t const extend_area_begin = (uintptr_t) extend_area_begin_ptr; 132 uintptr_t const extend_area_end = extend_area_begin + extend_area_size; 133 uintptr_t const free_size = stats->free_size; 134 uintptr_t extend_first_block_size = 0; 135 uintptr_t extended_size = 0; 136 bool extend_area_ok = false; 137 138 if ( extend_area_end < extend_area_begin ) { 139 return false; 140 } 141 142 extend_area_ok = _Heap_Get_first_and_last_block( 143 extend_area_begin, 144 extend_area_size, 145 page_size, 146 min_block_size, 147 &extend_first_block, 148 &extend_last_block 149 ); 150 if (!extend_area_ok ) { 151 /* For simplicity we reject extend areas that are too small */ 152 return false; 153 } 154 155 do { 156 uintptr_t const sub_area_begin = (start_block != first_block) ? 157 (uintptr_t) start_block : heap->area_begin; 158 uintptr_t const sub_area_end = start_block->prev_size; 159 Heap_Block *const end_block = 160 _Heap_Block_of_alloc_area( sub_area_end, page_size ); 161 162 if ( 163 sub_area_end > extend_area_begin && extend_area_end > sub_area_begin 164 ) { 165 return false; 166 } 167 168 if ( extend_area_end == sub_area_begin ) { 169 merge_below_block = start_block; 170 } else if ( extend_area_end < sub_area_end ) { 171 link_below_block = start_block; 172 } 173 174 if ( sub_area_end == extend_area_begin ) { 175 start_block->prev_size = extend_area_end; 176 177 merge_above_block = end_block; 178 } else if ( sub_area_end < extend_area_begin ) { 179 link_above_block = end_block; 180 } 181 182 start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) ); 183 } while ( start_block != first_block ); 184 185 if ( extend_area_begin < heap->area_begin ) { 186 heap->area_begin = extend_area_begin; 187 } else if ( heap->area_end < extend_area_end ) { 188 heap->area_end = extend_area_end; 189 } 190 191 extend_first_block_size = 192 (uintptr_t) extend_last_block - (uintptr_t) extend_first_block; 193 194 extend_first_block->prev_size = extend_area_end; 195 extend_first_block->size_and_flag = 196 extend_first_block_size | HEAP_PREV_BLOCK_USED; 197 198 extend_last_block->prev_size = extend_first_block_size; 199 extend_last_block->size_and_flag = 0; 200 201 if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) { 202 heap->first_block = extend_first_block; 203 } else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) { 204 heap->last_block = extend_last_block; 205 } 206 207 if ( merge_below_block != NULL ) { 208 _Heap_Merge_below( heap, extend_area_begin, merge_below_block ); 209 } else if ( link_below_block != NULL ) { 210 _Heap_Link_below( 211 link_below_block, 212 extend_last_block 213 ); 214 } 215 216 if ( merge_above_block != NULL ) { 217 _Heap_Merge_above( heap, merge_above_block, extend_area_end ); 218 } else if ( link_above_block != NULL ) { 219 _Heap_Link_above( 220 link_above_block, 221 extend_first_block, 222 extend_last_block 223 ); 224 } 225 226 if ( merge_below_block == NULL && merge_above_block == NULL ) { 227 _Heap_Free_block( heap, extend_first_block ); 228 } 229 230 _Heap_Set_last_block_size( heap ); 231 232 extended_size = stats->free_size - free_size; 233 234 /* Statistics */ 235 stats->size += extended_size; 236 237 if ( extended_size_ptr != NULL ) 238 *extended_size_ptr = extended_size; 239 240 return true; 241 } -
cpukit/score/src/heapgetinfo.c
rb0e81c96 rb2a0214 22 22 #endif 23 23 24 #include <string.h> 25 24 26 #include <rtems/system.h> 25 27 #include <rtems/score/sysstate.h> … … 34 36 Heap_Block *const end = the_heap->last_block; 35 37 36 _HAssert(the_block->prev_size == the_heap->page_size); 37 _HAssert(_Heap_Is_prev_used(the_block)); 38 39 the_info->Free.number = 0; 40 the_info->Free.total = 0; 41 the_info->Free.largest = 0; 42 the_info->Used.number = 0; 43 the_info->Used.total = 0; 44 the_info->Used.largest = 0; 38 memset(the_info, 0, sizeof(*the_info)); 45 39 46 40 while ( the_block != end ) { … … 61 55 the_block = next_block; 62 56 } 63 64 /*65 * Handle the last dummy block. Don't consider this block to be66 * "used" as client never allocated it. Make 'Used.total' contain this67 * blocks' overhead though.68 */69 the_info->Used.total += HEAP_BLOCK_HEADER_SIZE;70 57 } -
cpukit/score/src/heapwalk.c
rb0e81c96 rb2a0214 218 218 } 219 219 220 if ( first_block->prev_size != page_size ) {221 (*printer)(222 source,223 true,224 "first block: prev size %u != page size %u\n",225 first_block->prev_size,226 page_size227 );228 229 return false;230 }231 232 220 if ( _Heap_Is_free( last_block ) ) { 233 221 (*printer)( … … 235 223 true, 236 224 "last block: is free\n" 225 ); 226 227 return false; 228 } 229 230 if ( 231 _Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block 232 ) { 233 (*printer)( 234 source, 235 true, 236 "last block: next block is not the first block\n" 237 237 ); 238 238 … … 261 261 source, 262 262 false, 263 "block 0x%08x: prev 0x%08x%s, next 0x%08x%s\n",263 "block 0x%08x: size %u, prev 0x%08x%s, next 0x%08x%s\n", 264 264 block, 265 block_size, 265 266 block->prev, 266 267 block->prev == first_free_block ? 267 " (= first )"268 " (= first free)" 268 269 : (block->prev == free_list_head ? " (= head)" : ""), 269 270 block->next, 270 271 block->next == last_free_block ? 271 " (= last )"272 " (= last free)" 272 273 : (block->next == free_list_tail ? " (= tail)" : "") 273 274 ); … … 320 321 uintptr_t const page_size = heap->page_size; 321 322 uintptr_t const min_block_size = heap->min_block_size; 323 Heap_Block *const first_block = heap->first_block; 322 324 Heap_Block *const last_block = heap->last_block; 323 Heap_Block *block = heap->first_block;325 Heap_Block *block = first_block; 324 326 Heap_Walk_printer printer = dump ? 325 327 _Heap_Walk_print : _Heap_Walk_print_nothing; … … 333 335 } 334 336 335 while ( block != last_block ){337 do { 336 338 uintptr_t const block_begin = (uintptr_t) block; 337 339 uintptr_t const block_size = _Heap_Block_size( block ); … … 339 341 Heap_Block *const next_block = _Heap_Block_at( block, block_size ); 340 342 uintptr_t const next_block_begin = (uintptr_t) next_block; 341 342 if ( prev_used ) { 343 (*printer)( 344 source, 345 false, 346 "block 0x%08x: size %u\n", 343 bool const is_not_last_block = block != last_block; 344 345 if ( !_Heap_Is_block_in_heap( heap, next_block ) ) { 346 (*printer)( 347 source, 348 true, 349 "block 0x%08x: next block 0x%08x not in heap\n", 350 block, 351 next_block 352 ); 353 354 return false; 355 } 356 357 if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) { 358 (*printer)( 359 source, 360 true, 361 "block 0x%08x: block size %u not page aligned\n", 347 362 block, 348 363 block_size 349 364 ); 350 } else { 351 (*printer)( 352 source, 353 false, 354 "block 0x%08x: size %u, prev_size %u\n", 355 block, 356 block_size, 357 block->prev_size 358 ); 359 } 360 361 if ( !_Heap_Is_block_in_heap( heap, next_block ) ) { 362 (*printer)( 363 source, 364 true, 365 "block 0x%08x: next block 0x%08x not in heap\n", 366 block, 367 next_block 368 ); 369 370 return false; 371 } 372 373 if ( !_Heap_Is_aligned( block_size, page_size ) ) { 374 (*printer)( 375 source, 376 true, 377 "block 0x%08x: block size %u not page aligned\n", 378 block, 379 block_size 380 ); 381 382 return false; 383 } 384 385 if ( block_size < min_block_size ) { 365 366 return false; 367 } 368 369 if ( block_size < min_block_size && is_not_last_block ) { 386 370 (*printer)( 387 371 source, … … 396 380 } 397 381 398 if ( next_block_begin <= block_begin ) {382 if ( next_block_begin <= block_begin && is_not_last_block ) { 399 383 (*printer)( 400 384 source, … … 412 396 return false; 413 397 } 398 } else if (prev_used) { 399 (*printer)( 400 source, 401 false, 402 "block 0x%08x: size %u\n", 403 block, 404 block_size 405 ); 406 } else { 407 (*printer)( 408 source, 409 false, 410 "block 0x%08x: size %u, prev_size %u\n", 411 block, 412 block_size, 413 block->prev_size 414 ); 414 415 } 415 416 416 417 block = next_block; 417 } 418 } while ( block != first_block ); 418 419 419 420 return true; -
cpukit/score/src/pheapextend.c
rb0e81c96 rb2a0214 31 31 ) 32 32 { 33 Heap_Extend_status status;34 uintptr_t 33 bool extend_ok; 34 uintptr_t amount_extended; 35 35 36 36 _RTEMS_Lock_allocator(); 37 status= _Heap_Extend(the_heap, starting_address, size, &amount_extended);37 extend_ok = _Heap_Extend(the_heap, starting_address, size, &amount_extended); 38 38 _RTEMS_Unlock_allocator(); 39 return (status == HEAP_EXTEND_SUCCESSFUL);39 return extend_ok; 40 40 } 41 41
Note: See TracChangeset
for help on using the changeset viewer.