12.02.2011 18:44, d coder пишет:
Also tango (for D 1.0) implements it.
Link:
http://www.dsource.org/projects/tango/docs/current/tango.core.WeakRef.html
Might be worth a look if you are going to implement it for D 2.0.
I looked at the D1 implementation. It depends on GC methods
weakPointerCreate and weakPointerDestroy. These functions are
implemented in D1 GC as extern C functions.
It seems most of this code should be directly portable to D2, it would
certainly require changes in the DMD2 source code. I have never worked
at that level and have used D2 only for past couple of months. While I
can give that a blind try, it would be useful only if it gets
excepted in DMD2.
What do you guys suggest?
I remember reading a discussion about weak references some time ago. You
*could* implement them using functions rt_attachDisposeEvent and
rt_detachDisposeEvent, which are extern(C) and declared in object.d
(actually, object_.d of dmd's druntime source), and AFAIR Tango uses
something similar.
Normally, a (hypothetical) WeakRef would nullify the non-GC-scanned
reference in a dispose handler. But there is an issue with this, as
dispose handlers are run *after* the GC resumes all threads, which means
that it is still possible that a WeakRef implementation would supply the
client code a presumably valid reference just before some thread
deletes/clears it - a straight way to AV/segfault. Of course, this is no
problem for single-threaded applications, but then again, weak
references are not that useful in such apps as their usefulness
manifests almost entirely in concurrent code.