Title | MPS some internal tests leave arena parked after mps_arena_collect() |
Status | closed |
Priority | nice |
Assigned user | Gareth Rees |
Organization | Ravenbrook |
Description | MPS 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. |
Analysis | RHSK 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 found | unknown |
Evidence | mps/branch/2009-03-31/padding/code/...@169863 |
Observed in | 1.108.0 |
Created by | Richard Kistruck |
Created on | 2010-03-01 16:48:03 |
Last modified by | Gareth Rees |
Last modified on | 2013-03-08 15:25:25 |
History | 2010-03-01 RHSK Created. |
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. |