Take lock before raising event waiters condition
authorDaniel Drake <dsd@gentoo.org>
Sun, 25 May 2008 21:59:09 +0000 (22:59 +0100)
committerDaniel Drake <dsd@gentoo.org>
Sun, 25 May 2008 21:59:09 +0000 (22:59 +0100)
This avoids a race between the user checking for active event handler
and then blocking on the condition variable

libusb/io.c

index 6a04a2e..6ed19c1 100644 (file)
@@ -1045,7 +1045,9 @@ void usbi_handle_transfer_completion(struct usbi_transfer *itransfer,
         * this point. */
        if (flags & LIBUSB_TRANSFER_FREE_TRANSFER)
                libusb_free_transfer(transfer);
+       pthread_mutex_lock(&event_waiters_lock);
        pthread_cond_broadcast(&event_waiters_cond);
+       pthread_mutex_unlock(&event_waiters_lock);
 }
 
 /* Similar to usbi_handle_transfer_completion() but exclusively for transfers