Re: [PATCH] Marginally simplify the code to create and run a GMainLoop

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

 



Hey,

Sorry for the late response.

On Tue, Feb 07, 2017 at 06:03:53PM +0100, Christophe Fergeau wrote:
> Hey, looking for example at osinfo_install_script_generate(), which is
> 
>     GMainLoop *loop = g_main_loop_new(g_main_context_get_thread_default(),
>                                       TRUE);
>     OsinfoInstallScriptGenerateSyncData data = {
>         loop, NULL, NULL, NULL
>     };
> 
>     osinfo_install_script_generate_async(script,
>                                          os,
>                                          config,
>                                          cancellable,
>                                          osinfo_install_script_generate_done,
>                                          &data);
> 
>     if (g_main_loop_is_running(loop))
>         g_main_loop_run(loop);
> 
> Isn't the way it's currently done going to catch cases when
> osinfo_install_script_generate_done (and thus g_main_loop_quit()) ends up
> being called synchronously at the moment
> osinfo_install_script_generate_async() is called, while with your change,
> we'd wait forever for a g_main_loop_quit() which never comes?

Generally, I wouldn't expect an async operation to invoke the callback
in the same iteration of the GMainLoop. Otherwise, it will be
confusing for the user code. It wouldn't know if the async operation
will actually proceed to some extent and then return in a later
iteration of the GMainLoop, or whether it would take a short cut and
return immediately.

I don't see it clearly specified in the semantics of GAsyncResult
interface, but the GTask implmentation used in libosinfo guarantees
this. See the private g_task_return in gio/gtask.c.

The earlier GSimpleAsyncResult was a bit lax in this area, but if you
look closely, the g_simple_async_report_* methods also invoked the
callback in the next iteration of the GMainLoop. One of the
motivations to return immediately are error conditions detected at the
beginning, which is what those methods usually deal with.

By the way, this patch is just a clean-up and hence not that
important.  The real bug in libosinfo is that the synchronous
operations implemented in terms of their async counterparts are not
wrapped in a new thread-default GMainContext. Since the GMainLoop is
iterating over the thread's existing default GMainContext, it can
trigger GSources outside the scope of the synchronous method.

Cheers,
Rishi

_______________________________________________
Libosinfo mailing list
Libosinfo@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libosinfo



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Fedora Users]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]

  Powered by Linux