[Spice-devel] [PATCH] Make sure property notifications are done in the main context
Jonathon Jongsma
jjongsma at redhat.com
Wed Nov 6 15:26:44 PST 2013
Modify g_object_notify_main_conetxt() to work whether it's called from the main
context or a coroutine context. Change object notify calls in SpiceSession to
use g_object_notify_main_context() instead of g_object_notify().
---
gtk/gio-coroutine.c | 37 ++++++++++++++++++++-----------------
gtk/spice-session.c | 8 ++++----
2 files changed, 24 insertions(+), 21 deletions(-)
diff --git a/gtk/gio-coroutine.c b/gtk/gio-coroutine.c
index 355c75c..dd2b9fc 100644
--- a/gtk/gio-coroutine.c
+++ b/gtk/gio-coroutine.c
@@ -252,21 +252,24 @@ void g_object_notify_main_context(GObject *object,
{
struct signal_data data;
- g_return_if_fail(coroutine_self()->caller);
-
- data.object = object;
- data.caller = coroutine_self();
- data.params = (gpointer)property_name;
- data.notified = FALSE;
-
- g_idle_add(notify_main_context, &data);
-
- /* This switches to the system coroutine context, lets
- * the idle function run to dispatch the signal, and
- * finally returns once complete. ie this is synchronous
- * from the POV of the coroutine despite there being
- * an idle function involved
- */
- coroutine_yield(NULL);
- g_warn_if_fail(data.notified);
+ if (IN_MAIN_CONTEXT) {
+ g_object_notify(object, property_name);
+ } else {
+
+ data.object = object;
+ data.caller = coroutine_self();
+ data.params = (gpointer)property_name;
+ data.notified = FALSE;
+
+ g_idle_add(notify_main_context, &data);
+
+ /* This switches to the system coroutine context, lets
+ * the idle function run to dispatch the signal, and
+ * finally returns once complete. ie this is synchronous
+ * from the POV of the coroutine despite there being
+ * an idle function involved
+ */
+ coroutine_yield(NULL);
+ g_warn_if_fail(data.notified);
+ }
}
diff --git a/gtk/spice-session.c b/gtk/spice-session.c
index 79a13de..bcbba27 100644
--- a/gtk/spice-session.c
+++ b/gtk/spice-session.c
@@ -608,7 +608,7 @@ static void spice_session_set_property(GObject *gobject,
break;
case PROP_READ_ONLY:
s->read_only = g_value_get_boolean(value);
- g_object_notify(gobject, "read-only");
+ g_object_notify_main_context(gobject, "read-only");
break;
case PROP_CACHE_SIZE:
s->images_cache_size = g_value_get_int(value);
@@ -2033,7 +2033,7 @@ void spice_session_set_migration_state(SpiceSession *session, SpiceSessionMigrat
g_return_if_fail(s != NULL);
s->migration_state = state;
- g_object_notify(G_OBJECT(session), "migration-state");
+ g_object_notify_main_context(G_OBJECT(session), "migration-state");
}
G_GNUC_INTERNAL
@@ -2128,7 +2128,7 @@ void spice_session_set_uuid(SpiceSession *session, guint8 uuid[16])
g_return_if_fail(s != NULL);
memcpy(s->uuid, uuid, sizeof(s->uuid));
- g_object_notify(G_OBJECT(session), "uuid");
+ g_object_notify_main_context(G_OBJECT(session), "uuid");
}
G_GNUC_INTERNAL
@@ -2140,7 +2140,7 @@ void spice_session_set_name(SpiceSession *session, const gchar *name)
g_free(s->name);
s->name = g_strdup(name);
- g_object_notify(G_OBJECT(session), "name");
+ g_object_notify_main_context(G_OBJECT(session), "name");
}
G_GNUC_INTERNAL
--
1.8.3.1
More information about the Spice-devel
mailing list