Weak references.

Sean Kelly sean at invisibleduck.org
Sun Apr 13 09:39:30 PDT 2008


== Quote from Jarrett Billingsley (kb3ctd2 at yahoo.com)'s article
> "Jarrett Billingsley" <kb3ctd2 at yahoo.com> wrote in message
> news:ftr9as$12s2$1 at digitalmars.com...
> > I've been looking at some of my old nonagon code, and as I'm sure you've
> > all experienced looking at your old code, I'm just _cringing_ at some of
> > the things I did in it ;)
> >
> > One thing that I've noticed would be nice to have, however, would be weak
> > references to some objects.  For example, I have "brush" objects which
> > encapsulate a bunch of visual settings (textures, material, blending modes
> > etc.).  These are referenced by objects that can be rendered.  Some of
> > these brushes need to be updated often (i.e. every frame to update the
> > environment mapping matrices).  So I keep a list (table) of all instances
> > of this brush class so I can easily loop through them and update them all.
> >
> > However when their owners disappear, I end up with uncollectable brushes,
> > since they are still being referenced by that table.
> >
> > So what would be nice to have happen would be to have that table be a
> > table of _weak references_ to brush objects.  Then, when no more real
> > references existed, they could be collected, and I wouldn't be keeping
> > them around for no reason anymore.
> >
> > I've looked into the scrapple weakref implementation, but it doesn't seem
> > to do what I want.  Seemingly it only works if the object that it
> > references is explicitly deleted.  I want the weakref to become null if
> > the object that it references is collected in any way.
> >
> > Is this possible at all?  Am I just not using Bill's weakref properly?
> To both: yes, that's what I would have expected, but I can't seem to get the
> object to be collected even if the only reference to it is a weak reference.
> Tried forcing a full collect, allocating bunches of memory, collecting
> again, allocating at the beginning of a long-running program etc.  it never
> seems to get collected, even if I never assign the reference into an actual
> pointer type.
> I'm using Tango if it makes any difference.

Are these tables AAs?  And how do the weak references store their reference?
The type information provided to AAs is a bit weak, and so some non-pointer
data is currently still scanned by the GC.  I'm going to improve this a bit in the
next Tango release, but it still won't be perfect (because the compiler doesn't
provide enough info for it to be).


Sean



More information about the Digitalmars-d mailing list