|Title||MPS some internal tests leave arena parked after mps_arena_collect()|
|Assigned user||Gareth Rees|
|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.
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().
|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.|
|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]
- call ArenaCompact() at traceReclaim;
- also record trace->preTraceArenaReserved, to show pre- and peak-vmem during a collection
- 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
- 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)
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.
- give Make() a random? switch, acted on by df() = diversity function, to allow bypass of rnd();
- ZRndStateSet, to set the seed for rnd()
- release after mps_arena_collect (job002206)
- 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.