Change reference counting semantic for emulated devices. Make the same as not emulated. This fix a leak if spice_usb_backend_device_eject is not called. Consistently the reference counter for SpiceUsbBackendDevice is now the number of owning pointers. --- src/usb-backend.c | 19 ++++++++++--------- src/usb-emulation.h | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/usb-backend.c b/src/usb-backend.c index d80da177..de2b55ec 100644 --- a/src/usb-backend.c +++ b/src/usb-backend.c @@ -852,17 +852,17 @@ void spice_usb_backend_device_report_change(SpiceUsbBackend *be, void spice_usb_backend_device_eject(SpiceUsbBackend *be, SpiceUsbBackendDevice *dev) { - g_return_if_fail(dev && dev->edev); + g_return_if_fail(dev); + if (dev->edev) { + be->own_devices_mask &= ~(1 << dev->device_info.address); + } if (be->hotplug_callback) { be->hotplug_callback(be->hotplug_user_data, dev, FALSE); } - be->own_devices_mask &= ~(1 << dev->device_info.address); - - spice_usb_backend_device_unref(dev); } -SpiceUsbBackendDevice* +gboolean spice_usb_backend_create_emulated_device(SpiceUsbBackend *be, SpiceUsbEmulatedDeviceCreate create_proc, void *create_params, @@ -877,7 +877,7 @@ spice_usb_backend_create_emulated_device(SpiceUsbBackend *be, if (be->own_devices_mask == 0xffffffff) { g_set_error(err, SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED, _("can't create device - limit reached")); - return NULL; + return FALSE; } for (address = 0; address < 32; ++address) { if (~be->own_devices_mask & (1 << address)) { @@ -893,7 +893,7 @@ spice_usb_backend_create_emulated_device(SpiceUsbBackend *be, dev->edev = edev = create_proc(be, dev, create_params, err); if (edev == NULL) { spice_usb_backend_device_unref(dev); - return NULL; + return FALSE; } if (!device_ops(edev)->get_descriptor(edev, LIBUSB_DT_DEVICE, 0, @@ -903,7 +903,7 @@ spice_usb_backend_create_emulated_device(SpiceUsbBackend *be, spice_usb_backend_device_unref(dev); g_set_error(err, SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED, _("can't create device - internal error")); - return NULL; + return FALSE; } be->own_devices_mask |= 1 << address; @@ -918,8 +918,9 @@ spice_usb_backend_create_emulated_device(SpiceUsbBackend *be, if (be->hotplug_callback) { be->hotplug_callback(be->hotplug_user_data, dev, TRUE); } + spice_usb_backend_device_unref(dev); - return dev; + return TRUE; } #endif /* USB_REDIR */ diff --git a/src/usb-emulation.h b/src/usb-emulation.h index 9e626a24..46d54d47 100644 --- a/src/usb-emulation.h +++ b/src/usb-emulation.h @@ -80,7 +80,7 @@ static inline const UsbDeviceOps *device_ops(SpiceUsbEmulatedDevice *dev) return (const UsbDeviceOps *)dev; } -SpiceUsbBackendDevice* +gboolean spice_usb_backend_create_emulated_device(SpiceUsbBackend *be, SpiceUsbEmulatedDeviceCreate create_proc, void *create_params, -- 2.20.1 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel