summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirill Moizik <kmoizik@redhat.com>2016-03-08 16:05:56 +0200
committerJonathon Jongsma <jjongsma@redhat.com>2016-03-24 11:00:01 -0500
commit4214e76d2c8cf5f321ae95a1f49d49efe7e10fa3 (patch)
treeba5b4dd7539f3f82834de4340a2f552db4880c8a
parent205e16d6d95e7966fb5ec69990468f748165c779 (diff)
UsbDeviceManager: Track device disconnection operations in progress
During device disconnection, unwanted hotplug events may happen. We need to ignore those therefore we track disconnection operations in progress. See also comment to commit "Do not process USB hotplug events while redirection is in progress" that introduces corresponding filtering out logic. Signed-off-by: Kirill Moizik <kmoizik@redhat.com> Signed-off-by: Dmitry Fleytman <dfleytma@redhat.com> Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
-rw-r--r--src/usb-device-manager.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c
index 312dae7..1147643 100644
--- a/src/usb-device-manager.c
+++ b/src/usb-device-manager.c
@@ -1757,16 +1757,17 @@ void _disconnect_device_async_cb(GObject *gobject,
SpiceUsbredirChannel *channel = SPICE_USBREDIR_CHANNEL(gobject);
GTask *task = user_data;
GError *err = NULL;
-
-#ifdef G_OS_WIN32
disconnect_cb_data *data = g_task_get_task_data(task);
SpiceUsbDeviceManager *self = SPICE_USB_DEVICE_MANAGER(data->self);
+#ifdef G_OS_WIN32
if (self->priv->use_usbclerk) {
_spice_usb_device_manager_uninstall_driver_async(self, data->device);
}
#endif
+ _set_redirecting(self, FALSE);
+
spice_usbredir_channel_disconnect_device_finish(channel, channel_res, &err);
if (err)
g_task_return_error(task, err);
@@ -1793,6 +1794,8 @@ void spice_usb_device_manager_disconnect_device_async(SpiceUsbDeviceManager *sel
SpiceUsbredirChannel *channel;
+ _set_redirecting(self, TRUE);
+
channel = spice_usb_device_manager_get_channel_for_dev(self, device);
nested = g_task_new(G_OBJECT(self), cancellable, callback, user_data);
disconnect_cb_data *data = g_new(disconnect_cb_data, 1);