static void test(void) { int i = 0; mps_ap_t sap; mps_arena_t arena; mps_fmt_t format; mps_pool_t spool; mps_thr_t thread; mps_frame_t frame; mycell *p; /* create an arena that can't grow beyond 30 M */ cdie(mps_arena_create(&arena, mps_arena_class_vm(), (size_t)THIRTY_MEG), "create arena"); cdie(mps_arena_commit_limit_set(arena, (size_t)THIRTY_MEG), "commit limit set"); cdie(mps_thread_reg(&thread, arena), "register thread"); cdie( mps_fmt_create_A(&format, arena, &fmtA), "create format"); cdie( mps_pool_create(&spool, arena, mps_class_snc(), format), "create SNC pool"); cdie( mps_ap_create(&sap, spool, mps_rank_exact()), "create ap"); /* repeatedly push, alloc 1MB object, and pop to first stack frame. This shouldn't use much more than 1MB of memory. */ for (i=0; i < ITERATIONS; i++) { die(mps_ap_frame_push(&frame, sap), "push"); p = allocdumb(sap, OBJSIZE, mps_rank_exact()); die(mps_ap_frame_pop(sap, frame), "pop"); comment("%i of %i", i, ITERATIONS); } mps_ap_destroy(sap); comment("Destroyed ap."); mps_pool_destroy(spool); comment("Destroyed pool."); mps_fmt_destroy(format); comment("Destroyed format."); mps_thread_dereg(thread); comment("Deregistered thread."); mps_arena_destroy(arena); comment("Destroyed arena."); }
static void test(void) { int i = 0, f = 0; mps_ap_t sap; mps_arena_t arena; mps_fmt_t format; mps_pool_t spool; mps_thr_t thread; mps_frame_t frames[MAXFRAMES]; int nobj[MAXFRAMES+1]; mycell *p; /* create an arena that can't grow beyond 30 M */ cdie(mps_arena_create(&arena, mps_arena_class_vm(), (size_t)THIRTY_MEG), "create arena"); cdie(mps_arena_commit_limit_set(arena, (size_t)THIRTY_MEG), "commit limit set"); cdie(mps_thread_reg(&thread, arena), "register thread"); cdie( mps_fmt_create_A(&format, arena, &fmtA), "create format"); cdie( mps_pool_create(&spool, arena, mps_class_snc(), format), "create SNC pool"); cdie( mps_ap_create(&sap, spool, mps_rank_exact()), "create ap"); /* repeatedly push and pop stack frames, and allocate objects in them at random. Parameters ensure that max allocation can't get too high. */ for (i=0; i < ITERATIONS; i++) { switch (ranint(12)) { case 1: case 2: case 3: case 4: case 5: if (f < MAXFRAMES) { die(mps_ap_frame_push(&frames[f], sap), "push"); comment("push %i", f); f++; nobj[f] = 0; } break; case 6: case 7: case 8: case 9: case 10: if (nobj[f] < MAXLEVOBJS) { p = allocone(sap, 16, mps_rank_exact()); setref(p, 0, NULL); nobj[f]++; } break; case 11: if (f>0) { f -= 1+ranint(1+ranint(f)); /* new f is in [0, old f) */ die(mps_ap_frame_pop(sap, frames[f]), "pop"); comment("pop %i", f); } break; } } mps_arena_park(arena); mps_ap_destroy(sap); comment("Destroyed ap."); mps_pool_destroy(spool); comment("Destroyed pool."); mps_fmt_destroy(format); comment("Destroyed format."); mps_thread_dereg(thread); comment("Deregistered thread."); mps_arena_destroy(arena); comment("Destroyed arena."); }
static void test(void) { int i; mps_ap_t ap, sap; mps_arena_t arena; mps_fmt_t format; mps_chain_t chain; mps_pool_t pool, spool; mps_thr_t thread; mps_frame_t frame1; mycell *p, *q; size_t com, com1, com2; formatcomments=1; alloccomments=1; fixcomments=1; /* create an arena (no particular size limit) */ cdie(mps_arena_create(&arena, mps_arena_class_vm(), (size_t)ARENA_SIZE), "create arena"); cdie(mps_thread_reg(&thread, arena), "register thread"); /* because we know objects in the stack pool don't move, */ /* we can do without roots. Hooray! */ cdie(mps_fmt_create_A(&format, arena, &fmtA), "create format"); cdie(mps_chain_create(&chain, arena, genCOUNT, testChain), "chain_create"); die(mmqa_pool_create_chain(&pool, arena, mps_class_amc(), format, chain), "create pool(amc)"); cdie(mps_ap_create(&ap, pool, mps_rank_exact()), "create ap(amc)"); cdie(mps_pool_create(&spool, arena, mps_class_snc(), format), "create SNC pool"); cdie(mps_ap_create(&sap, spool, mps_rank_exact()), "create ap"); /* push, alloc, check object is scanned */ com = arena_committed_and_used(arena); report("com", "%ld", com); cdie(mps_ap_frame_push(&frame1, sap), "push"); p = allocone(sap, 2, mps_rank_exact()); q = allocdumb(ap, BIGSIZE, mps_rank_exact()); setref(p, 0, q); q = allocdumb(ap, SMALLSIZE, mps_rank_exact()); report("com", "%ld", arena_committed_and_used(arena)); comment("collect..."); mps_arena_collect(arena); com1 = arena_committed_and_used(arena); mps_arena_release(arena); report("com", "%ld", com1); report("inc1", "%d", (com1-com)/BIGSIZE); /* pop, check object isn't scanned */ cdie(mps_ap_frame_pop(sap, frame1), "pop"); comment("collect..."); mps_arena_collect(arena); com1 = arena_committed_and_used(arena); mps_arena_release(arena); report("com", "%ld", com1); report("inc2", "%ld", (com1-com)/BIGSIZE); /* check initial frame is scanned */ p = allocone(sap, 2, mps_rank_exact()); q = allocdumb(ap, BIGSIZE, mps_rank_exact()); setref(p, 1, q); q = allocdumb(ap, SMALLSIZE, mps_rank_exact()); mps_arena_collect(arena); com2 = arena_committed_and_used(arena); mps_arena_release(arena); report("inc3", "%ld", (com2-com1)/BIGSIZE); /* even in ordinary collection */ for (i=0; i < 500; i++) { q = allocdumb(ap, BIGSIZE, mps_rank_exact()); } q = allocdumb(ap, SMALLSIZE, mps_rank_exact()); mps_arena_collect(arena); com2 = arena_committed_and_used(arena); mps_arena_release(arena); report("inc4", "%ld", (com2-com1)/BIGSIZE); mps_ap_destroy(ap); mps_ap_destroy(sap); mps_pool_destroy(pool); mps_pool_destroy(spool); mps_chain_destroy(chain); mps_fmt_destroy(format); mps_thread_dereg(thread); mps_arena_destroy(arena); comment("Destroyed arena."); }