[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