* descriptor from the polling loop. */
/* record that we are closing a device */
- usbi_mutex_lock(&ctx->device_close_lock);
+ usbi_mutex_lock(&ctx->event_data_lock);
ctx->device_close++;
- usbi_mutex_unlock(&ctx->device_close_lock);
+ usbi_mutex_unlock(&ctx->event_data_lock);
/* write some data on control pipe to interrupt event handlers */
r = usbi_write(ctx->ctrl_pipe[1], &dummy, sizeof(dummy));
if (r <= 0) {
usbi_warn(ctx, "internal signalling write failed, closing anyway");
do_close(ctx, dev_handle);
- usbi_mutex_lock(&ctx->device_close_lock);
+ usbi_mutex_lock(&ctx->event_data_lock);
ctx->device_close--;
- usbi_mutex_unlock(&ctx->device_close_lock);
+ usbi_mutex_unlock(&ctx->event_data_lock);
return;
}
do_close(ctx, dev_handle);
/* we're done with closing this device */
- usbi_mutex_lock(&ctx->device_close_lock);
+ usbi_mutex_lock(&ctx->event_data_lock);
ctx->device_close--;
- usbi_mutex_unlock(&ctx->device_close_lock);
+ usbi_mutex_unlock(&ctx->event_data_lock);
/* Release event handling lock and wake up event waiters */
libusb_unlock_events(ctx);
usbi_mutex_init(&ctx->flying_transfers_lock, NULL);
usbi_mutex_init(&ctx->pollfds_lock, NULL);
- usbi_mutex_init(&ctx->device_close_lock, NULL);
usbi_mutex_init_recursive(&ctx->events_lock, NULL);
usbi_mutex_init(&ctx->event_data_lock, NULL);
usbi_mutex_init(&ctx->event_waiters_lock, NULL);
err:
usbi_mutex_destroy(&ctx->flying_transfers_lock);
usbi_mutex_destroy(&ctx->pollfds_lock);
- usbi_mutex_destroy(&ctx->device_close_lock);
usbi_mutex_destroy(&ctx->events_lock);
usbi_mutex_destroy(&ctx->event_data_lock);
usbi_mutex_destroy(&ctx->event_waiters_lock);
#endif
usbi_mutex_destroy(&ctx->flying_transfers_lock);
usbi_mutex_destroy(&ctx->pollfds_lock);
- usbi_mutex_destroy(&ctx->device_close_lock);
usbi_mutex_destroy(&ctx->events_lock);
usbi_mutex_destroy(&ctx->event_data_lock);
usbi_mutex_destroy(&ctx->event_waiters_lock);
/* is someone else waiting to close a device? if so, don't let this thread
* start event handling */
- usbi_mutex_lock(&ctx->device_close_lock);
+ usbi_mutex_lock(&ctx->event_data_lock);
ru = ctx->device_close;
- usbi_mutex_unlock(&ctx->device_close_lock);
+ usbi_mutex_unlock(&ctx->event_data_lock);
if (ru) {
usbi_dbg("someone else is closing a device");
return 1;
/* is someone else waiting to close a device? if so, don't let this thread
* continue event handling */
- usbi_mutex_lock(&ctx->device_close_lock);
+ usbi_mutex_lock(&ctx->event_data_lock);
r = ctx->device_close;
- usbi_mutex_unlock(&ctx->device_close_lock);
+ usbi_mutex_unlock(&ctx->event_data_lock);
if (r) {
usbi_dbg("someone else is closing a device");
return 0;
/* is someone else waiting to close a device? if so, don't let this thread
* start event handling -- indicate that event handling is happening */
- usbi_mutex_lock(&ctx->device_close_lock);
+ usbi_mutex_lock(&ctx->event_data_lock);
r = ctx->device_close;
- usbi_mutex_unlock(&ctx->device_close_lock);
+ usbi_mutex_unlock(&ctx->event_data_lock);
if (r) {
usbi_dbg("someone else is closing a device");
return 1;
/* read the dummy data from the control pipe unless someone is closing
* a device */
- usbi_mutex_lock(&ctx->device_close_lock);
+ usbi_mutex_lock(&ctx->event_data_lock);
ru = ctx->device_close;
- usbi_mutex_unlock(&ctx->device_close_lock);
+ usbi_mutex_unlock(&ctx->event_data_lock);
if (!ru) {
ret = usbi_read(ctx->ctrl_pipe[0], &dummy, sizeof(dummy));
if (ret != sizeof(dummy)) {
int debug_fixed;
/* internal control pipe, used for interrupting event handling when
- * something needs to modify poll fds. */
+ * an internal event occurs. */
int ctrl_pipe[2];
struct list_head usb_devs;
unsigned int pollfds_modified;
usbi_mutex_t pollfds_lock;
- /* a counter that is set when we want to interrupt event handling, in order
- * to safely close a device, and a lock to protect it. */
- unsigned int device_close;
- usbi_mutex_t device_close_lock;
-
/* user callbacks for pollfd changes */
libusb_pollfd_added_cb fd_added_cb;
libusb_pollfd_removed_cb fd_removed_cb;
/* A lock to protect internal context event data. */
usbi_mutex_t event_data_lock;
+ /* A counter that is set when we want to interrupt and prevent event handling,
+ * in order to safely close a device. Protected by event_data_lock. */
+ unsigned int device_close;
+
/* used to wait for event completion in threads other than the one that is
* event handling */
usbi_mutex_t event_waiters_lock;