aboutsummaryrefslogtreecommitdiff
path: root/lib/libusb/libusb10_hotplug.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libusb/libusb10_hotplug.c')
-rw-r--r--lib/libusb/libusb10_hotplug.c50
1 files changed, 32 insertions, 18 deletions
diff --git a/lib/libusb/libusb10_hotplug.c b/lib/libusb/libusb10_hotplug.c
index 8b8de5019e4e..ee0fea82a8fe 100644
--- a/lib/libusb/libusb10_hotplug.c
+++ b/lib/libusb/libusb10_hotplug.c
@@ -176,8 +176,9 @@ libusb_hotplug_equal(libusb_device *_adev, libusb_device *_bdev)
}
static int
-libusb_hotplug_filter(libusb_context *ctx, libusb_hotplug_callback_handle pcbh,
- libusb_device *dev, libusb_hotplug_event event)
+libusb_hotplug_filter(libusb_context *ctx,
+ struct libusb_hotplug_callback_handle_struct *pcbh, libusb_device *dev,
+ libusb_hotplug_event event)
{
if (!(pcbh->events & event))
return (0);
@@ -216,8 +217,7 @@ libusb_hotplug_scan(void *arg)
{
struct pollfd pfd;
struct libusb_device_head hotplug_devs;
- libusb_hotplug_callback_handle acbh;
- libusb_hotplug_callback_handle bcbh;
+ struct libusb_hotplug_callback_handle_struct *acbh, *bcbh;
libusb_context *ctx = arg;
libusb_device *temp;
libusb_device *adev;
@@ -343,7 +343,7 @@ int libusb_hotplug_register_callback(libusb_context *ctx,
libusb_hotplug_callback_fn cb_fn, void *user_data,
libusb_hotplug_callback_handle *phandle)
{
- libusb_hotplug_callback_handle handle;
+ struct libusb_hotplug_callback_handle_struct *handle;
struct libusb_device *adev;
ctx = GET_CONTEXT(ctx);
@@ -368,6 +368,17 @@ int libusb_hotplug_register_callback(libusb_context *ctx,
if (handle == NULL)
return (LIBUSB_ERROR_NO_MEM);
+ handle->events = events;
+ handle->vendor = vendor_id;
+ handle->product = product_id;
+ handle->devclass = dev_class;
+ handle->fn = cb_fn;
+ handle->user_data = user_data;
+ CTX_LOCK(ctx);
+ if ((handle->id = ctx->next_callback_id++) < 0)
+ handle->id = ctx->next_callback_id = 1;
+ CTX_UNLOCK(ctx);
+
HOTPLUG_LOCK(ctx);
if (ctx->hotplug_handler == NO_THREAD) {
libusb_hotplug_enumerate(ctx, &ctx->hotplug_devs);
@@ -376,12 +387,6 @@ int libusb_hotplug_register_callback(libusb_context *ctx,
&libusb_hotplug_scan, ctx) != 0)
ctx->hotplug_handler = NO_THREAD;
}
- handle->events = events;
- handle->vendor = vendor_id;
- handle->product = product_id;
- handle->devclass = dev_class;
- handle->fn = cb_fn;
- handle->user_data = user_data;
if (flags & LIBUSB_HOTPLUG_ENUMERATE) {
TAILQ_FOREACH(adev, &ctx->hotplug_devs, hotplug_entry) {
@@ -398,23 +403,32 @@ int libusb_hotplug_register_callback(libusb_context *ctx,
HOTPLUG_UNLOCK(ctx);
if (phandle != NULL)
- *phandle = handle;
+ *phandle = handle->id;
return (LIBUSB_SUCCESS);
}
void libusb_hotplug_deregister_callback(libusb_context *ctx,
- libusb_hotplug_callback_handle handle)
+ libusb_hotplug_callback_handle callback_handle)
{
- ctx = GET_CONTEXT(ctx);
+ struct libusb_hotplug_callback_handle_struct *handle;
- if (ctx == NULL || handle == NULL)
+ ctx = GET_CONTEXT(ctx);
+
+ if (ctx == NULL || callback_handle == 0)
return;
HOTPLUG_LOCK(ctx);
+ TAILQ_FOREACH(handle, &ctx->hotplug_cbh, entry) {
+ if (handle->id == callback_handle)
+ break;
+ }
+ if (handle == NULL)
+ goto clean;
TAILQ_REMOVE(&ctx->hotplug_cbh, handle, entry);
libusb_interrupt_event_handler(ctx);
- HOTPLUG_UNLOCK(ctx);
+clean:
+ HOTPLUG_UNLOCK(ctx);
free(handle);
}
@@ -422,13 +436,13 @@ void *
libusb_hotplug_get_user_data(struct libusb_context *ctx,
libusb_hotplug_callback_handle callback_handle)
{
- libusb_hotplug_callback_handle handle;
+ struct libusb_hotplug_callback_handle_struct *handle;
ctx = GET_CONTEXT(ctx);
HOTPLUG_LOCK(ctx);
TAILQ_FOREACH(handle, &ctx->hotplug_cbh, entry) {
- if (handle == callback_handle)
+ if (handle->id == callback_handle)
break;
}
HOTPLUG_UNLOCK(ctx);