D Concurrent GC
Steven Schveighoffer
schveiguy at yahoo.com
Wed Sep 15 05:59:14 PDT 2010
On Tue, 14 Sep 2010 19:09:18 -0400, Sean Kelly <sean at invisibleduck.org>
wrote:
> Leandro Lucarella Wrote:
>
>> Not quite ready for prime-time yet, but I think it's in a stage when it
>> could be interesting anyway (at least for developers or people that want
>> to experiment):
>> http://llucax.com.ar/blog/blog/post/-1a4bdfba
>
> Nice work! I've gotten this to compile as the GC for druntime using D2
> but have ran into a snag. I'm using OSX (ie. no usable debug info) but
> near as I can tell the issue is:
>
> private T locked(T, alias Code)()
> {
> if (thread_needLock())
> synchronized (gc.lock) return Code();
> else
> return Code();
> }
>
> void* gc_malloc(size_t size, uint attrs = 0)
> {
> if (size == 0)
> return null;
> return locked!(void*, () {
> assert (Invariant()); scope (exit) assert (Invariant());
> return malloc(size, attrs, null);
> })();
> }
>
> In the code above, it appears that the anonymous delegate being passed
> as an alias to locked() is having its stack data dynamically allocated
> (ie. as a dynamic closure). For normal delegate calls this can be
> avoided by accepting "scope delegate" as the function parameter, but I
> haven't found an analog when using the alias approach. Obviously, what
> happens is that a call to gc_malloc() ends up needing GCed memory, so
> gc_malloc() is recursively called, and on until the stack explodes.
> I'll see if I can come up with a workaround that continues using the
> alias template parameter.
What if you passed it through a scope delegate function?
i.e.
void *lockedproxy(scope void* delegate() dg)
{
return locked!(void *, dg);
}
-Steve
More information about the Digitalmars-d-announce
mailing list