----- Original Message ----- > 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(). ack > --- > 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 > > _______________________________________________ > Spice-devel mailing list > Spice-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/spice-devel > _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel