diff --git a/libtcc.c b/libtcc.c index 81c65444..256dfb68 100644 --- a/libtcc.c +++ b/libtcc.c @@ -129,6 +129,20 @@ static void wait_sem(void) } #define WAIT_SEM() wait_sem() #define POST_SEM() LeaveCriticalSection(&tcc_cr); +#elif defined __APPLE__ +/* Half-compatible MacOS doesn't have non-shared (process local) + semaphores. Use the dispatch framework for lightweight locks. */ +#include <dispatch/dispatch.h> +static int tcc_sem_init; +static dispatch_semaphore_t tcc_sem; +static void wait_sem(void) +{ + if (!tcc_sem_init) + tcc_sem = dispatch_semaphore_create(1), tcc_sem_init = 1; + dispatch_semaphore_wait(tcc_sem, DISPATCH_TIME_FOREVER); +} +#define WAIT_SEM() wait_sem() +#define POST_SEM() dispatch_semaphore_signal(tcc_sem) #else #include <semaphore.h> static int tcc_sem_init;