D Concurrent GC

Sean Kelly sean at invisibleduck.org
Wed Sep 15 07:26:35 PDT 2010


"Steven Schveighoffer" <schveiguy at yahoo.com> wrote:
> 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);
> }

I could simply change it to a function that accepts a scope delegate. It
just isn't as efficient as the alias approach.  But an indirect call is
pretty small potatoes in this case anyway. I tried this and it worked,
and the I ran into an issue where the object used for the lock
(classinfo for GCLock) was apparently null. I'll look into that today.


More information about the Digitalmars-d-announce mailing list