On 20 November 2010 20:59, James Moschou <[email protected]> wrote:
>> You can attach the .callback to any event source in the same way. So e.g.
>> when data arrive from the process or the child terminates etc.
>
>> But it's easy to wrap it in one. Just spawn_async_with_pipes and arrange the
>> .callback to be called when results are available and yield.
>
> I think I got this working, it's compiling OK and it runs as expected
> up until the last task is completed. But then it segfaults on some of
> the generated C code. I'll try and make a test case later, as the
> actual code is fairly convoluted.
>
> Cheers
> James
>

Here's an incredibly pared back version of what I have:


class Task : Object {
    Pid _pid;
    Source _source;
    public async void run_async () {
        try {
            Process.spawn_async_with_pipes (null,
                                            {"whois", "www.google.com"},
                                            null,
                                            SpawnFlags.SEARCH_PATH |
SpawnFlags.DO_NOT_REAP_CHILD,
                                            null,
                                            out _pid,
                                            null,
                                            null,
                                            null);

            _source = new GLibFixes.ChildWatchSource (_pid);
            _source.attach (null);
            _source.set_callback (run_async.callback);
            yield;
        }
        catch (Error error) {
            stderr.printf ("%s\n", error.message);
        }
        Process.close_pid (_pid);
    }
}

int main (string[] args) {
    Task task = new Task ();
    task.run_async.begin ();

    new MainLoop ().run ();
    return 0;
}


There's a problem one of the GLib bindings so you also need:

[CCode (cprefix = "G", lower_case_cprefix = "g_", cheader_filename =
"glib.h", gir_namespace = "GLib", gir_version = "2.0")]
namespace GLibFixes {
        public class ChildWatchSource : GLib.Source {
                public ChildWatchSource (GLib.Pid pid);
        }
}


Compile with:

valac test.vala fixes.vapi --pkg gio-2.0


It executes the process normally, but then segfaults. I'm not sure if
I'm attaching the callback properly.

Cheers
James
_______________________________________________
vala-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/vala-list

Reply via email to