From 952a9bb6116afc69c4bae4714c2eb0713bf62a6d Mon Sep 17 00:00:00 2001 From: Sean McBride Date: Fri, 9 Dec 2011 13:37:22 -0500 Subject: [PATCH] Darwin: Fix libusb_init() and libusb_exit() refcount race condition Use OSAtomicIncrement32Barrier() and OSAtomicDecrement32Barrier() in darwin_init() and darwin_exit() to be thread safe. --- libusb/os/darwin_usb.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libusb/os/darwin_usb.c b/libusb/os/darwin_usb.c index b5952f4..ca93ad4 100644 --- a/libusb/os/darwin_usb.c +++ b/libusb/os/darwin_usb.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -55,7 +56,7 @@ static clock_serv_t clock_realtime; static clock_serv_t clock_monotonic; static CFRunLoopRef libusb_darwin_acfl = NULL; /* async cf loop */ -static int initCount = 0; +static volatile int32_t initCount = 0; /* async event thread */ static pthread_t libusb_darwin_at; @@ -384,7 +385,7 @@ static void *event_thread_main (void *arg0) { static int darwin_init(struct libusb_context *ctx) { host_name_port_t host_self; - if (!(initCount++)) { + if (OSAtomicIncrement32Barrier(&initCount) == 1) { /* create the clocks that will be used */ host_self = mach_host_self(); @@ -407,7 +408,7 @@ static int darwin_init(struct libusb_context *ctx) { } static void darwin_exit (void) { - if (!(--initCount)) { + if (OSAtomicDecrement32Barrier(&initCount) == 0) { mach_port_deallocate(mach_task_self(), clock_realtime); mach_port_deallocate(mach_task_self(), clock_monotonic); -- 2.7.4