[Spice-devel] [PATCH v4 08/16] UsbDevicemanager: Track device redirection operations in progress
Dmitry Fleytman
dmitry at daynix.com
Thu Oct 29 07:51:06 PDT 2015
> On 22 Sep 2015, at 19:14 PM, Christophe Fergeau <cfergeau at redhat.com> wrote:
>
> On Sun, Aug 16, 2015 at 03:35:45PM +0300, Dmitry Fleytman wrote:
>> 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/usb-device-manager.c | 71 ++++++++++++++++++++++++++++++++++++++++++------
>> 1 file changed, 62 insertions(+), 9 deletions(-)
>>
>> diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c
>> index af2c87a..f133907 100644
>> --- a/src/usb-device-manager.c
>> +++ b/src/usb-device-manager.c
>> @@ -122,6 +122,7 @@ struct _SpiceUsbDeviceManagerPrivate {
>> GUdevClient *udev;
>> libusb_device **coldplug_list; /* Avoid needless reprobing during init */
>> #else
>> + gboolean redirecting;
>> libusb_hotplug_callback_handle hp_handle;
>> #endif
>> #ifdef G_OS_WIN32
>> @@ -205,10 +206,25 @@ _spice_usb_device_manager_connect_device_async(SpiceUsbDeviceManager *self,
>> GAsyncReadyCallback callback,
>> gpointer user_data);
>>
>> +static
>> +void _connect_device_async_cb(GObject *gobject,
>> + GAsyncResult *channel_res,
>> + gpointer user_data);
>> +
>> G_DEFINE_BOXED_TYPE(SpiceUsbDevice, spice_usb_device,
>> (GBoxedCopyFunc)spice_usb_device_ref,
>> (GBoxedFreeFunc)spice_usb_device_unref)
>>
>> +static void
>> +_set_redirecting(SpiceUsbDeviceManager *self, gboolean is_redirecting)
>> +{
>> +#ifdef USE_GUDEV
>> + g_object_set(self->priv->udev, "redirecting", is_redirecting, NULL);
>> +#else
>> + self->priv->redirecting = is_redirecting;
>> +#endif
>> +}
>> +
>> #else
>> G_DEFINE_BOXED_TYPE(SpiceUsbDevice, spice_usb_device, g_object_ref, g_object_unref)
>> #endif
>> @@ -1103,6 +1119,13 @@ static void spice_usb_device_manager_channel_connect_cb(
>> g_object_unref(result);
>> }
>>
>> +typedef struct _connect_cb_data
>> +{
>> + SpiceUsbDeviceManager *self;
>> + GAsyncReadyCallback callback;
>> + gpointer user_data;
>> +} connect_cb_data;
>> +
>
> This looks like a GSimpleAsyncResult could be passed around instead of
> this new structure?
True. Fixed, thanks.
>
>> #ifdef G_OS_WIN32
>>
>> typedef struct _UsbInstallCbInfo {
>> @@ -1138,7 +1161,7 @@ static void spice_usb_device_manager_drv_install_cb(GObject *gobject,
>> SpiceUsbDevice *device;
>> UsbInstallCbInfo *cbinfo;
>> GCancellable *cancellable;
>> - GAsyncReadyCallback callback;
>> + connect_cb_data *data;
>>
>> g_return_if_fail(user_data != NULL);
>>
>> @@ -1147,8 +1170,7 @@ static void spice_usb_device_manager_drv_install_cb(GObject *gobject,
>> device = cbinfo->device;
>> installer = cbinfo->installer;
>> cancellable = cbinfo->cancellable;
>> - callback = cbinfo->callback;
>> - user_data = cbinfo->user_data;
>> + data = cbinfo->user_data;
>>
>> g_free(cbinfo);
>>
>> @@ -1170,8 +1192,8 @@ static void spice_usb_device_manager_drv_install_cb(GObject *gobject,
>> _spice_usb_device_manager_connect_device_async(self,
>> device,
>> cancellable,
>> - callback,
>> - user_data);
>> + _connect_device_async_cb,
>> + data);
>>
>> spice_usb_device_unref(device);
>> }
>> @@ -1552,8 +1574,17 @@ void spice_usb_device_manager_connect_device_async(SpiceUsbDeviceManager *self,
>> GAsyncReadyCallback callback,
>> gpointer user_data)
>> {
>> + g_return_if_fail(SPICE_IS_USB_DEVICE_MANAGER(self));
>> +#ifdef USE_USBREDIR
>> + _set_redirecting(self, TRUE);
>> +
>> + connect_cb_data *data = g_new(connect_cb_data, 1);
>> + data->self = self;
>> + data->callback = callback;
>> + data->user_data = user_data;
>> +
>> if (self->priv->use_usbclerk) {
>> -#if defined(USE_USBREDIR) && defined(G_OS_WIN32)
>> +#ifdef G_OS_WIN32
>> SpiceWinUsbDriver *installer;
>> UsbInstallCbInfo *cbinfo;
>>
>> @@ -1568,7 +1599,7 @@ void spice_usb_device_manager_connect_device_async(SpiceUsbDeviceManager *self,
>> cbinfo->installer = installer;
>> cbinfo->cancellable = cancellable;
>> cbinfo->callback = callback;
>> - cbinfo->user_data = user_data;
>> + cbinfo->user_data = data;
>>
>> spice_win_usb_driver_install_async(installer, device, cancellable,
>> spice_usb_device_manager_drv_install_cb,
>> @@ -1580,9 +1611,10 @@ void spice_usb_device_manager_connect_device_async(SpiceUsbDeviceManager *self,
>> _spice_usb_device_manager_connect_device_async(self,
>> device,
>> cancellable,
>> - callback,
>> - user_data);
>> + _connect_device_async_cb,
>> + data);
>> }
>> +#endif
>> }
>>
>> gboolean spice_usb_device_manager_connect_device_finish(
>> @@ -1600,6 +1632,27 @@ gboolean spice_usb_device_manager_connect_device_finish(
>> return TRUE;
>> }
>>
>> +#ifdef USE_USBREDIR
>> +static
>> +void _connect_device_async_cb(GObject *gobject,
>> + GAsyncResult *channel_res,
>> + gpointer user_data)
>> +{
>> + connect_cb_data *data = user_data;
>> + GSimpleAsyncResult *result = g_simple_async_result_new(
>> + G_OBJECT(data->self),
>> + data->callback,
>> + data->user_data,
>> + spice_usb_device_manager_connect_device_async);
>> +
>> + _set_redirecting(data->self, FALSE);
>> +
>> + g_simple_async_result_complete(result);
>> + g_object_unref(result);
>> + g_free(data);
>> +}
>> +#endif
>> +
>> /**
>> * spice_usb_device_manager_disconnect_device:
>> * @manager: the #SpiceUsbDeviceManager manager
>> --
>> 2.4.3
>>
>> _______________________________________________
>> Spice-devel mailing list
>> Spice-devel at lists.freedesktop.org <mailto:Spice-devel at lists.freedesktop.org>
>> http://lists.freedesktop.org/mailman/listinfo/spice-devel <http://lists.freedesktop.org/mailman/listinfo/spice-devel>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20151029/ff884950/attachment-0001.html>
More information about the Spice-devel
mailing list