[Vala] object leak in async and closure



Hi, I'm new in this mailing list and quite new in vala programming.

I have a big software that somethime leak objct. Now I have replicate the
issue with a small code:

############################################################################
    class Pippo: Object {
        public async void foo () {
            Object o = new Object ();
            stdout.printf("out-- %u\n",o.ref_count);
            stdout.printf("this -- %u\n",this.ref_count);

            SourceFunc f = () => {
                stdout.printf("infunc-- %u\n",o.ref_count);
                stdout.printf("in this -- %u\n",this.ref_count);
                //this.unref();
                stdout.printf("in this -- %u\n",this.ref_count);
                stdout.printf("end function f\n");
                return false;
            };
            GLib.Idle.add( (owned) f );

            stdout.printf("end function foo\n");
        }

        ~Pippo() {
            stdout.printf("destroy pippo\n");
        }
    }

    void main() {
        Pippo ? tmp = new Pippo();

        tmp.foo.begin();

        MainLoop loop = new MainLoop ();

        GLib.Timeout.add(1000, () => {stdout.printf("timeout1\n"); tmp =
null; return false;});

        GLib.Timeout.add(2000, () => {stdout.printf("timeout2\n");
loop.quit(); return false;});


        loop.run ();
}

############################################################################

If in the function
SourceFunc f

there is any reference to any variable of foo or to any object of this we
have the reference counting of this increase.

and so after timeout1 the object tmp is not destroy. (And there is no
reference on it)

The only way to fix the issue is to manually decrease the reference of
this. But this is a big workaraound.

Someone have any idea where is my fault or if there is a bug in vala itself?

regards


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]