diff --git a/mps/code/chain.h b/mps/code/chain.h index e47f8000c0b..d3df265a0f2 100644 --- a/mps/code/chain.h +++ b/mps/code/chain.h @@ -74,6 +74,8 @@ typedef struct mps_chain_s { } ChainStruct; +extern Res GenDescDescribe(GenDesc gen, mps_lib_FILE *stream); + extern Res ChainCreate(Chain *chainReturn, Arena arena, size_t genCount, GenParamStruct *params); extern void ChainDestroy(Chain chain); @@ -88,12 +90,14 @@ extern size_t ChainGens(Chain chain); extern Res ChainAlloc(Seg *segReturn, Chain chain, Serial genNr, SegClass class, Size size, Pool pool, Bool withReservoirPermit, ArgList args); +extern Res ChainDescribe(Chain chain, mps_lib_FILE *stream); extern Bool PoolGenCheck(PoolGen gen); extern Res PoolGenInit(PoolGen gen, Chain chain, Serial nr, Pool pool); extern void PoolGenFinish(PoolGen gen); extern void PoolGenFlip(PoolGen gen); #define PoolGenNr(gen) ((gen)->nr) +extern Res PoolGenDescribe(PoolGen gen, mps_lib_FILE *stream); #endif /* chain_h */ diff --git a/mps/code/global.c b/mps/code/global.c index d9820e19981..3cb232124fd 100644 --- a/mps/code/global.c +++ b/mps/code/global.c @@ -1120,6 +1120,12 @@ Res GlobalsDescribe(Globals arenaGlobals, mps_lib_FILE *stream) if (res != ResOK) return res; } + RING_FOR(node, &arena->chainRing, nextNode) { + Chain chain = RING_ELT(Chain, chainRing, node); + res = ChainDescribe(chain, stream); + if (res != ResOK) return res; + } + TRACE_SET_ITER(ti, trace, TraceSetUNIV, arena) if (TraceSetIsMember(arena->busyTraces, trace)) { res = TraceDescribe(trace, stream); diff --git a/mps/code/locus.c b/mps/code/locus.c index a704c8b820b..f90e146f675 100644 --- a/mps/code/locus.c +++ b/mps/code/locus.c @@ -126,6 +126,36 @@ static Size GenDescTotalSize(GenDesc gen) } +/* GenDescDescribe -- describe a generation in a chain */ + +Res GenDescDescribe(GenDesc gen, mps_lib_FILE *stream) +{ + Res res; + Ring node, nextNode; + + if (!TESTT(GenDesc, gen)) return ResFAIL; + if (stream == NULL) return ResFAIL; + + res = WriteF(stream, + "GenDesc $P {\n", (WriteFP)gen, + "zones $B\n", (WriteFB)gen->zones, + "capacity $U\n", (WriteFU)gen->capacity, + "mortality $D\n", (WriteFD)gen->mortality, + "proflow $D\n", (WriteFD)gen->proflow, + NULL); + if (res != ResOK) return res; + + RING_FOR(node, &gen->locusRing, nextNode) { + PoolGen pgen = RING_ELT(PoolGen, genRing, node); + res = PoolGenDescribe(pgen, stream); + if (res != ResOK) return res; + } + + res = WriteF(stream, "} GenDesc $P\n", (WriteFP)gen, NULL); + return res; +} + + /* ChainCreate -- create a generation chain */ Res ChainCreate(Chain *chainReturn, Arena arena, size_t genCount, @@ -411,6 +441,35 @@ void ChainEndGC(Chain chain, Trace trace) } +/* ChainDescribe -- describe a chain */ + +Res ChainDescribe(Chain chain, mps_lib_FILE *stream) +{ + Res res; + size_t i; + + if (!TESTT(Chain, chain)) return ResFAIL; + if (stream == NULL) return ResFAIL; + + res = WriteF(stream, + "Chain $P {\n", (WriteFP)chain, + "arena $P\n", (WriteFP)chain->arena, + "activeTraces $B\n", (WriteFB)chain->activeTraces, + NULL); + if (res != ResOK) return res; + + for (i = 0; i < chain->genCount; ++i) { + res = GenDescDescribe(&chain->gens[i], stream); + if (res != ResOK) return res; + } + + res = WriteF(stream, + "} Chain $P\n", (WriteFP)chain, + NULL); + return res; +} + + /* PoolGenInit -- initialize a PoolGen */ Res PoolGenInit(PoolGen gen, Chain chain, Serial nr, Pool pool) @@ -464,6 +523,30 @@ Bool PoolGenCheck(PoolGen gen) } +/* PoolGenDescribe -- describe a PoolGen */ + +Res PoolGenDescribe(PoolGen pgen, mps_lib_FILE *stream) +{ + Res res; + + if (!TESTT(PoolGen, pgen)) return ResFAIL; + if (stream == NULL) return ResFAIL; + + res = WriteF(stream, + "PoolGen $P ($U) {\n", (WriteFP)pgen, (WriteFU)pgen->nr, + "pool $P ($U) \"$S\"\n", + (WriteFP)pgen->pool, (WriteFU)pgen->pool->serial, + (WriteFS)pgen->pool->class->name, + "chain $P\n", (WriteFP)pgen->chain, + "totalSize $U\n", (WriteFU)pgen->totalSize, + "newSize $U\n", (WriteFU)pgen->newSize, + "newSizeAtCreate $U\n", (WriteFU)pgen->newSizeAtCreate, + "} PoolGen $P\n", (WriteFP)pgen, + NULL); + return res; +} + + /* LocusInit -- initialize the locus module */ void LocusInit(Arena arena)