MPS issue job002206

TitleMPS some internal tests leave arena parked after mps_arena_collect()
Statusclosed
Prioritynice
Assigned userGareth Rees
OrganizationRavenbrook
DescriptionMPS some internal tests leave arena parked after mps_arena_collect()

(This defect affects only MPS internal tests. MPS clients are not directly affected. However, client code might have a similar defect.)

In some internal MPS tests, after a call to mps_arena_collect() (which parks the arena) there is no call to mps_arena_release(). So the arena remains parked, and no new automatic collections will occur. This is not what the test writers intended.
AnalysisRHSK 2010-03-01

Details of tests affected, and suggested fixes:

mpsicv.c: the second run of allocations will not prompt new automatic collections to occur. Fix: either simply add mps_arena_release(), or reconsider structure and intent of mpsicv.c.

zcoll.c: replace directive "Collect" with "CollPark" and "CollRelease", to make it explicit. Change all current tests to invoke "CollRelease".

zmess.c: this test should run with the arena always clamped. Call mps_arena_clamp() immediately after mps_arena_create().
How foundunknown
Evidencemps/branch/2009-03-31/padding/code/...@169863
Observed in1.108.0
Created byRichard Kistruck
Created on2010-03-01 16:48:03
Last modified byGareth Rees
Last modified on2013-03-08 15:25:25
History2010-03-01 RHSK Created.

Fixes

Change Effect Date User Description
181094 closed 2013-03-08 12:23:44 Gareth Rees Don't accidentally leave the arena in the clamped state after calling mps_arena_collect:
* In mpiscv, release the arena immediately after collecting.
* In zmess, clamp the arena immediately after creating it.
170102 open 2010-03-23 08:31:39 Richard Kistruck    MPS master (integ from br/vmem): simple-chunk-return:

   New method arena->class->compact: ArenaCompact, ArenaTrivCompact, VMCompact [arena.c, arenavm.c, mpm.h, mpmst.h, mpmtypes.h]
   trace.c, arenavm.c:
   - call ArenaCompact() at traceReclaim;
   - also record trace->preTraceArenaReserved, to show pre- and peak-vmem during a collection
   arenavm.c:
   - on VMCompact(), destroy any empty chunks (except the primary);
   - emit VMCompact diag for all client-requested collections, plus any others where chunks were gained or lost during the collection;
   - VMCompact diag shows vmem: pre-collection, peak, amount returned, and final
   - VMCompact diag also shows trace stats: cond, live / % / stuck(pip), notCond
   - M_whole, M_frac: print counts of bytes as Megabytes and thousandths
   (also, in VMArenaFinish, null out arena->primary in VMArenaFinish, so it is not left dangling).
   mpm.c: new "$3" format for 0-padding 3-char-wide field, for thousandths of a MB

   tract.c -- fix ChunkCache defects:
   - previously, if cache is empty (chunkCache->chunk == NULL) then other fields are *undefined*; but code looks at them anyway (!) without first checking chunkCache->chunk;
   - change it (.chunk.empty.fields) so that, if cache is empty, other fields have defined values: cache-using code may look at them, and they are chosen so that no cache hit will occur.
   --> this fixes crashing defect shown by changelist 170072
   - AVERT(ChunkCache) in the many places it should be checked;
   - use AVERT_CRITICAL in ChunkEncache, because it is called by ChunkOfAddr;
   - drop never-read chunkCache->pageTableBase and pageTableLimit fields: they were used for ChunkOfSeg(), back when each SegStruct was actually a PageStruct is some chunk's PageStructTable; see VMArenaChunkOfSeg() in //info.ravenbrook.com/project/mps/branch/2001-08-13/trunk/src/arenavm.c#46
   - there's no need for arena to initialise the chunk cache; this allows en/decache functions to be local to tract.c (ie. declared static)

   zcoll.c:
   How to get rid of all the objects, so full collect really collects all automatic objects:
   - Rootdrop() helps, but we can still retain a 1.2MB object;
   - stackwipe() does not help much -- these unwanted ambig refs are being left on the stack by MPS code that runs between mps_arena_collect and the flip!
   - therefore StackScan(0/1) to destroy stack+reg root before full collect: it's the only way to be sure.
   Reproducibility:
   - give Make() a random? switch, acted on by df() = diversity function, to allow bypass of rnd();
   - ZRndStateSet, to set the seed for rnd()
   Unpark:
   - release after mps_arena_collect (job002206)
   Output:
   - print_M: Megabytes more useful than Mebibytes
   - move printf announcing Destroying arena etc to just before, not just after, we do it.

   testlib.c/h -- Reproducibility:
   - fix rnd_state so a rnd_state getter is possible;
   - testlib.h += rnd_state_t, rnd_state(), rnd_state_set(), rnd_state_set_v2()

   vmix.c: add VM_ix_Create_ok/VM_ix_Destroy diags (note: not in vmw3.c yet)
   trace.c: no newline on "traceFindGrey" diag please
   locus.c: no newline on "condemn gens" diag please
   diag.c: just VMCompact diag
   readme.txt -- update for release.