static void test_heap_extend(void) { bool ret = false; Heap_Control *heap = &TestHeap; uint8_t *area_begin = TestHeapMemory; uint8_t *sub_area_begin; uint8_t *sub_area_end; _Heap_Initialize( heap, area_begin + 768, 256, 0 ); sub_area_begin = (uint8_t *) heap->first_block; sub_area_end = (uint8_t *) heap->first_block->prev_size; puts( "heap extend - link below" ); ret = _Protected_heap_Extend( heap, area_begin + 0, 256 ); test_heap_assert( ret, true ); puts( "heap extend - merge below overlap" ); ret = _Protected_heap_Extend( heap, sub_area_begin - 128, 256 ); test_heap_assert( ret, false ); puts( "heap extend - merge below" ); ret = _Protected_heap_Extend( heap, sub_area_begin - 256, 256 ); test_heap_assert( ret, true ); puts( "heap extend - merge above overlap" ); ret = _Protected_heap_Extend( heap, sub_area_end - 128, 256 ); test_heap_assert( ret, false ); puts( "heap extend - merge above" ); ret = _Protected_heap_Extend( heap, sub_area_end, 256 ); test_heap_assert( ret, true ); puts( "heap extend - link above" ); ret = _Protected_heap_Extend( heap, area_begin + 1536, 256 ); test_heap_assert( ret, true ); puts( "heap extend - area too small" ); ret = _Protected_heap_Extend( heap, area_begin + 2048, 0 ); test_heap_assert( ret, false ); puts( "heap extend - invalid area" ); ret = _Protected_heap_Extend( heap, (void *) -1, 2 ); test_heap_assert( ret, false ); area_begin = (uint8_t *) (((uintptr_t) area_begin) | 1); _Heap_Initialize( heap, area_begin + 768, 256, 0 ); puts( "heap extend - merge below with align up" ); ret = _Protected_heap_Extend( heap, area_begin + 512, 256 ); test_heap_assert( ret, true ); }
rtems_status_code rtems_heap_extend( void *area_begin, uintptr_t area_size ) { bool ok = _Protected_heap_Extend(RTEMS_Malloc_Heap, area_begin, area_size); if (ok) { return RTEMS_SUCCESSFUL; } else { return RTEMS_INVALID_ADDRESS; } }
static void test_heap_extend_allocation_order(void) { Heap_Control *heap = &TestHeap; uintptr_t size = 256; uintptr_t gap = 256; uint8_t *init_area_begin = TestHeapMemory; uint8_t *extend_area_begin = init_area_begin + size + gap; bool ret; uint8_t *p; _Heap_Initialize( heap, init_area_begin, size, 0 ); ret = _Protected_heap_Extend( heap, extend_area_begin, size ); test_heap_assert( ret, true ); p = _Heap_Allocate( heap, 1 ); rtems_test_assert( (uintptr_t) (p - init_area_begin) < size ); }