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);
usbi_cond_init(&ctx->event_waiters_cond, NULL);
list_init(&ctx->flying_transfers);
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);
usbi_cond_destroy(&ctx->event_waiters_cond);
return r;
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);
usbi_cond_destroy(&ctx->event_waiters_cond);
if (ctx->pollfds)
/* used to see if there is an active thread doing event handling */
int event_handler_active;
+ /* A lock to protect internal context event data. */
+ usbi_mutex_t event_data_lock;
+
/* used to wait for event completion in threads other than the one that is
* event handling */
usbi_mutex_t event_waiters_lock;