[Spice-devel] [PATCH v4 12/16] usbredir: Disconnect USB device asynchronously
Dmitry Fleytman
dmitry at daynix.com
Sun Aug 16 05:35:49 PDT 2015
From: Kirill Moizik <kmoizik at redhat.com>
Signed-off-by: Kirill Moizik <kmoizik at redhat.com>
Signed-off-by: Dmitry Fleytman <dfleytma at redhat.com>
---
src/channel-usbredir.c | 43 ++++++++++++++++++++++++++++++++++++-------
src/map-file | 1 +
2 files changed, 37 insertions(+), 7 deletions(-)
diff --git a/src/channel-usbredir.c b/src/channel-usbredir.c
index 7acfa08..9ad198b 100644
--- a/src/channel-usbredir.c
+++ b/src/channel-usbredir.c
@@ -114,20 +114,49 @@ static void spice_usbredir_channel_init(SpiceUsbredirChannel *channel)
}
#ifdef USE_USBREDIR
+typedef struct _reset_cb_data
+{
+ gboolean migrating;
+} reset_cb_data;
+
+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);
+ SpiceUsbredirChannelPrivate *priv = channel->priv;
+ g_mutex_lock(priv->flows_mutex);
+ reset_cb_data *data = user_data;
+
+ 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(spice_channel, data->migrating);
+ g_mutex_unlock(priv->flows_mutex);
+ g_object_unref(result);
+ g_free(data);
+}
+
static void spice_usbredir_channel_reset(SpiceChannel *c, gboolean migrating)
{
SpiceUsbredirChannel *channel = SPICE_USBREDIR_CHANNEL(c);
SpiceUsbredirChannelPrivate *priv = channel->priv;
+ GSimpleAsyncResult *result;
if (priv->host) {
- 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);
+ if (priv->state == STATE_CONNECTED) {
+ reset_cb_data *data = g_new(reset_cb_data,1);
+ data->migrating = migrating;
+ result = g_simple_async_result_new(G_OBJECT(c),
+ _channel_reset_cb, data,
+ spice_usbredir_channel_reset);
+ spice_usbredir_channel_disconnect_device_async(channel, result, NULL);
+ }
+ } else {
+ SPICE_CHANNEL_CLASS(spice_usbredir_channel_parent_class)->channel_reset(c, migrating);
}
- SPICE_CHANNEL_CLASS(spice_usbredir_channel_parent_class)->channel_reset(c, migrating);
}
#endif
diff --git a/src/map-file b/src/map-file
index d5a073f..bae4d37 100644
--- a/src/map-file
+++ b/src/map-file
@@ -121,6 +121,7 @@ spice_usb_device_manager_can_redirect_device;
spice_usb_device_manager_connect_device_async;
spice_usb_device_manager_connect_device_finish;
spice_usb_device_manager_disconnect_device;
+spice_usb_device_manager_disconnect_device_async;
spice_usb_device_manager_get;
spice_usb_device_manager_get_devices;
spice_usb_device_manager_get_devices_with_filter;
--
2.4.3
More information about the Spice-devel
mailing list