[D-runtime] [phobos] Fix for array append cache holding data hostage
Steve Schveighoffer
schveiguy at yahoo.com
Wed Dec 29 11:42:51 PST 2010
Well, looks like there is no response to this, I'll commit. I'll warn you
however, that I have not tested on OSX. Linux and Windows both pass unit tests.
-Steve
----- Original Message ----
> From: Steve Schveighoffer <schveiguy at yahoo.com>
> To: Phobos <phobos at puremagic.com>; d-runtime <d-runtime at puremagic.com>
> Sent: Thu, December 23, 2010 4:08:03 PM
> Subject: [phobos] Fix for array append cache holding data hostage
>
> Cross-posting to both phobos and druntime for a wider audience...
>
> For those of you not familiar with how the array appending cache works, it
> essentially caches recent lookups of BlkInfo for non-shared array appends.
>
> What this means is that appending to an unshared array does not have to take
>the
>
> global GC lock, and allows a lookup to happen almost immediately.
>
> One of the things that the cache required was to keep that array in memory.
> Otherwise, there was a possibility that the array would be collected and
> reallocated. An append to such an array would result in the stale cache entry
>
>
> being used as the block info, possibly resulting in the wrong start address,
> wrong size, or wrong flags, all of which could be fatal. A good prior
> discussion for this issue is listed in this bug:
> http://d.puremagic.com/issues/show_bug.cgi?id=3929
>
> In order to solve the problem, I implemented a GC collection hook which runs
> *after* the mark phase, but before all threads are resumed. This hook tests
>all
>
> cache entries to see if any of them are about to be collected. Any entries
> which are not marked (i.e. about to be collected) are removed from the cache.
>
> I also had to do some funky stuff with the cache since TLS data is also
> scanned. So the cache is now in a malloc'd block that is freed on thread exit
>
>
> (and lazily allocated on first append).
>
> One of the best tests that showed this problem (or so I thought) was posted to
>
>
> the newsgroup here:
>http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.learn&article_id=22715
>
>5
>
>
> However, my patch does *not* fix this problem. I've found that the true
>reason
>
> for the memory being held is that other data is pointing at the block. With a
>
>
> 200MB block, this is understandable. In a 4GB address space, that's 1/20 of
>the
>
> valid address space. Any random aligned 4-byte sequence in the stack or TLS
> could point to it and prevent it from being collected.
>
> The really bad thing about this is, once the true pointers to that block are
> gone, it could be lost forever. The stack data which "points" to it may be
>very
>
> high up on the stack, which means it never gets collected. It makes me wonder
>
>
> if we might want to provide an unsafe 'realloc' type function for appending
>that
>
> forcefully frees blocks that were used in an append loop. A 'unique' type
> qualifier could go a long way here.
>
> In any case, I still want to checkin this fix, because it at least removes the
>
>
> cache as a possible culprit (and fixes 3929). I don't want to commit the
>patch
>
> until people here agree on the timing. There is a possibility that it
> introduces memory corruption bugs (this happened the last time I was tinkering
>
>
> with array appending), so I don't want to destabilize everything if there is
> good reason. Given that we just had a release, I think this would be a good
> time to do it. I most likely won't get to it this weekend.
>
> So anyone have any objections to me checking this in?
>
> -Steve
>
>
>
>
> _______________________________________________
> phobos mailing list
> phobos at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/phobos
>
More information about the D-runtime
mailing list