Short list with things to finish for D2

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Thu Nov 19 09:30:52 PST 2009


Steven Schveighoffer wrote:
> On Thu, 19 Nov 2009 12:01:25 -0500, dsimcha <dsimcha at yahoo.com> wrote:
> 
>> == Quote from Andrei Alexandrescu (SeeWebsiteForEmail at erdani.org)'s 
>> article
>>> dsimcha wrote:
>>> > == Quote from Andrei Alexandrescu (SeeWebsiteForEmail at erdani.org)'s 
>>> article
>>> >> Yes, it will be because the book has a few failing unittests. In 
>>> fact, I
>>> >> was hoping I could talk you or David into doing it :o).
>>> >> Andrei
>>> >
>>> > Unfortunately, I've come to hate the MRU idea because it would fail 
>>> miserably for
>>> > large arrays.  I've explained this before, but not particularly 
>>> thoroughly, so
>>> > I'll try to explain it more thoroughly here.  Let's say you have an 
>>> array that
>>> > takes up more than half of the total memory you are using.  You try 
>>> to append to
>>> > it and:
>>> >
>>> > 1.  The GC runs.  The MRU cache is therefore cleared.
>>> >
>>> > 2.  Your append succeeds, but the array is reallocated.
>>> >
>>> > 3.  You try to append again.  Now, because you have a huge piece of 
>>> garbage that
>>> > you just created by reallocating on the last append, the GC needs 
>>> to run again.
>>> > The MRU cache is cleared again.
>>> >
>>> > 4.  Goto 2.
>>> This is not a matter of principles, but one of implementation. When you
>>> GC, you can adjust the cache instead of clearing it.
>>
>> Technically true, but what is a matter of principles is whether the 
>> implementation
>> of arrays should be very tightly coupled to the implementation of the 
>> GC.  Fixing
>> this issue would have massive ripple effects throughout the already 
>> spaghetti
>> code-like GC, and might affect GC performance.  For every single 
>> object the GC
>> freed, it would have to look through the MRU cache and remove it from 
>> there if
>> present, too.
> 
> You perform the lookup via MRU cache (after mark, before sweep).  I see 
> it as a single function call at the right place in the GC.
> 
>> The point is that this **can** be done, but we probably don't **want** to
>> introduce this kind of coupling, especially if we want our GC model to 
>> be sane
>> enough that people might actually come along and write us a better GC 
>> one day.
> 
> What about implementing it as a hook "do this between mark and sweep"?  
> Then it becomes decoupled from the GC.
> 
> -Steve

I think these are great ideas, but you'd need to transport certain 
information to the cache so it can adjust its pointers. Anyhow, I 
believe this is worth exploring because it can help with a great many 
other things such as weak pointers and similar checks and adjustments 
(there was a paper on GC assertions that I don't have time to dig right 
now. Aw what the heck, found it:

http://www.eecs.tufts.edu/~eaftan/gcassertions-mspc-2008.pdf


Andrei



More information about the Digitalmars-d mailing list