Fiber local GC

Ola Fosheim Grøstad via Digitalmars-d digitalmars-d at puremagic.com
Sat Jun 25 04:55:10 PDT 2016


On Saturday, 25 June 2016 at 11:37:44 UTC, rikki cattermole wrote:
> I've thought about this further, the only hook function we 
> don't currently have is related to global + TLS assignment for 
> memory.
> We can get away with e.g. new overriding and ~ via the GC proxy 
> (actually a fairly decent way to go about it).
>
> Since this assignment hook is potentially quite expensive, it 
> definitely should be only if used under whatever attribute we 
> use.

I think the basic idea would be that the fiber heap is presumed 
to work like a region allocator that is never collected, except 
when you run low on memory, then you scan only the fiber-local 
memory (and since it is local you could possibly also compact).

So:
1. References to the fiber heap can only be made from the same 
fiber heap or the fiber stack.

2. You can hand out borrowed fiber-references to the fiber heap 
when calling non-fiber functions, but fiber-references can never 
be turned into non-fiber references.

3. Aggregates (structs/classes/arrays) that can contain 
fiber-references are tainted as fiber-local and cannot leave the 
fiber.

Then you need a mechanism that transitively converts fiber-local 
data into non-fiber-local data. This can be done as either:

1. Deep copy.

2. Traverse-and-pin-memory-as-exported, then reinterpret cast 
into non-fiber-local types.

3. Optimization: a priori detected as non-fiber-local using 
static analysis and allocated in a separate heap and then 
reinterpret casted into non-fiber-local before being exported 
outside the fiber.

Memory outside the fiber can use regular reference-counting.

Of course, this could also be generalized to something that would 
not only work for fibers, but also for stack-less contexts such 
as a facade to a global graph that is only collectible at 
specific points in the code. So you collect only where there are 
no external references to internal nodes (or use 
reference-counted pinning for exports).

A fiber-local heap would be a special case where the fiber-stack 
is part of the fiber-local heap.

I think this might work. The assumption is that GC is most useful 
in a singular execution context and that more manual management 
(like reference counting) is acceptable between execution 
contexts.




More information about the Digitalmars-d mailing list