Re: [Vala] async method and delegate



On Mon, 2011-06-20 at 17:37 -0700, Jim Nelson wrote:
With async, the delegate *is* copied, you just don't see it in the
Vala code.  With an async method, when the thread of execution yields,
the state of the function at that point is stored (copied or ref'd) in
a context structure.  When the thread of execution resumes later, the
state is pulled back out and the function resumes.

Has that any bearing on the bug I mentioned in
my earlier email?
        
        I also get segmentation fault trying to pass
        a closure accessing local variables. The closure
        works if it doesn't access local vars.
        
        e.g.,
          var f = etc;
          async_func ( () => { fn (f);} );
        
        will crash trying to access f. Apparently
        the closure isn't properly constructed.


In the following example, the closure bug doesn't
lead to a crash. But it is apparent in the output.

Expected output:
        hello
        hello
        hello
        bye
        
Actual output:
        hello
        hello
        (null)
        bye

The code:

        public class Foo : Object {
            public delegate void DelegateType ();
        
            async void f3 (DelegateType d) {
                d ();
            }
        
            async void f2 (DelegateType d) {
                d ();
                yield f3 (d);
                d ();      // <----- x local to f1 has gone
                stdout.printf ("bye\n");
            }
        
            void f1 () {
                var x = "hello";
                f2 (() => {stdout.printf ("%s\n", x);});
            }
        
            public static int main(string[] args) {
                var foo = new Foo ();
                foo.f1 ();
                new MainLoop (null, false).run ();
                return 0;
            }
        }

hand
Nor Jaidi Tuah





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