[Spice-devel] [PATCH spice-gtk] usbredir: don't use emit_main_context() for non-signal code

Christophe Fergeau cfergeau at redhat.com
Wed Jun 11 06:43:35 PDT 2014


ACK

On Tue, Jun 10, 2014 at 06:10:14PM +0200, Marc-André Lureau wrote:
> The following patch deprecates the signal helper code
> ---
>  gtk/channel-usbredir.c | 49 ++++++++++++++++++++++++-------------------------
>  1 file changed, 24 insertions(+), 25 deletions(-)
> 
> diff --git a/gtk/channel-usbredir.c b/gtk/channel-usbredir.c
> index 239fe12..a52476a 100644
> --- a/gtk/channel-usbredir.c
> +++ b/gtk/channel-usbredir.c
> @@ -577,38 +577,31 @@ static void usbredir_free_lock(void *user_data) {
>  
>  /* --------------------------------------------------------------------- */
>  
> -/* Events to be handled in main context */
> -enum {
> -    DEVICE_ERROR,
> -};
> -
> -struct DEVICE_ERROR {
> +typedef struct device_error_data {
> +    SpiceUsbredirChannel *channel;
>      SpiceUsbDevice *spice_device;
>      GError *error;
> -};
> +    struct coroutine *caller;
> +} device_error_data;
>  
>  /* main context */
> -static void do_emit_main_context(GObject *object, int event, gpointer params)
> +static gboolean device_error(gpointer user_data)
>  {
> -    SpiceUsbredirChannel *channel = SPICE_USBREDIR_CHANNEL(object);
> +    device_error_data *data = user_data;
> +    SpiceUsbredirChannel *channel = data->channel;
>      SpiceUsbredirChannelPrivate *priv = channel->priv;
>  
> -    switch (event) {
> -    case DEVICE_ERROR: {
> -        struct DEVICE_ERROR *p = params;
> -        /* Check that the device has not changed before we manage to run */
> -        if (p->spice_device == priv->spice_device) {
> -            spice_usbredir_channel_disconnect_device(channel);
> -            spice_usb_device_manager_device_error(
> +    /* Check that the device has not changed before we manage to run */
> +    if (data->spice_device == priv->spice_device) {
> +        spice_usbredir_channel_disconnect_device(channel);
> +        spice_usb_device_manager_device_error(
>                  spice_usb_device_manager_get(
>                      spice_channel_get_session(SPICE_CHANNEL(channel)), NULL),
> -                p->spice_device, p->error);
> -        }
> -        break;
> -    }
> -    default:
> -        g_warn_if_reached();
> +                data->spice_device, data->error);
>      }
> +
> +    coroutine_yieldto(data->caller, NULL);
> +    return FALSE;
>  }
>  
>  /* --------------------------------------------------------------------- */
> @@ -626,6 +619,7 @@ static void usbredir_handle_msg(SpiceChannel *c, SpiceMsgIn *in)
>  {
>      SpiceUsbredirChannel *channel = SPICE_USBREDIR_CHANNEL(c);
>      SpiceUsbredirChannelPrivate *priv = channel->priv;
> +    device_error_data data;
>      int r, size;
>      uint8_t *buf;
>  
> @@ -670,9 +664,14 @@ static void usbredir_handle_msg(SpiceChannel *c, SpiceMsgIn *in)
>  
>          CHANNEL_DEBUG(c, "%s", err->message);
>  
> -        spice_device = g_boxed_copy(spice_usb_device_get_type(), spice_device);
> -        emit_main_context(channel, DEVICE_ERROR, spice_device, err);
> -        g_boxed_free(spice_usb_device_get_type(), spice_device);
> +        data.channel = channel;
> +        data.caller = coroutine_self();
> +        data.spice_device = g_boxed_copy(spice_usb_device_get_type(), spice_device);
> +        data.error = err;
> +        g_idle_add(device_error, &data);
> +        coroutine_yield(NULL);
> +
> +        g_boxed_free(spice_usb_device_get_type(), data.spice_device);
>  
>          g_error_free(err);
>      }
> -- 
> 1.9.3
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20140611/d6c4ab67/attachment.sig>


More information about the Spice-devel mailing list