On Sat, 2009-01-10 at 19:36 +0100, Jürg Billeter wrote:
> On Sat, 2009-01-10 at 13:07 -0500, Yu Feng wrote:
> > On Sat, 2009-01-10 at 18:35 +0100, Jürg Billeter wrote:
> > > Right, but I'm not sure that you need to change anything in the unref
> > > function to get dispose functionality working. Can you explain more
> > > specifically what you can't get working with the current possibilities?
> > >
> >
> > Yes I can do this:
> >
> > class Object {
> > Object ref_to_there;
> > Object ref_to_here;
> > private disposed = false;
> > public virtual void dispose() {
> > /*release references here*/
> > ref_to_there = null;
> > ref_to_here = null;
> > }
> > private void run_dispose() {
> > if(disposed) return;
> > disposed = true;
> > dispose();
> > }
> > public void destroy() {
> > Object holder = this;
> > /*needed if invoked from a weak reference of this*/
> > run_dispose();
> > holder = null;
> > }
> > }
> >
> > Then Object.destroy can be used to manifestly break any cycle
> > references.
> >
> > I was thinking about auto-cycle-breaking but it is unfortunately beyond
> > my knowledge.
>
> Unfortunately, there is no magic trick to break reference cycles
> automatically in a simple way. In general, this requires an additional
> garbage or cycle collector which scans stack and heap.
>
Is it basically to maintain a list of all pointers to the object? With
some extension to vala compiler at AssignmentBinding perhaps we can have
this list at a relatively cheap cost without scanning stacks and heaps.
> Jürg
>
_______________________________________________
Vala-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/vala-list