static void test_block_alloc( int free_variant, int alloc_variant, uintptr_t alloc_begin, uintptr_t alloc_size ) { void *p1 = NULL; void *p2 = NULL; void *p3 = NULL; uintptr_t size_fresh_heap = 0; uintptr_t pages_per_default_block = 0; uint32_t exp_free_pages = 0; uint32_t exp_free_blocks = 0; uint32_t exp_used_blocks = 0; test_heap_init( TEST_DEFAULT_PAGE_SIZE ); size_fresh_heap = _Heap_Get_size( &TestHeap ); exp_free_pages = size_fresh_heap / TestHeap.page_size; p1 = test_create_used_block(); p2 = test_create_used_block(); p3 = test_create_used_block(); pages_per_default_block = _Heap_Block_size( _Heap_Block_of_alloc_area( (uintptr_t) p1, TestHeap.page_size ) ) / TestHeap.page_size; if (free_variant == 1) { test_free( p1 ); } else if (free_variant == 2) { test_free( p3 ); } else if (free_variant == 3) { test_free( p2 ); test_free( p3 ); } _Heap_Block_allocate( &TestHeap, _Heap_Block_of_alloc_area( (uintptr_t) p2, test_page_size()), alloc_begin, alloc_size ); test_check_alloc_simple( (void *) alloc_begin, alloc_size, 0, 0 ); /* check statistics */ switch( free_variant ) { case 1: exp_free_pages = exp_free_pages - 2 * pages_per_default_block; exp_used_blocks = 2; switch( alloc_variant ) { case 1: /* allocate block full space */ exp_free_blocks = 2; break; case 2: /* allocate block in the middle */ exp_free_pages = exp_free_pages + pages_per_default_block - 1; exp_free_blocks = 3; break; case 3: /* allocate block at the end */ exp_free_pages = exp_free_pages + pages_per_default_block - 2; exp_free_blocks = 2; break; default: /* allocate block at the beginning */ exp_free_pages = exp_free_pages + pages_per_default_block - 1; exp_free_blocks = 3; break; } break; case 2: exp_free_pages = exp_free_pages - 2 * pages_per_default_block; exp_used_blocks = 2; switch( alloc_variant ) { case 1: /* allocate block full space */ exp_free_blocks = 1; break; case 2: /* allocate block in the middle */ exp_free_pages = exp_free_pages + pages_per_default_block - 1; exp_free_blocks = 2; break; case 3: /* allocate block at the end */ exp_free_pages = exp_free_pages + pages_per_default_block - 1; exp_free_blocks = 2; break; default: /* allocate block at the beginning */ exp_free_pages = exp_free_pages + pages_per_default_block - 1; exp_free_blocks = 1; break; } break; case 3: exp_free_pages = exp_free_pages - pages_per_default_block; exp_used_blocks = 2; switch( alloc_variant ) { case 1: /* allocate block full space */ exp_free_pages = exp_free_pages - pages_per_default_block; exp_free_blocks = 1; break; case 2: /* allocate block in the middle */ exp_free_pages = exp_free_pages - 1; exp_free_blocks = 2; break; case 3: /* allocate block at the end */ exp_free_pages = exp_free_pages - 2; exp_free_blocks = 2; break; default: /* allocate block at the beginning */ exp_free_pages = exp_free_pages - 1; exp_free_blocks = 1; break; } break; default: exp_free_pages = exp_free_pages - 3 * pages_per_default_block; exp_used_blocks = 3; switch( alloc_variant ) { case 1: /* allocate block full space */ exp_free_blocks = 1; break; case 2: /* allocate block in the middle */ exp_free_blocks = 3; exp_free_pages = exp_free_pages + pages_per_default_block - 1; break; case 3: /* allocate block at the end */ exp_free_blocks = 2; exp_free_pages = exp_free_pages + pages_per_default_block - 1; break; default: /* allocate block at the beginning */ exp_free_blocks = 2; exp_free_pages = exp_free_pages + pages_per_default_block - 1; } } rtems_test_assert( TestHeap.stats.free_size == exp_free_pages * TestHeap.page_size ); rtems_test_assert( TestHeap.stats.free_blocks == exp_free_blocks ); rtems_test_assert( TestHeap.stats.used_blocks == exp_used_blocks ); }
uintptr_t _Protected_heap_Get_size( Heap_Control *the_heap ) { return _Heap_Get_size( the_heap ); }