static void MVFFFinish(Pool pool) { MVFF mvff; Arena arena; Seg seg; Ring ring, node, nextNode; AVERT(Pool, pool); mvff = Pool2MVFF(pool); AVERT(MVFF, mvff); /* Do this first, because the free list can use the segs in an emergency. */ CBSFinish(CBSOfMVFF(mvff)); ring = PoolSegRing(pool); RING_FOR(node, ring, nextNode) { seg = SegOfPoolRing(node); AVER(SegPool(seg) == pool); SegFree(seg); }
extern int main(int argc, char *argv[]) { mps_arena_t mpsArena; Arena arena; /* the ANSI arena which we use to allocate the BT */ FBMStateStruct state; void *p; Addr dummyBlock; BT allocTable; FreelistStruct flStruct; CBSStruct cbsStruct; Align align; randomize(argc, argv); align = (1 << rnd() % 4) * MPS_PF_ALIGN; NAllocateTried = NAllocateSucceeded = NDeallocateTried = NDeallocateSucceeded = 0; die(mps_arena_create(&mpsArena, mps_arena_class_vm(), testArenaSIZE), "mps_arena_create"); arena = (Arena)mpsArena; /* avoid pun */ die((mps_res_t)BTCreate(&allocTable, arena, ArraySize), "failed to create alloc table"); /* We're not going to use this block, but I feel unhappy just */ /* inventing addresses. */ die((mps_res_t)ControlAlloc(&p, arena, ArraySize * align, /* withReservoirPermit */ FALSE), "failed to allocate block"); dummyBlock = p; /* avoid pun */ if (verbose) { printf("Allocated block [%p,%p)\n", (void*)dummyBlock, (char *)dummyBlock + ArraySize); } die((mps_res_t)CBSInit(&cbsStruct, arena, arena, align, /* fastFind */ TRUE, /* zoned */ FALSE, mps_args_none), "failed to initialise CBS"); state.type = FBMTypeCBS; state.align = align; state.block = dummyBlock; state.allocTable = allocTable; state.the.cbs = &cbsStruct; test(&state, nCBSOperations); CBSFinish(&cbsStruct); die((mps_res_t)FreelistInit(&flStruct, align), "failed to initialise Freelist"); state.type = FBMTypeFreelist; state.the.fl = &flStruct; test(&state, nFLOperations); FreelistFinish(&flStruct); mps_arena_destroy(arena); printf("\nNumber of allocations attempted: %ld\n", NAllocateTried); printf("Number of allocations succeeded: %ld\n", NAllocateSucceeded); printf("Number of deallocations attempted: %ld\n", NDeallocateTried); printf("Number of deallocations succeeded: %ld\n", NDeallocateSucceeded); printf("%s: Conclusion: Failed to find any defects.\n", argv[0]); return 0; }