Part of the reason I wrote it and made it available was to serve as a focal point for such critiques. If you think it doesn't work and can fix it, please do so!
--bb On Mon, Mar 30, 2009 at 7:00 AM, grauzone <n...@example.net> wrote: > Jarrett Billingsley wrote: >> >> On Sun, Mar 29, 2009 at 4:42 PM, Leandro Lucarella <llu...@gmail.com> >> wrote: >>> >>> This was discussed several times in the past. For example: >>> >>> http://www.digitalmars.com/d/archives/digitalmars/D/learn/weak_references_13301.html >>> >>> http://www.digitalmars.com/d/archives/digitalmars/D/learn/Soft_weak_references_8264.html >>> >>> http://www.digitalmars.com/d/archives/digitalmars/D/announce/ANN_WeakObjectReference_-_class_to_hold_weak_references_9103.html >>> etc. >>> >>> I hope it helps. >> >> The one provided by Bill: >> >> http://www.dsource.org/projects/scrapple/browser/trunk/weakref >> >> seems to work fine, and has the advantage of working in both Phobos and >> Tango. > > First, I doubt this actually works. The WeakRef stores the pointer as > size_t, but the GC is conservative and will still recognize the size_t as a > pointer. The unittest in the existing code only works, because he uses an > explicit delete on the referenced object. > > To actually hide the pointer from the GC, you could XOR the size_t value > with a constant. Note that you need to be very careful with the > WeakRef.ptr() function: what happens, if the GC invalidates the object, and > then the user calls ptr() in parallel, before the GC calls > rt_detachDisposeEvent()? The user will get an invalid pointer. As far as I > remember, rt_detachDisposeEvent() is supposed to be called when all threads > have been resumed (after a collect() run). This is to avoid deadlocks if the > dispose handler locks something. > > Secondly, this should be extended by a ReferenceQueue (like in Java). As > soon as the object referenced by the WeakRef is collected, it is added to > the ReferenceQueue associated with the WeakRef. (In Java, > ReferenceQueue.remove() also provides a roundabout way to notify the program > when a reference has been collected.) > > And finally: why is this thing not in Tango? > > Maybe a Tango dev could comment on this and the correctness issues mentioned > above? >