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:
parent
e74f101de7
commit
bf65f05d74
4 changed files with 89 additions and 65 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue