/* Allocate and free blocks in a random order. */ static size_t malloc_benchmark_loop (void **ptr_arr) { unsigned int offset_state = 0, block_state = 0; size_t iters = 0; while (!timeout) { unsigned int next_idx = get_random_offset (&offset_state); unsigned int next_block = get_random_block_size (&block_state); free (ptr_arr[next_idx]); ptr_arr[next_idx] = malloc (next_block); iters++; } return iters; }
bool test_rndm_alc_free( void ) { bool rslt = true; size_t line = 0, max_sz, blks_sz, alc_rec, tbf, blk_sz; int i; block_t blks[RNDM_TESTS << 1]; block_t blk; void *ptr_1; blks_sz = 0; half_init(); max_sz = find_max_block(); // 'alc_rec' stores how many times 'half_alloc' successfully returns a requested block. alc_rec = 0; // Allocating random memory blocks for ( i = 0; i < RNDM_TESTS; ++i ) { // Making a new memory block and storing its pointer in the array size_t blk_sz = get_random_block_size(); block_t blk; blk.ptr = half_alloc(blk_sz); blk.len = blk_sz; if ( blk.ptr != 0 ) { blks[blks_sz] = blk; ++blks_sz; alc_rec++; #ifdef DO_PRINT printf( "%i)The allocated %d Byte block starts from %d \n", ++line, blk.len, blk.ptr ); #endif } } // Checking any violation if ( is_violated(find_violation(blks, blks_sz)) ) { return false; } // Free almost half of the allocation blocks for ( i = 0; i < RNDM_TESTS >> 1 ; ++i ) { if ( (rand() % 2) && (blks_sz > 0) ) { // Free a random block tbf = rand() % blks_sz; // To be freed idex half_free(blks[tbf].ptr); #ifdef DO_PRINT printf( "%i)The %d Byte block starting from %d is free1\n", ++line, blks[tbf].len, blks[tbf].ptr ); #endif --blks_sz; blks[tbf] = blks[blks_sz]; } else { blk_sz = get_random_block_size(); blk.ptr = half_alloc(blk_sz); blk.len = blk_sz; if ( blk.ptr != 0 ) { blks[blks_sz] = blk; ++blks_sz; alc_rec++; #ifdef DO_PRINT printf( "%i)The allocated %d Byte block starts from %d \n", ++line, blk.len, blk.ptr ); #endif } } } // Checking any violation if ( is_violated( find_violation( blks, blks_sz ) ) ) { return false; } for ( i = blks_sz - 1; i >= 0; --i ) { half_free(blks[i].ptr); --blks_sz; #ifdef DO_PRINT printf( "%i)The %d Byte block starting from %d is free2\n", ++line, blks[i].len, blks[i].ptr ); #endif } // All allocated memories have to be freed now. #ifdef DO_PRINT printf("%d random blocks are allocated and freed without any violation.\n", alc_rec); #endif ptr_1 = half_alloc(max_sz); if ( ptr_1 == NULL ) { rslt = false; #ifdef DO_PRINT printf( "Memory is defraged.\n" ); #endif } else { half_free( ptr_1 ); } return rslt; }