[Spice-devel] [PATCH spice-gtk 11/13] coroutine: reference object when signaling
Christophe Fergeau
cfergeau at redhat.com
Wed Nov 12 09:00:58 PST 2014
Hey,
On Sun, Nov 09, 2014 at 05:31:43PM +0100, Marc-André Lureau wrote:
> Before the signal is acutally emitted, the channel may be
'actually'
> released. Similarly to g_signal_emit, take a reference before yielding
> to main context.
I would drop the "similarly to g_signal_emit" as your purpose is most
likely different. The ref is needed here as the signal emission is
async, so code can run before the signal emission, but g_signal_emit is
synchronous.
I assume the scenario you want to protect against is
- (coroutine context)g_coroutine_signal_emit is called
- the signal emission is scheduled in an idle with g_idle_add
- coroutine_yield() is called
- (main context)code runs which drops the last ref on the channel
- (main context)idle runs and tries to emit the signal
Patch looks good if this is the correct scenario.
Christophe
> ---
> gtk/gio-coroutine.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/gtk/gio-coroutine.c b/gtk/gio-coroutine.c
> index c903bd2..c866e15 100644
> --- a/gtk/gio-coroutine.c
> +++ b/gtk/gio-coroutine.c
> @@ -222,9 +222,11 @@ g_coroutine_signal_emit(gpointer instance, guint signal_id,
> if (coroutine_self_is_main()) {
> g_signal_emit_valist(instance, signal_id, detail, data.var_args);
> } else {
> + g_object_ref(instance);
> g_idle_add(emit_main_context, &data);
> coroutine_yield(NULL);
> g_warn_if_fail(data.notified);
> + g_object_unref(instance);
> }
>
> va_end (data.var_args);
> @@ -253,7 +255,7 @@ void g_coroutine_object_notify(GObject *object,
> g_object_notify(object, property_name);
> } else {
>
> - data.instance = object;
> + data.instance = g_object_ref(object);
> data.caller = coroutine_self();
> data.propname = (gpointer)property_name;
> data.notified = FALSE;
> @@ -268,5 +270,6 @@ void g_coroutine_object_notify(GObject *object,
> */
> coroutine_yield(NULL);
> g_warn_if_fail(data.notified);
> + g_object_unref(object);
> }
> }
> --
> 1.9.3
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20141112/8657498b/attachment.sig>
More information about the Spice-devel
mailing list