Re: [Vala] calling delegate from async



On Sat, Oct 24, 2009 at 12:59 PM, Jan Hudec <bulb ucw cz> wrote:
On Fri, Oct 23, 2009 at 15:31:53 +0200, pHilipp Zabel wrote:
Hi,

I'd like to call a delegate function from an async function, like this:

class AsyncDelegate {
        delegate void TestFunc ();

        void test_func () {
                print ("delegate\n");
        }

        async void test_async (TestFunc f) {

Can you try it with

   async void test_async (owned TestFunc f) {

?

Thanks, but that doesn't work either.
I filed a bug, details at https://bugzilla.gnome.org/show_bug.cgi?id=599487

The first problem is that the AsyncDelegateTestFunc delegate typedef
in the generated code appears only after the struct
_AsyncDelegateTestAsyncData, in which it is referenced.

The second problem is that the struct _AsyncDelegateTestAsyncData is
missing a GDestroyNotify f_target_destroy_notify member, even after I
add the owned keyword as you suggest.

                print ("async enter\n");
                Idle.add (test_async.callback);
                yield;
                f ();
                print ("async leave\n");
        }

        static int main (string[] args) {
                var loop = new GLib.MainLoop (null, false);
                var app = new AsyncDelegate ();

                app.test_async.begin (app.test_func);
                print ("loop\n");
                loop.run ();

                return 0;
        }
}

But Vala 0.7.7 doesn't like that at all:

** (valac:7627): CRITICAL **: vala_data_type_get_value_owned:
assertion `self != NULL' failed
/home/ph5/vala/async-delegate/async-delegate.vala.c:44: error:
expected specifier-qualifier-list before Б─≤AsyncDelegateTestFuncБ─≥
[...]
Compilation failed: 1 error(s), 0 warning(s)

It can't work with unowned delegate (add 'owned' as mentioned above), because
vala can't guarantee the invocant will be valid by the time the async
function gets to call it.

However, vala should report an understandable error, so filing a bug would be
appropriate.

I see. I filed a second bug for the error messages:
https://bugzilla.gnome.org/show_bug.cgi?id=599488

When I turn test_async into a sync function again, it works just fine.

There the delegate invocant does not get a chance to go away while test_async
runs, so the unowned delegate works fine.

Trying to turn TestFunc into an async delegate function (and call it
with yield f ()) on the other hand, seems to be even more critical:

I don't think async delegates were ever supposed to be supported. Given that
async function is really two functions an async delegate would be pretty
complicated.

Ok, this test was just out of curiosity anyway :)

That said, vala should give some sane error message.

Agreed.

cheers
Philipp



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