Hi, On 07/05/2012 10:43 PM, Uri Lublin wrote:
Note that this change may affect performance a bit, as sometimes there is a need to find the libusb_device or the SpiceUsbDevice. Likely it's negligible. --- gtk/channel-usbredir.c | 2 +- gtk/usb-device-manager-priv.h | 10 ++- gtk/usb-device-manager.c | 188 +++++++++++++++++++++++++++++----------- 3 files changed, 146 insertions(+), 54 deletions(-) diff --git a/gtk/channel-usbredir.c b/gtk/channel-usbredir.c index 3d57152..354d2e1 100644 --- a/gtk/channel-usbredir.c +++ b/gtk/channel-usbredir.c
<snip>
@@ -549,16 +557,18 @@ static void spice_usb_device_manager_auto_connect_cb(GObject *gobject, g_signal_emit(self, signals[AUTO_CONNECT_FAILED], 0, device, err); g_error_free(err); } - libusb_unref_device(device); + spice_usb_device_unref(device); } static void spice_usb_device_manager_add_dev(SpiceUsbDeviceManager *self, GUdevDevice *udev) { SpiceUsbDeviceManagerPrivate *priv = self->priv; - libusb_device *device = NULL, **dev_list = NULL; + libusb_device **dev_list = NULL; + SpiceUsbDevice *device = NULL; const gchar *devtype, *devclass; int i, bus, address; + gboolean filter_ok = FALSE; devtype = g_udev_device_get_property(udev, "DEVTYPE"); /* Check if this is a usb device (and not an interface) */ @@ -583,11 +593,19 @@ static void spice_usb_device_manager_add_dev(SpiceUsbDeviceManager *self, for (i = 0; dev_list && dev_list[i]; i++) { if (libusb_get_bus_number(dev_list[i]) == bus && libusb_get_device_address(dev_list[i]) == address) { - device = libusb_ref_device(dev_list[i]); + device = (SpiceUsbDevice*)spice_usb_device_set_info(dev_list[i]); break; } } + if (device && priv->auto_connect) { + /* check filter before unref'ing dev_list[i] */ + filter_ok = usbredirhost_check_device_filter( + priv->auto_conn_filter_rules, + priv->auto_conn_filter_rules_count, + dev_list[i], 0) == 0; + } + if (!priv->coldplug_list) libusb_free_device_list(dev_list, 1); @@ -600,21 +618,17 @@ static void spice_usb_device_manager_add_dev(SpiceUsbDeviceManager *self, g_ptr_array_add(priv->devices, device); if (priv->auto_connect) { - gboolean can_redirect, auto_ok; + gboolean can_redirect; can_redirect = spice_usb_device_manager_can_redirect_device( - self, (SpiceUsbDevice *)device, NULL); - - auto_ok = usbredirhost_check_device_filter( - priv->auto_conn_filter_rules, - priv->auto_conn_filter_rules_count, - device, 0) == 0; + self, device, NULL); - if (can_redirect && auto_ok) + if (can_redirect && filter_ok) { spice_usb_device_manager_connect_device_async(self, - (SpiceUsbDevice *)device, NULL, + device, NULL, spice_usb_device_manager_auto_connect_cb, - libusb_ref_device(device)); + g_object_ref(device)); + } } SPICE_DEBUG("device added %p", device);
The g_object_ref here must be a spice_usb_device_ref!! <snip>
@@ -980,13 +1005,20 @@ spice_usb_device_manager_can_redirect_device(SpiceUsbDeviceManager *self, g_ptr_array_index(priv->channels, 0), &guest_filter_rules, &guest_filter_rules_count); - if (guest_filter_rules && - usbredirhost_check_device_filter( + if (guest_filter_rules) { + gboolean filter_ok; + libusb_device *ldev; + ldev = spice_usb_device_manager_device_to_libdev(self, device); + g_return_val_if_fail(ldev != NULL, FALSE); + filter_ok = (usbredirhost_check_device_filter( guest_filter_rules, guest_filter_rules_count, - (libusb_device *)device, 0) != 0) { - g_set_error_literal(err, SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED, - _("Some USB devices are blocked by host policy")); - return FALSE; + ldev, 0) == 0); + libusb_unref_device(ldev); + if (!filter_ok) { + g_set_error_literal(err, SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED, + _("Some USB devices are blocked by host policy")); + return FALSE; + } } /* Check if there are free channels */
You're using libdev for the actual libusb_device everywhere and now here you are using ldev, please make it libdev for consistency. Regards, Hans _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel