[Spice-devel] [PATCH spice-gtk v2 12/19] coroutine: reference object when signaling
Marc-André Lureau
marcandre.lureau at redhat.com
Thu Nov 13 15:32:35 PST 2014
Before the signal is actually emitted, the channel may be
released. Let's keep a reference to the object during
the function time, to prevent the object from being destroyed before
calling g_signal_emit() in 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