#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
+#include <libkern/OSAtomic.h>
#include <mach/clock.h>
#include <mach/clock_types.h>
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;
/* add the notification port to the run loop */
libusb_notification_port = IONotificationPortCreate (kIOMasterPortDefault);
libusb_notification_cfsource = IONotificationPortGetRunLoopSource (libusb_notification_port);
- CFRunLoopAddSource(CFRunLoopGetCurrent (), libusb_notification_cfsource, kCFRunLoopDefaultMode);
+ CFRunLoopAddSource(runloop, libusb_notification_cfsource, kCFRunLoopDefaultMode);
/* create notifications for removed devices */
kresult = IOServiceAddMatchingNotification (libusb_notification_port, kIOTerminatedNotification,
usbi_info (ctx, "thread ready to receive events");
- /* let the main thread know about the async runloop */
- libusb_darwin_acfl = CFRunLoopGetCurrent ();
-
/* signal the main thread */
pthread_mutex_lock (&libusb_darwin_at_mutex);
+ libusb_darwin_acfl = runloop;
pthread_cond_signal (&libusb_darwin_at_cond);
pthread_mutex_unlock (&libusb_darwin_at_mutex);
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();
}
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);