Title | Failed shield assertion in finalization tests with deep checking |
Status | closed |
Priority | optional |
Assigned user | Gareth Rees |
Organization | Ravenbrook |
Description | If you run any test case that uses finalization with deep checking turned on, for example: make -f xci6ll.gmk clean && make -f xci6ll.gmk VARIETY=cool "CFLAGS=-DCHECKLEVEL=CheckLevelDEEP" finalcv && ./xci6ll/cool/finalcv then you get the assertion failure: shield->unsynced == 0 || shield->suspended |
Analysis | The backtrace shows the following call sequence: shieldQueue ShieldRaise gcSegSetRankSet SegSetRankSet MRGRefSegInit SegInit SegAlloc MRGSegPairCreate MRGRegister ArenaFinalize There are two problems here: 1. Memory managed by the MRG pool class is not available to the mutator: it is only used internally, to contain finalization guardians. This means that it does not need to use the hardware write barrier: the MPS could ensure that it is used correctly. So there is needless work being done here fiddling with the write protection on MRG segments. This is because MRG's segments inherit from GCSeg (so that they can be condemned, scanned, etc.). But GCSeg implements collectable segments that might be handed out to the mutator and so need to have write protection to maintain the remembered set. If we had a finer-grained segment hierarchy, so that there were GCSeg implementing collection, and MutatorGCSeg inheriting from GCSeg and adding write protection, then MRG could use the plain GCSeg and maintain the summary "by hand" using ArenaPoke. See job004072. 2. The MPS is in MRGRefSegInit and so the segment is fresh and so we know statically that the mutator does not have a reference to the segment and so knows that it is fine to call ShieldRaise without suspending the mutator. But the shield has no representation of the concept of "segment is protected because its address has never been given to the mutator", and so the checks cannot take this into account. |
How found | automated_test |
Evidence | None as yet. |
Created by | Gareth Rees |
Created on | 2016-05-03 17:40:47 |
Last modified by | Gareth Rees |
Last modified on | 2018-07-05 16:29:17 |
History | 2016-05-03 GDR Created. |
Change | Effect | Date | User | Description |
---|---|---|---|---|
194453 | closed | 2018-07-05 16:28:15 | Gareth Rees | Merge branch/2018-06-18/mrgseg into the master sources. |