Commit graph

171 commits

Author SHA1 Message Date
Helmut Eller
a06d8bd6b9 Add a pool for ephemerons
Ephemerons solve the key-in-value problem for weak key/value pairs.  It
seems that it's not possible to solve that problem with weak pointers or
finalizers.  Basically we want a weak key/value pair that implements the
rule:

  The value is reachable, if the key is reachable.

The key-in-value problem occurs if all paths to the key go through the
value.  In this situation, the key is considered reachable only if the
value is "externally reachable", i.e. the value is reachable through a
path other than through the weak pair.

Such weak pairs seem to need an extra phase in the GC algorithm.  See
[1] for some variants of the algorithm.

https://www.haible.de/bruno/papers/cs/weak/WeakDatastructures-writeup.html

* mps/code/mpmst.h (SegStruct): Add fields propagationNeeded,
marksChanged, and propagationFinished.
* mps/code/mpmtypes.h (RANK_LIST): Add EPHEMERON rank.
* mps/code/mps.s (mps_rank_ephemeron): New prototype.
* mps/code/mpscawl.h (mps_class_aeph, mps_fix_weak_pair)
(mps_fix_weak_or_pair, mps_fix_weak_and_pair): New prototypes.
* mps/code/mpsi.c (mps_rank_ephemeron): New function.
* mps/code/poolawl.c (AEPHSegStruct, AEPHPoolStruct): New. The
implementation the ephemeron pool.
* mps/code/seg.c (segAbsInit): Initialize propagationNeeded,
marksChanged, and propagationFinished.
* mps/code/trace.c (traceBandRetreat, tracePropagateToLowerRanks)
(moveSegToEndOfGreyRing): New helpers.
(TraceRankForAccess): Handle the RankEPHEMERON.
(traceFindGrey, traceScanSegRes): Add special handling for ephemeron
segments.
* mps/test/function/eph1.c: New test file.
* mps/test/function/eph2.c: New test file.
* mps/test/function/eph3.c: New test file.
* mps/test/function/eph4.c: New test file.
* mps/test/test/testlib/ephfmt.c: New file.
* mps/test/test/testlib/ephfmt.h: New file.
* mps/test/test/testlib/manifest: Add ephfmt.c.
* mps/test/testsets/passing: Include eph{1,2,3,4}.c.
2026-01-23 08:48:40 +01:00
Richard Brooksby
dc27b3a3dc Generalising mps_addr_object, arenaaddrobject, pooladdrobject for pools that do not use segments. 2023-06-07 14:57:55 +01:00
Jonathan Holburn
20f96d80a5 Add implementation of mps_addr_object as implemented by jph on top of branch cet-merge-2 and subsequently became mps-2022. directly fix some whitespace according to c syntax conventions and remove boolean operation on a pointer 2023-05-16 17:26:00 +01:00
Richard Brooksby
787ea7d302 Moving design documentation of signatures to design.mps.sig and updating tagging from code to be consistent. 2023-03-09 09:40:03 +00:00
Bruce Mitchener
0f6e2f7a20 Fix typos. 2023-02-13 23:27:57 +07:00
Gareth Rees
f47c389a52 Fix indentation of second clause of license. 2020-08-30 10:13:06 +01:00
Gareth Rees
af0f431eda Use https: instead of http: when linking to the ravenbrook web site. 2020-08-30 10:13:03 +01:00
Peter Jackson
4de2606846 Publish licence updates in code directory.
Publish minor changes to readme and configure files in main directory.
Main directory and code directory licence texts are now fully updated.

Copied from Perforce
 Change: 196994
2020-06-11 17:05:40 +01:00
Gareth Rees
e410c28276 Change the type of writeff to avoid compiler warnings from gcc 8.
Copied from Perforce
 Change: 196063
2019-03-14 15:17:47 +00:00
Gareth Rees
4eda4e85c7 Use tags with dots; regularize design references from code.
Copied from Perforce
 Change: 195761
2018-11-29 17:12:29 +00:00
Gareth Rees
5ec88060f4 Add source for some of the monitor requirements.
Add missing design cross-references.
Fix typo: "even" for "event".

Copied from Perforce
 Change: 195075
2018-09-16 12:43:46 +01:00
Gareth Rees
d2d2895c03 Catch-up merge from master sources at changelevel 194022 to branch/2018-06-20/monitor.
Copied from Perforce
 Change: 195071
2018-09-15 21:29:28 +01:00
Gareth Rees
0c8dc0dac5 Address issues found in review <https://info.ravenbrook.com/mail/2018/09/13/15-44-23/0/>
Copied from Perforce
 Change: 195057
2018-09-13 16:47:51 +01:00
Gareth Rees
e93f962230 Merge branch/2018-07-09/seg-alloc into the master sources.
Copied from Perforce
 Change: 194690
