Re: [Vala] calling delegate from async



On Sat, Oct 24, 2009 at 4:44 PM, pHilipp Zabel <philipp zabel gmail com> wrote:
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.

With Jürg's help I came up with a patch
(http://bugzilla-attachments.gnome.org/attachment.cgi?id=146187) that
fixes both problems.

I still get the critical error message, though:

** (valac:1106): CRITICAL **: vala_data_type_get_value_owned: assertion `self
!= NULL' failed

Any idea where this is coming from?

                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

And for this one I've got a patch proposal, too:
http://bugzilla-attachments.gnome.org/attachment.cgi?id=146188

regards
Philipp



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