[Spice-devel] [PATCH] Make sure property notifications are done in the main context

Marc-André Lureau mlureau at redhat.com
Wed Nov 6 16:09:04 PST 2013



----- 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
> 


More information about the Spice-devel mailing list