1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-03-24 07:41:54 -07:00

Add mps_arena_step().

Copied from Perforce
 Change: 29207
 ServerID: perforce.ravenbrook.com
This commit is contained in:
Nick Barnes 2002-05-15 17:26:44 +01:00
parent e74f101de7
commit bf65f05d74
4 changed files with 89 additions and 65 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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);