[Spice-devel] [PATCH spice-gtk 11/13] coroutine: reference object when signaling
Marc-André Lureau
marcandre.lureau at redhat.com
Sun Nov 9 08:31:43 PST 2014
Before the signal is acutally emitted, the channel may be
released. Similarly to g_signal_emit, take a reference before yielding
to main context.
---
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
More information about the Spice-devel
mailing list