[Spice-devel] [PATCH spice-gtk] fixup! usb-redir: define interfaces to support emulated devices
Frediano Ziglio
fziglio at redhat.com
Thu Aug 8 10:40:53 UTC 2019
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
More information about the Spice-devel
mailing list