std.allocator: primitives for helping GC
via Digitalmars-d
digitalmars-d at puremagic.com
Thu May 1 08:00:40 PDT 2014
On Thursday, 1 May 2014 at 04:06:02 UTC, Andrei Alexandrescu
wrote:
> So far allocators have been quite GC-agnostic; deallocation
> would be needed for each allocation, and there was little
> structure to help tracing.
>
> The primitive resolveInternalPointer has made a step toward
> more precise structuring of heaps, and now it's time to look at
> some real GC helpers.
>
> These are markAllAsUnused, markAsUsed, and doneMarking. Find
> their description here:
>
> http://erdani.com/d/phobos-prerelease/std_allocator.html
>
> There are a few proof of concept implementations here:
>
> https://github.com/andralex/phobos/blob/allocator/std/allocator.d
>
> The basic idea is that the GC would initiate a collection by
> calling markAllAsUnused. That would cause the underlying
> untyped allocator to softly mark all memory as free, but
> without actually messing it up. (Many allocators are capable of
> implementing such a primitive cheaply.)
>
> Then, the GC would trace objects starting from roots. Whenever
> it finds a used pointer, it would mark the corresponding memory
> as allocated by using markAsUsed, effectively undoing the soft
> freeing for it.
>
> At the end of the process, what's left is the memory
> effectively in use. Everything else got free by construction.
>
> It seems to me that these three primitives (together with
> resolveInternalPointer) are sufficient for conservative
> tracing. I plan to make tracing more precise by adding more
> structure, but the scanning logic will stay the same.
>
> Now is the time to destroy. I might be missing something by a
> mile.
This marking will usually be implemented by setting a flag near
the memory in question, which is not COW and cache friendly,
because it tends to write all over the place.
For this reason, some GCs use a temporary bitmap for marking, and
leave the marked memory untouched. By pushing the marking to the
specific allocators, this can no longer be implemented globally.
But I guess a GC is not required to use these helper functions,
so I guess it's fine...
And just to be sure: doneMarking is _not_ supposed to actually
free the memory (and call the destructors), is it? That's still
the GC's job, right?
More information about the Digitalmars-d
mailing list