2018-07-19 06:25:51 +01:00
Gareth Rees
268178f4cf Merge branch 2016-03-27/cbs-tidy into the master sources.
Copied from Perforce
 Change: 194572
2018-07-10 15:31:25 +01:00
Gareth Rees
f3f941284f New bufferfill and bufferempty methods on segments.
Copied from Perforce
 Change: 194568
2018-07-10 15:02:18 +01:00
Gareth Rees
ba03d79694 Catch-up merge from master sources at changelevel 194449 to branch/2018-06-18/mrgseg.
Copied from Perforce
 Change: 194452
2018-07-05 16:22:24 +01:00
Gareth Rees
b30964104a Rename "node" to "rangetree" as suggested in review by gdr <https://info.ravenbrook.com/mail/2018/07/05/10-17-35/0/>
Get Xcode builds working.
Add rangetree.[ch] to the source code index.

Copied from Perforce
 Change: 194434
2018-07-05 12:06:47 +01:00
Gareth Rees
d22656c8c4 Catch-up merge from the master sources at changelevel 194194 to branch/2017-03-04/seg-methods.
Copied from Perforce
 Change: 194267
2018-06-28 13:52:36 +01:00
Gareth Rees
b873c82d99 Use unsigned for rootvar and locusprefkind typedefs.
Copied from Perforce
 Change: 194161
2018-06-26 08:48:31 +01:00
Gareth Rees
01baf3cfda New generic function segflip allows the segment to decide how to handle a trace that’s about to flip.
Copied from Perforce
 Change: 194000
2018-06-20 10:23:16 +01:00
Gareth Rees
52d6325133 New pool method poolsegpoolgen gets the pool generation for a segment. (this allows the segment whiten and reclaim methods not to need to know the pool class.)
Copied from Perforce
 Change: 193084
 ServerID: perforce.ravenbrook.com
2017-03-31 13:28:25 +01:00
Gareth Rees
2a24ad79df Since we know that a segment belongs to a pool with a format at the point where we call segwalk, it makes sense to pass the format.
Copied from Perforce
 Change: 193079
 ServerID: perforce.ravenbrook.com
2017-03-31 09:15:41 +01:00
Gareth Rees
d4a68602ff Changing segnowalk to segtrivwalk avoids the need for attrfmt (now we can walk all segments).
Copied from Perforce
 Change: 193044
 ServerID: perforce.ravenbrook.com
2017-03-30 10:18:22 +01:00
Gareth Rees
2ffd832103 Move access method from pool class to segment class.
Copied from Perforce
 Change: 193039
 ServerID: perforce.ravenbrook.com
2017-03-30 09:55:37 +01:00
Gareth Rees
a400239f7e Move walk method from pool class to segment class.
Copied from Perforce
 Change: 193028
 ServerID: perforce.ravenbrook.com
2017-03-30 08:54:35 +01:00
Gareth Rees
b7a490ae32 Move fix and fixemergency methods from pool class to segment class.
Copied from Perforce
 Change: 193023
 ServerID: perforce.ravenbrook.com
2017-03-30 08:09:14 +01:00
Gareth Rees
00a4ade456 Move scan method from pool class to segment class.
Copied from Perforce
 Change: 193012
 ServerID: perforce.ravenbrook.com
2017-03-29 19:17:17 +01:00
Gareth Rees
db5db0a9f3 Move reclaim method from pool class to segment class.
Copied from Perforce
 Change: 193007
 ServerID: perforce.ravenbrook.com
2017-03-29 17:13:45 +01:00
Gareth Rees
07adf64ebb Move whiten method from pool class to segment class.
Copied from Perforce
 Change: 193002
 ServerID: perforce.ravenbrook.com
2017-03-29 16:22:14 +01:00
Gareth Rees
47a1715c2d Move greyen method from pool class to segment class.
Copied from Perforce
 Change: 192997
 ServerID: perforce.ravenbrook.com
2017-03-29 15:58:32 +01:00
Gareth Rees
1dc5ac742a Move the blacken method from the pool class to the segment class.
Copied from Perforce
 Change: 192994
 ServerID: perforce.ravenbrook.com
2017-03-29 15:32:17 +01:00
Gareth Rees
148f538510 Merge design.mps.class-interface into design.mps.pool (as suggested by pekka p. pirinen on 1999-07-20).
Bring pool class method descriptions up to date.
Document bufferClass, bufferFill, bufferEmpty, totalSize, freeSize methods.
Document generic instance methods at design.mps.protocol.method.

Copied from Perforce
 Change: 192642
 ServerID: perforce.ravenbrook.com
