D2 weak references
Jason House
jason.james.house at gmail.com
Mon Apr 20 13:19:42 PDT 2009
Sean Kelly Wrote:
> == Quote from Jason House (jason.james.house at gmail.com)'s article
> > Jason House Wrote:
> > >
> > > If I understand you correctly, a weak reference library needs to query the GC to see if an object is
> marked for collection. How do I do this?
> > Here's the implementation I'm currently thinking of:
> > weak ref construction:
> > Copy pointer into struct without casting
> > Call rt_attach_dispose_event
> > weak ref dereference:
> > copy value into temp var
> > ** query gc to see if garbage **
> > If not garbage, Recopy value and return
> > If garbage set value = null
> > dispose of weakly referenced obj:
> > set value = null
> > The emphasized line is impossible according to the publicized gc interface. Given the delayed
> finalization, I don't see any way around it.
>
> You're guaranteed that the GC will notify you when it finalizes
> the referenced object, so you shouldn't have to query the GC
> at all. Just copy the reference into a GC-scannable location
> and then if you haven't been notified by the GC that the object
> was finalized the reference is good.
Maybe I misunderstood, but I interpreted earlier discussion in this thread to mean the gc did the following steps:
1. Pause all threads
2. Scan objects to clear marks
3. Scan objects to add marks
4. Resume all threads
5. Scan objects, if no mark then...
5a. Call object finalizer
5b. Free memory for later use
Assuming that is correct, any deref of a weak reference is unsafe between steps 4 and 5a. Even though the object may be valid in that window, there's no guarantee that the reference won't be used after step 5b... This would lead to random behavior and seg faults. No self-respecting weak reference library should allow that to happen.
I hope I got something wrong and weak refs are easier to implement than I'm currently thinking.
More information about the Digitalmars-d
mailing list