#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;
struct libusb_context *ctx = (struct libusb_context *)arg0;
CFRunLoopRef runloop;
+ /* Set this thread's name, so it can be seen in the debugger
+ and crash reports. */
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
+ pthread_setname_np ("org.libusb.device-detach");
+#endif
+
/* Tell the Objective-C garbage collector about this thread.
This is required because, unlike NSThreads, pthreads are
not automatically registered. Although we don't use
/* 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);
struct usbi_transfer *itransfer;
UInt32 io_size;
IOReturn kresult;
- int i = 0, ret;
+ POLL_NFDS_TYPE i = 0;
+ ssize_t ret;
UInt32 message;
usbi_mutex_lock(&ctx->open_devs_lock);
if (!(pollfd->revents & POLLERR)) {
ret = read (hpriv->fds[0], &message, sizeof (message));
- if (ret < sizeof (message))
+ if (ret < (ssize_t)sizeof (message))
continue;
} else
/* could not poll the device-- response is to delete the device (this seems a little heavy-handed) */