2016-10-19 15:34:35 +01:00
Gareth Rees
79d301f528 Cherry-pick change 192595 from custom/cet/main, removing mps_addr_object. this function failed to solve the problem of decoding the stack on 64-bit windows, because the stack may need to be decoded after an mps assertion failure, in which case the arena lock is held and mps_addr_object cannot be called. we eventually solved the problem in a different way (using mps_arena_postmortem) and mps_addr_object is no longer used.
Copied from Perforce
 Change: 192637
 ServerID: perforce.ravenbrook.com
2016-10-19 14:13:38 +01:00
Gareth Rees
587a3efb20 Remove unused pool class methods tracebegin and traceend.
Remove unused event AMCTraceEnd.
The fixEmergency method must have the same type as the fix method because of how they are used.

Copied from Perforce
 Change: 192636
 ServerID: perforce.ravenbrook.com
2016-10-19 14:07:20 +01:00
Gareth Rees
1b6774b850 Regularize the signature comments, for the benefit of design.mps.sig.test.uniq.
Copied from Perforce
 Change: 192620
 ServerID: perforce.ravenbrook.com
2016-10-18 18:30:50 +01:00
Gareth Rees
bcfbaaf3e4 Initialization and checking of mutatorcontext data structures.
New files prmcix.c and prmcxc.c avoid duplicated code.

Copied from Perforce
 Change: 192562
 ServerID: perforce.ravenbrook.com
2016-10-13 23:13:40 +01:00
Gareth Rees
c35e544d73 Rename mutatorfaultcontext to mutatorcontext because this data structure is not only used to store the context of a fault, but also to store the context of a thread that has been suspended.
Copied from Perforce
 Change: 192523
 ServerID: perforce.ravenbrook.com
2016-10-13 14:23:39 +01:00
Gareth Rees
d8c32f0d3f New functions mps_arena_busy and mps_arena_postmortem, plus test coverage.
Copied from Perforce
 Change: 192247
 ServerID: perforce.ravenbrook.com
2016-09-08 13:55:43 +01:00
Gareth Rees
c07c5d6b8f Catch-up merge from the master sources to branch/2016-04-23/inst-methods.
Copied from Perforce
 Change: 192176
 ServerID: perforce.ravenbrook.com
2016-09-05 15:31:34 +01:00
Richard Brooksby
e26f0b64e5 Replacing segbuffer with version that returns bool and the buffer, and disallowing null to segsetbuffer, adding setunsetbuffer for that case instead.
Copied from Perforce
 Change: 191695
 ServerID: perforce.ravenbrook.com
2016-04-27 15:47:26 +01:00
Richard Brooksby
139c44155b Converting arena finish and describe methods to specialize instfinish and instdescribe.
Copied from Perforce
 Change: 191614
 ServerID: perforce.ravenbrook.com
2016-04-23 16:31:26 +01:00
Richard Brooksby
66f9fe6841 Converting buffer finish and describe methods to specialize instfinish and instdescribe.
Copied from Perforce
 Change: 191608
 ServerID: perforce.ravenbrook.com
2016-04-23 15:37:12 +01:00
Richard Brooksby
9a38cd69db Making describe a method on inst and implementing generic describe for segments.
Copied from Perforce
 Change: 191601
 ServerID: perforce.ravenbrook.com
2016-04-23 15:37:11 +01:00
Richard Brooksby
efb1d94578 Catch-up merge from master sources to branch/2016-04-08/protidying.
Copied from Perforce
 Change: 191471
 ServerID: perforce.ravenbrook.com
2016-04-21 14:46:10 +01:00
Richard Brooksby
c42fc6c016 Responding to review by gdr <https://info.ravenbrook.com/mail/2016/04/21/09-36-07/0/>.
Copied from Perforce
 Change: 191432
 ServerID: perforce.ravenbrook.com
2016-04-21 10:56:35 +01:00
Richard Brooksby
930b6a315b Moving location dependency history into its own structure to reduce arenastruct bloat.
Copied from Perforce
 Change: 191417
 ServerID: perforce.ravenbrook.com
2016-04-21 09:05:34 +01:00
Gareth Rees
10be1ec77f Initialize arena->zoneshift to zoneshiftunset (which is not a valid shift) and modify the arena checking to spot this value. previously a default shift value (namely 20) was used, but this value was bogus as the zone shift is not determined until the class initialization runs.
Copied from Perforce
 Change: 191370
 ServerID: perforce.ravenbrook.com
2016-04-20 15:51:16 +01:00
Richard Brooksby
32250731d7 Avoid using "class" as an identifier, since tools like lldb parse expressions as c++, and it can't be named.
Copied from Perforce
 Change: 191304
 ServerID: perforce.ravenbrook.com
2016-04-19 23:00:02 +01:00
Richard Brooksby
06ef28892a Catch-up merge from master sources to branch/2016-04-08/protidying.
Copied from Perforce
 Change: 191251
 ServerID: perforce.ravenbrook.com
2016-04-19 16:37:51 +01:00