Weak References

Sean Kelly sean at invisibleduck.org
Thu Aug 7 16:06:05 PDT 2008


== Quote from Bill Baxter (wbaxter at gmail.com)'s article
> On Thu, Aug 7, 2008 at 11:38 PM, Steven Schveighoffer
> <schveiguy at yahoo.com> wrote:
> > "Bill Baxter" wrote
> >> On Thu, Aug 7, 2008 at 8:12 AM, Jason House wrote:
> >>
> >> One possible gotcha that just crossed my mind:  I think the current GC
> >> allocates chunks in an all or nothing manner -- hasPointers is just a
> >> single bit.  So could it be that the fact that all Objects have a
> >> vtable pointer mean that everything in an Object is always treated as
> >> having pointers?
> >
> > At least on Tango, this is not the case:
> >
> > import tango.core.Memory;
> >
> > class X
> > {
> >    int x;
> > }
> >
> > class Y
> > {
> >    int *y;
> > }
> >
> > void main()
> > {
> >    auto n = new X;
> >    assert(GC.getAttr(cast(void*)n) & GC.BlkAttr.NO_SCAN);
> >    auto m = new Y;
> >    assert(!(GC.getAttr(cast(void*)m) & GC.BlkAttr.NO_SCAN));
> > }
> Hmm, yeh I also went looking for the previous discussion on this topic
> and found there that someone had already checked that the GC flag on
> the WeakRef class was getting set properly.
> The only other potential problem I can see is the manipulation of the
> member variable that goes on in the destructor of the WeakRef.  It
> makes the assumption that if the referred object has been collected
> then the notification function will have been called, and thus the
> pointer-as-size_t variable will be null.  But that code is very
> similar to what std.signals does in its destructor.  So if that's the
> source of the bug then it's probably a bug that's in std.signal too.

The last time I tested the WeakRef code the unittest was simply broken
in that it tried something like this:

    WeakRef!(int) r = new int;
    GC.collect();
    assert( r.get() is null );

Problem being that a register still may have a reference to the int value
that the test expected to be collected.  The easiest way around this is to
perform a second "dummy" allocation in hopes that the relevant registers
will be overwritten.  Once I made this change in the WeakRef code the
unittest passed for Tango.


Sean



More information about the Digitalmars-d mailing list