Re: [Vala] async method and delegate
- From: Nor Jaidi Tuah <norjaidi tuah ubd edu bn>
- To: <vala-list gnome org>
- Subject: Re: [Vala] async method and delegate
- Date: Tue, 21 Jun 2011 09:27:06 +0800
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]