static void create(void) { Res res; if (args[0] < 1) { printf("can't create a BT of size 0\n"); return; } if (bt != NULL) destroy(); res = BTCreate(&bt, arena, args[0]); if (res == ResOK) { btSize = args[0]; BTResRange(bt, 0, btSize); } else { printf("BTCreate returned %d\n",res); } }
static void test(mps_arena_t arena) { BT bt; Nailboard board; Align align; Count nails; Addr base, limit; Index i, j, k; align = (Align)1 << (rnd() % 10); nails = (Count)1 << (rnd() % 16); nails += rnd() % nails; base = AddrAlignUp(0, align); limit = AddrAdd(base, nails * align); die(BTCreate(&bt, arena, nails), "BTCreate"); BTResRange(bt, 0, nails); die(NailboardCreate(&board, arena, align, base, limit), "NailboardCreate"); for (i = 0; i <= nails / 8; ++i) { Bool old; j = rnd() % nails; old = BTGet(bt, j); BTSet(bt, j); cdie(NailboardSet(board, AddrAdd(base, j * align)) == old, "NailboardSet"); for (k = 0; k < nails / 8; ++k) { Index b, l; b = rnd() % nails; l = b + rnd() % (nails - b) + 1; cdie(BTIsResRange(bt, b, l) == NailboardIsResRange(board, AddrAdd(base, b * align), AddrAdd(base, l * align)), "NailboardIsResRange"); } } die(NailboardDescribe(board, mps_lib_get_stdout(), 0), "NailboardDescribe"); }
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; }
extern int main(int argc, char *argv[]) { unsigned i; Addr base, limit; mps_arena_t mpsArena; Arena arena; /* the ANSI arena which we use to allocate the BT */ CBSStruct cbsStruct; CBS cbs; void *p; Addr dummyBlock; BT allocTable; Size size; Bool high; CBSFindDelete findDelete = CBSFindDeleteNONE; randomize(argc, argv); NAllocateTried = NAllocateSucceeded = NDeallocateTried = NDeallocateSucceeded = NNewBlocks = NDeleteBlocks = NGrowBlocks = NShrinkBlocks = 0; clearExpectations(); 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"); die((mps_res_t)CBSInit(arena, &cbsStruct, NULL, &cbsNewCallback, &cbsDeleteCallback, &cbsGrowCallback, &cbsShrinkCallback, MinSize, Alignment, TRUE, TRUE), "failed to initialise CBS"); cbs = &cbsStruct; BTSetRange(allocTable, 0, ArraySize); /* Initially all allocated */ /* We're not going to use this block, but I feel unhappy just */ /* inventing addresses. */ die((mps_res_t)ControlAlloc(&p, arena, ArraySize * Alignment, /* withReservoirPermit */ FALSE), "failed to allocate block"); dummyBlock = (Addr)p; /* avoid pun */ printf("Allocated block [%p, %p)\n", (void*)dummyBlock, (char *)dummyBlock + ArraySize); checkCBS(cbs, allocTable, dummyBlock); for(i = 0; i < NOperations; i++) { switch(cbsRnd(3)) { case 0: { randomRange(&base, &limit, allocTable, dummyBlock); allocate(cbs, dummyBlock, allocTable, base, limit); } break; case 1: { randomRange(&base, &limit, allocTable, dummyBlock); deallocate(cbs, dummyBlock, allocTable, base, limit); } break; case 2: { size = cbsRnd(ArraySize / 10) + 1; high = cbsRnd(2) ? TRUE : FALSE; switch(cbsRnd(6)) { case 0: case 1: case 2: findDelete = CBSFindDeleteNONE; break; case 3: findDelete = CBSFindDeleteLOW; break; case 4: findDelete = CBSFindDeleteHIGH; break; case 5: findDelete = CBSFindDeleteENTIRE; break; } find(cbs, dummyBlock, allocTable, size, high, findDelete); } break; } if (i % 5000 == 0) checkCBS(cbs, allocTable, dummyBlock); } checkExpectations(); /* CBSDescribe prints a very long line. */ /* CBSDescribe(cbs, mps_lib_get_stdout()); */ 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("Number of new large blocks: %ld\n", NNewBlocks); printf("Number of deleted large blocks: %ld\n", NDeleteBlocks); printf("Number of grown large blocks: %ld\n", NGrowBlocks); printf("Number of shrunk large blocks: %ld\n", NShrinkBlocks); printf("\nNo problems detected.\n"); return 0; }