From 75561e6090ad9a3d53fbb0a570e947ae2023bf99 Mon Sep 17 00:00:00 2001 From: Sergey Fedorov Date: Wed, 22 Jul 2026 19:43:38 +0800 Subject: [PATCH] fy-thread: fix macOS < 10.6 --- src/thread/fy-thread.c | 25 ++++++++++++++++++++----- src/thread/fy-thread.h | 19 +++++++++++++++---- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/thread/fy-thread.c b/src/thread/fy-thread.c index 1c675d7..3560b26 100644 --- src/thread/fy-thread.c +++ src/thread/fy-thread.c @@ -864,10 +864,14 @@ fy_atomic_store(&wp->work_left, work_count); #if defined(__linux__) && !defined(FY_THREAD_PORTABLE) fy_atomic_store(&wp->done, !work_count); -#elif defined(__APPLE__) +#elif defined(FY_THREAD_USE_DISPATCH) wp->sem = dispatch_semaphore_create(!work_count); - assert(wp->sem != NULL); + assert(wp->sem != NULL); (void)rc; +#elif defined(FY_THREAD_USE_MACH_SEM) + kern_return_t kr = semaphore_create(mach_task_self(), &wp->sem, SYNC_POLICY_FIFO, !work_count); + assert(kr == KERN_SUCCESS); + (void)kr; #elif defined(_WIN32) wp->sem = CreateSemaphore(NULL, !work_count, LONG_MAX, NULL); assert(wp->sem != NULL); @@ -891,9 +895,11 @@ CloseHandle(wp->sem); #elif defined(__linux__) && !defined(FY_THREAD_PORTABLE) /* nothing */ -#elif defined(__APPLE__) +#elif defined(FY_THREAD_USE_DISPATCH) /* nothing */ (void)rc; +#elif defined(FY_THREAD_USE_MACH_SEM) + semaphore_destroy(mach_task_self(), wp->sem); #else rc = sem_destroy(&wp->sem); assert(!rc); @@ -917,9 +923,12 @@ #elif defined(__linux__) && !defined(FY_THREAD_PORTABLE) rc = fpost(&wp->done); assert(!rc); -#elif defined(__APPLE__) +#elif defined(FY_THREAD_USE_DISPATCH) dispatch_semaphore_signal(wp->sem); (void)rc; +#elif defined(FY_THREAD_USE_MACH_SEM) + kern_return_t kr = semaphore_signal(wp->sem); + assert(kr == KERN_SUCCESS); #else rc = sem_post(&wp->sem); assert(!rc); @@ -945,9 +954,15 @@ #if defined(__linux__) && !defined(FY_THREAD_PORTABLE) rc = fwait(&wp->done); assert(!rc || (rc == -1 && errno == EAGAIN)); -#elif defined(__APPLE__) +#elif defined(FY_THREAD_USE_DISPATCH) dispatch_semaphore_wait(wp->sem, DISPATCH_TIME_FOREVER); rc = 0; +#elif defined(FY_THREAD_USE_MACH_SEM) + kern_return_t kr; + do { + kr = semaphore_wait(wp->sem); + } while (kr == KERN_ABORTED); /* retry on signal interruption */ + assert(kr == KERN_SUCCESS); #elif defined(_WIN32) rc = WaitForSingleObject(wp->sem, INFINITE); assert(rc == WAIT_OBJECT_0); diff --git a/src/thread/fy-thread.h b/src/thread/fy-thread.h index ed16c9b..531683b 100644 --- src/thread/fy-thread.h +++ src/thread/fy-thread.h @@ -18,10 +18,19 @@ #ifndef _WIN32 #include -#ifndef __APPLE__ -#include -#else +#ifdef __APPLE__ +#include +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 #include +#define FY_THREAD_USE_DISPATCH 1 +#else +#include +#include +#include +#define FY_THREAD_USE_MACH_SEM 1 +#endif +#else +#include #endif #endif @@ -39,8 +48,10 @@ struct fy_work_pool { FY_ATOMIC(size_t) work_left; #if defined(__linux__) && !defined(FY_THREAD_PORTABLE) FY_ATOMIC(uint32_t) done; -#elif defined(__APPLE__) +#elif defined(FY_THREAD_USE_DISPATCH) dispatch_semaphore_t sem; +#elif defined(FY_THREAD_USE_MACH_SEM) + semaphore_t sem; #elif defined(_WIN32) HANDLE sem; #else