From bf65f05d744179aa82c8a868ef9cc8dbb3c7331e Mon Sep 17 00:00:00 2001 From: Nick Barnes Date: Wed, 15 May 2002 17:26:44 +0100 Subject: [PATCH] Add mps_arena_step(). Copied from Perforce Change: 29207 ServerID: perforce.ravenbrook.com --- mps/src/arena.c | 76 +++++++++++++++++++++++++++++-------------------- mps/src/mpm.h | 1 + mps/src/mps.h | 1 + mps/src/mpsi.c | 76 +++++++++++++++++++++++++++---------------------- 4 files changed, 89 insertions(+), 65 deletions(-) diff --git a/mps/src/arena.c b/mps/src/arena.c index 8c5f6b1fc47..697d2b8937d 100644 --- a/mps/src/arena.c +++ b/mps/src/arena.c @@ -237,12 +237,12 @@ Bool ArenaCheck(Arena arena) } /* the oldest history entry must be a subset of the prehistory */ CHECKL(RefSetSub(rs, arena->prehistory)); - + /* we also check the statics now. design.mps.arena.static.check */ CHECKL(BoolCheck(arenaRingInit)); CHECKL(RingCheck(&arenaRing)); /* can't check arenaSerial */ - + for(rank = 0; rank < RankMAX; ++rank) CHECKL(RingCheck(&arena->greyRing[rank])); @@ -291,7 +291,7 @@ void ArenaInit(Arena arena, Lock lock, ArenaClass class) arena->flippedTraces = TraceSetEMPTY; /* impl.c.trace */ for (i=0; i < TRACE_MAX; i++) { /* design.mps.arena.trace.invalid */ - arena->trace[i].sig = SigInvalid; + arena->trace[i].sig = SigInvalid; } LockInit(lock); arena->lock = lock; @@ -334,7 +334,7 @@ void ArenaInit(Arena arena, Lock lock, ArenaClass class) arena->sig = ArenaSig; arena->serial = arenaSerial; /* design.mps.arena.static.serial */ ++arenaSerial; - + AVERT(Arena, arena); } @@ -367,7 +367,7 @@ Res ArenaCreateV(Arena *arenaReturn, ArenaClass class, va_list args) res = (*class->init)(&arena, class, args); if(res != ResOK) goto failInit; - + ArenaEnter(arena); AVERT(Arena, arena); @@ -383,7 +383,7 @@ Res ArenaCreateV(Arena *arenaReturn, ArenaClass class, va_list args) if(res != ResOK) goto failControlInit; arena->poolReady = TRUE; /* design.mps.arena.pool.ready */ - + /* initialize the message stuff, design.mps.message */ { void *v; @@ -671,24 +671,7 @@ void ArenaPoll(Arena arena) arena->insidePoll = TRUE; - /* Poll actions to see if any new action is to be taken. */ - ActionPoll(arena); - - /* Temporary hacky progress control added here and in trace.c */ - /* for change.dylan.honeybee.170466, and substantially modified */ - /* for change.epcore.minnow.160062. */ - if(arena->busyTraces != TraceSetEMPTY) { - Trace trace = ArenaTrace(arena, (TraceId)0); - AVER(arena->busyTraces == TraceSetSingle((TraceId)0)); - TracePoll(trace); - if(trace->state == TraceFINISHED) { - TraceDestroy(trace); - } - } - - size = arena->fillMutatorSize; - arena->pollThreshold = size + ARENA_POLL_MAX; - AVER(arena->pollThreshold > size); /* enough precision? */ + ArenaStep(arena); arena->insidePoll = FALSE; } @@ -730,6 +713,37 @@ void ArenaPark(Arena arena) } +/* Take a single step of any active trace. */ + +void ArenaStep(Arena arena) +{ + TraceId ti; + double size; + + AVERT(Arena, arena); + + /* Poll actions to see if any new action is to be taken. */ + ActionPoll(arena); + + if (arena->busyTraces != TraceSetEMPTY) { + /* Find an active trace to poll. */ + for(ti = 0; ti < TRACE_MAX; ++ti) { + if(TraceSetIsMember(arena->busyTraces, ti)) { + Trace trace = ArenaTrace(arena, ti); + TracePoll(trace); + if(trace->state == TraceFINISHED) + TraceDestroy(trace); + } + } + } + + /* set poll threshold so we don't steal any more mutator time too soon. */ + size = arena->fillMutatorSize; + arena->pollThreshold = size + ARENA_POLL_MAX; + AVER(arena->pollThreshold > size); /* enough precision? */ +} + + Res ArenaCollect(Arena arena) { Trace trace; @@ -797,14 +811,14 @@ Res ArenaDescribe(Arena arena, mps_lib_FILE *stream) return ResFAIL; res = WriteF(stream, - "Arena $P ($U) {\n", + "Arena $P ($U) {\n", (WriteFP)arena, (WriteFU)arena->serial, " class $P (\"$S\")\n", (WriteFP)arena->class, arena->class->name, " mpsVersion $S\n", arena->mpsVersionString, " poolReady $S\n", arena->poolReady ? "YES" : "NO", - " controlPool $P\n", + " controlPool $P\n", (WriteFP)&arena->controlPoolStruct, " lock $P\n", (WriteFP)arena->lock, " pollThreshold $U KB\n", @@ -834,7 +848,7 @@ Res ArenaDescribe(Arena arena, mps_lib_FILE *stream) " rootSerial $U\n", (WriteFU)arena->rootSerial, " formatSerial $U\n", (WriteFU)arena->formatSerial, " threadSerial $U\n", (WriteFU)arena->threadSerial, - " insideShield $S\n", + " insideShield $S\n", arena->insideShield ? "YES" : "NO", " busyTraces $B\n", (WriteFB)arena->busyTraces, " flippedTraces $B\n", (WriteFB)arena->flippedTraces, @@ -855,7 +869,7 @@ Res ArenaDescribe(Arena arena, mps_lib_FILE *stream) if(res != ResOK) return res; } - + res = WriteF(stream, " [note: indices are raw, not rotated]\n" " prehistory = $B\n", (WriteFB)arena->prehistory, @@ -1197,7 +1211,7 @@ Res ArenaExtend(Arena arena, Addr base, Size size) res = (*arena->class->extend)(arena, base, size); if(res != ResOK) return res; - + EVENT_PAW(ArenaExtend, arena, base, size); return ResOK; @@ -1215,7 +1229,7 @@ Res ArenaRetract(Arena arena, Addr base, Size size) res = (*arena->class->retract)(arena, base, size); if(res != ResOK) return res; - + EVENT_PAW(ArenaRetract, arena, base, size); return ResOK; @@ -1475,7 +1489,7 @@ Ref ArenaRead(Arena arena, Addr addr) Seg seg; AVERT(Arena, arena); - + b = SegOfAddr(&seg, arena, addr); AVER(b == TRUE); diff --git a/mps/src/mpm.h b/mps/src/mpm.h index 30d992f9029..f950ef10187 100644 --- a/mps/src/mpm.h +++ b/mps/src/mpm.h @@ -653,6 +653,7 @@ extern void (ArenaPoll)(Arena arena); /* .nogc.why: ScriptWorks doesn't use MM-provided incremental GC, so */ /* doesn't need to poll when allocating. */ +extern void ArenaStep(Arena arena); extern void ArenaClamp(Arena arena); extern void ArenaRelease(Arena arena); extern void ArenaPark(Arena arena); diff --git a/mps/src/mps.h b/mps/src/mps.h index 776cbf67eda..2813165bc33 100644 --- a/mps/src/mps.h +++ b/mps/src/mps.h @@ -238,6 +238,7 @@ extern void mps_arena_clamp(mps_arena_t); extern void mps_arena_release(mps_arena_t); extern void mps_arena_park(mps_arena_t); extern mps_res_t mps_arena_collect(mps_arena_t); +extern void mps_arena_step(mps_arena_t); extern void mps_space_clamp(mps_space_t); extern void mps_space_release(mps_space_t); extern void mps_space_park(mps_space_t); diff --git a/mps/src/mpsi.c b/mps/src/mpsi.c index 3a8a938cd59..1e5392aa4f9 100644 --- a/mps/src/mpsi.c +++ b/mps/src/mpsi.c @@ -99,7 +99,7 @@ static Bool mpsi_check(void) /* The external idea of an address and the internal one */ /* had better match. */ CHECKL(CHECKTYPE(mps_addr_t, Addr)); - + /* The external idea of size and the internal one had */ /* better match. See design.mps.interface.c.cons.size */ /* and design.mps.interface.c.pun.size. */ @@ -273,7 +273,7 @@ size_t mps_arena_commit_limit(mps_arena_t mps_arena) return size; } - + mps_res_t mps_arena_commit_limit_set(mps_arena_t mps_arena, size_t limit) { Res res; @@ -309,6 +309,14 @@ size_t mps_arena_spare_commit_limit(mps_arena_t mps_arena) return limit; } +void mps_arena_step(mps_arena_t mps_arena) +{ + Arena arena = (Arena)mps_arena; + ArenaEnter(arena); + ArenaStep(arena); + ArenaLeave(arena); +} + void mps_arena_clamp(mps_arena_t mps_arena) { Arena arena = (Arena)mps_arena; @@ -323,7 +331,7 @@ void mps_space_clamp(mps_space_t mps_space) mps_arena_clamp(mps_space); } - + void mps_arena_release(mps_arena_t mps_arena) { Arena arena = (Arena)mps_arena; @@ -337,7 +345,7 @@ void mps_space_release(mps_space_t mps_space) { mps_arena_release(mps_space); } - + void mps_arena_park(mps_space_t mps_space) { @@ -369,7 +377,7 @@ mps_res_t mps_space_collect(mps_space_t mps_space) { return mps_arena_collect(mps_space); } - + /* mps_arena_create -- create an arena object */ @@ -574,7 +582,7 @@ void mps_fmt_destroy(mps_fmt_t mps_fmt) { Format format = (Format)mps_fmt; Arena arena; - + AVER(CHECKT(Format, format)); arena = FormatArena(format); @@ -620,7 +628,7 @@ mps_res_t mps_pool_create_v(mps_pool_t *mps_pool_o, res = PoolCreateV(&pool, arena, class, args); ArenaLeave(arena); - + if(res != ResOK) return res; *mps_pool_o = (mps_pool_t)pool; return res; @@ -630,7 +638,7 @@ void mps_pool_destroy(mps_pool_t mps_pool) { Pool pool = (Pool)mps_pool; Arena arena; - + AVER(CHECKT(Pool, pool)); arena = PoolArena(pool); @@ -650,7 +658,7 @@ mps_res_t mps_alloc(mps_addr_t *p_o, mps_pool_t mps_pool, Arena arena; Addr p; Res res; - + AVER(CHECKT(Pool, pool)); arena = PoolArena(pool); @@ -692,7 +700,7 @@ void mps_free(mps_pool_t mps_pool, mps_addr_t p, size_t size) { Pool pool = (Pool)mps_pool; Arena arena; - + AVER(CHECKT(Pool, pool)); arena = PoolArena(pool); @@ -719,7 +727,7 @@ mps_res_t mps_ap_create(mps_ap_t *mps_ap_o, mps_pool_t mps_pool, ...) BufferClass bufclass; Res res; va_list args; - + AVER(mps_ap_o != NULL); AVER(CHECKT(Pool, pool)); arena = PoolArena(pool); @@ -752,7 +760,7 @@ mps_res_t mps_ap_create_v(mps_ap_t *mps_ap_o, mps_pool_t mps_pool, Buffer buf; BufferClass bufclass; Res res; - + AVER(mps_ap_o != NULL); AVER(CHECKT(Pool, pool)); arena = PoolArena(pool); @@ -777,7 +785,7 @@ void mps_ap_destroy(mps_ap_t mps_ap) Buffer buf = BufferOfAP((AP)mps_ap); Arena arena; - AVER(mps_ap != NULL); + AVER(mps_ap != NULL); AVER(CHECKT(Buffer, buf)); arena = BufferArena(buf); @@ -869,7 +877,7 @@ mps_bool_t (mps_commit)(mps_ap_t mps_ap, mps_addr_t p, size_t size) */ mps_res_t (mps_ap_frame_push)(mps_frame_t *frame_o, mps_ap_t mps_ap) { - AVER(frame_o != NULL); + AVER(frame_o != NULL); AVER(mps_ap != NULL); /* Fail if between reserve & commit */ @@ -890,10 +898,10 @@ mps_res_t (mps_ap_frame_push)(mps_frame_t *frame_o, mps_ap_t mps_ap) AVER(CHECKT(Buffer, buf)); arena = BufferArena(buf); - + ArenaEnter(arena); AVERT(Buffer, buf); - + res = BufferFramePush(&frame, buf); if(res == ResOK) { @@ -934,10 +942,10 @@ mps_res_t (mps_ap_frame_pop)(mps_ap_t mps_ap, mps_frame_t frame) AVER(CHECKT(Buffer, buf)); arena = BufferArena(buf); - + ArenaEnter(arena); AVERT(Buffer, buf); - + res = BufferFramePop(buf, (AllocFrame)frame); ArenaLeave(arena); @@ -959,7 +967,7 @@ mps_res_t mps_ap_fill(mps_addr_t *p_o, mps_ap_t mps_ap, size_t size) Addr p; Res res; - AVER(mps_ap != NULL); + AVER(mps_ap != NULL); AVER(CHECKT(Buffer, buf)); arena = BufferArena(buf); @@ -975,7 +983,7 @@ mps_res_t mps_ap_fill(mps_addr_t *p_o, mps_ap_t mps_ap, size_t size) res = BufferFill(&p, buf, size, /* withReservoirPermit */ FALSE); ArenaLeave(arena); - + if(res != ResOK) return res; *p_o = (mps_addr_t)p; return MPS_RES_OK; @@ -991,7 +999,7 @@ mps_res_t mps_ap_fill_with_reservoir_permit(mps_addr_t *p_o, Addr p; Res res; - AVER(mps_ap != NULL); + AVER(mps_ap != NULL); AVER(CHECKT(Buffer, buf)); arena = BufferArena(buf); @@ -1007,7 +1015,7 @@ mps_res_t mps_ap_fill_with_reservoir_permit(mps_addr_t *p_o, res = BufferFill(&p, buf, size, /* withReservoirPermit */ TRUE); ArenaLeave(arena); - + if(res != ResOK) return res; *p_o = (mps_addr_t)p; return MPS_RES_OK; @@ -1026,7 +1034,7 @@ mps_bool_t mps_ap_trip(mps_ap_t mps_ap, mps_addr_t p, size_t size) Arena arena; Bool b; - AVER(mps_ap != NULL); + AVER(mps_ap != NULL); AVER(CHECKT(Buffer, buf)); arena = BufferArena(buf); @@ -1065,7 +1073,7 @@ mps_res_t mps_sac_create(mps_sac_t *mps_sac_o, mps_pool_t mps_pool, res = SACCreate(&sac, pool, (Count)classes_count, classes); ArenaLeave(arena); - + if (res != ResOK) return (mps_res_t)res; *mps_sac_o = (mps_sac_t)ExternalSACOfSAC(sac); return (mps_res_t)res; @@ -1205,7 +1213,7 @@ mps_res_t mps_root_create(mps_root_t *mps_root_o, (RootScanMethod)mps_root_scan, p, s); ArenaLeave(arena); - + if(res != ResOK) return res; *mps_root_o = (mps_root_t)root; return MPS_RES_OK; @@ -1237,7 +1245,7 @@ mps_res_t mps_root_create_table(mps_root_t *mps_root_o, (Addr *)base, (Addr *)base + size); ArenaLeave(arena); - + if(res != ResOK) return res; *mps_root_o = (mps_root_t)root; return MPS_RES_OK; @@ -1270,7 +1278,7 @@ mps_res_t mps_root_create_table_masked(mps_root_t *mps_root_o, mask); ArenaLeave(arena); - + if(res != ResOK) return res; *mps_root_o = (mps_root_t)root; return MPS_RES_OK; @@ -1289,7 +1297,7 @@ mps_res_t mps_root_create_fmt(mps_root_t *mps_root_o, Root root; RootMode mode = (RootMode)mps_rm; Res res; - + ArenaEnter(arena); AVER(mps_root_o != NULL); @@ -1298,7 +1306,7 @@ mps_res_t mps_root_create_fmt(mps_root_t *mps_root_o, (Addr)base, (Addr)limit); ArenaLeave(arena); - + if(res != ResOK) return res; *mps_root_o = (mps_root_t)root; return MPS_RES_OK; @@ -1334,7 +1342,7 @@ mps_res_t mps_root_create_reg(mps_root_t *mps_root_o, reg_scan_p, mps_size); ArenaLeave(arena); - + if(res != ResOK) return res; *mps_root_o = (mps_root_t)root; return MPS_RES_OK; @@ -1361,7 +1369,7 @@ void mps_root_destroy(mps_root_t mps_root) { Root root = (Root)mps_root; Arena arena; - + AVER(CHECKT(Root, root)); arena = RootArena(root); @@ -1401,7 +1409,7 @@ mps_res_t mps_thread_reg(mps_thr_t *mps_thr_o, mps_arena_t mps_arena) res = ThreadRegister(&thread, arena); ArenaLeave(arena); - + if(res != ResOK) return res; *mps_thr_o = (mps_thr_t)thread; return MPS_RES_OK; @@ -1411,7 +1419,7 @@ void mps_thread_dereg(mps_thr_t mps_thr) { Thread thread = (Thread)mps_thr; Arena arena; - + AVER(ThreadCheckSimple(thread)); arena = ThreadArena(thread); @@ -1654,7 +1662,7 @@ void mps_message_finalization_ref(mps_addr_t *mps_addr_return, Ref ref; AVER(mps_addr_return != NULL); - + ArenaEnter(arena); AVERT(Arena, arena);