[Spice-devel] [PATCH] Revert "usbredir: Disconnect USB device asynchronously"

Jonathon Jongsma jjongsma at redhat.com
Thu May 10 16:27:44 UTC 2018


On Mon, 2018-05-07 at 17:02 +0800, Qiu Wenbo wrote:
> This reverts commit 9fbf679453d8dbfe797a738cb536136599d7adab.
> 
> In some cases, remote-viewer will exit before the async function run
> in
> another thread finish and USB devices redirected to the VM will not
> "pop up" to
> operation system. For example, a USB disk should be auto mounted
> when remote-viewer exit.

Do you have a reliable way to reproduce this situation?


> 
> Signed-off-by: Qiu Wenbo <qiuwenbo at kylinos.com.cn>
> ---
>  src/channel-usbredir.c | 48 ++++++--------------------------------
> ----
>  1 file changed, 7 insertions(+), 41 deletions(-)
> 
> diff --git a/src/channel-usbredir.c b/src/channel-usbredir.c
> index 0cc5630..34c4679 100644
> --- a/src/channel-usbredir.c
> +++ b/src/channel-usbredir.c
> @@ -121,54 +121,20 @@ static void
> spice_usbredir_channel_init(SpiceUsbredirChannel *channel)
>  }
>  
>  #ifdef USE_USBREDIR
> -
> -static void _channel_reset_finish(SpiceUsbredirChannel *channel)
> -{
> -    SpiceUsbredirChannelPrivate *priv = channel->priv;
> -
> -    spice_usbredir_channel_lock(channel);
> -
> -    usbredirhost_close(priv->host);
> -    priv->host = NULL;
> -
> -    /* Call set_context to re-create the host */
> -    spice_usbredir_channel_set_context(channel, priv->context);
> -
> -    spice_usbredir_channel_unlock(channel);
> -}
> -
> -static void _channel_reset_cb(GObject *gobject,
> -                              GAsyncResult *result,
> -                              gpointer user_data)
> -{
> -    SpiceChannel *spice_channel =  SPICE_CHANNEL(gobject);
> -    SpiceUsbredirChannel *channel =
> SPICE_USBREDIR_CHANNEL(spice_channel);
> -    gboolean migrating = GPOINTER_TO_UINT(user_data);
> -    GError *err = NULL;
> -
> -    _channel_reset_finish(channel);
> -
> -    SPICE_CHANNEL_CLASS(spice_usbredir_channel_parent_class)-
> >channel_reset(spice_channel, migrating);
> -
> -    spice_usbredir_channel_disconnect_device_finish(channel, result,
> &err);
> -    g_object_unref(result);
> -}
> -
>  static void spice_usbredir_channel_reset(SpiceChannel *c, gboolean
> migrating)
>  {
>      SpiceUsbredirChannel *channel = SPICE_USBREDIR_CHANNEL(c);
>      SpiceUsbredirChannelPrivate *priv = channel->priv;
>  
>      if (priv->host) {
> -        if (priv->state == STATE_CONNECTED) {
> -            spice_usbredir_channel_disconnect_device_async(channel,
> NULL,
> -                _channel_reset_cb, GUINT_TO_POINTER(migrating));
> -        } else {
> -            _channel_reset_finish(channel);
> -        }
> -    } else {
> -        SPICE_CHANNEL_CLASS(spice_usbredir_channel_parent_class)-
> >channel_reset(c, migrating);
> +        if (priv->state == STATE_CONNECTED)
> +            spice_usbredir_channel_disconnect_device(channel);
> +        usbredirhost_close(priv->host);
> +        priv->host = NULL;
> +        /* Call set_context to re-create the host */
> +        spice_usbredir_channel_set_context(channel, priv->context);
>      }
> +    SPICE_CHANNEL_CLASS(spice_usbredir_channel_parent_class)-
> >channel_reset(c, migrating);
>  }
>  #endif
>  


More information about the Spice-devel mailing list