GC removeRange/removeRoot API issue

safety0ff via Digitalmars-d digitalmars-d at puremagic.com
Wed May 7 22:22:57 PDT 2014


I was working on a Treap implementation to accelerate the GC 
add/remove root/range functions when I realised it is not 
specified how multiple calls to addRange with the same parameter 
p (and possibly different size parameter,) should be handled.

Currently the case for add/remove root is if you call addRoot 
with the same parameter N times, then the GC will only stop 
scanning the root once N calls to removeRoot are made.

The current situation for removeRange is different: it assumes 
FiFo order.

For example:

GC.addRange(p, 64);
GC.addRange(p, 32);
GC.addRange(p, 16);

// assumes we want to remove scanning of p[32..64]
GC.removeRange(p);
// assumes we want to remove scanning of p[16..32]
GC.removeRange(p);
// assumes we want to remove scanning of p[0..16]
GC.removeRange(p);

This behaviour seems like it might lead to non-deterministic 
behaviour in a system which relies heavily on this API.

My question is: how should multiple calls to add/remove 
range/root with the same parameter p be handled?

One possibility is to conservatively remove ranges and add 
another removeRange function which takes a size parameter to 
allow non-conservative removal.

Another possibility would be to specify that the stops scanning a 
root/range after the first call to remove root/range (i.e. 
duplicate calls are ignored.) This would be a higher performance 
option but would also cause breakage.

Either way, we should _specify_ how the duplicate call case 
should be handled!
Please discuss!


More information about the Digitalmars-d mailing list