From: Daniel Salzman Date: Sun, 10 Aug 2025 17:06:29 +0000 (+0200) Subject: semaphore: force nonposix implementation on macOS X-Git-Tag: v3.5.0~33 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9a06dfef333626b767906a8066c4b62a35fe6f14;p=thirdparty%2Fknot-dns.git semaphore: force nonposix implementation on macOS This solves two issues: - error: undeclared function 'sem_timedwait' - warning: 'sem_*' is deprecated --- diff --git a/src/contrib/semaphore.c b/src/contrib/semaphore.c index 443d046c7d..61cf2466f1 100644 --- a/src/contrib/semaphore.c +++ b/src/contrib/semaphore.c @@ -12,10 +12,6 @@ #include #include -#if defined(__APPLE__) -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -#endif - #define SEM_STATUS_POSIX INT_MIN void knot_sem_init(knot_sem_t *sem, int value) @@ -24,11 +20,13 @@ void knot_sem_init(knot_sem_t *sem, int value) if (value < 0) { goto nonposix; } +#if !defined(__APPLE__) int ret = sem_init(&sem->semaphore, 1, value); if (ret == 0) { sem->status = SEM_STATUS_POSIX; return; } +#endif nonposix: knot_sem_init_nonposix(sem, value); } @@ -55,10 +53,12 @@ void knot_sem_wait(knot_sem_t *sem) { assert(sem != NULL); if (sem->status == SEM_STATUS_POSIX) { +#if !defined(__APPLE__) int semret; do { semret = sem_wait(&sem->semaphore); } while (semret != 0); // repeat wait as it might be interrupted by a signal +#endif } else { pthread_mutex_lock(&sem->status_lock->mutex); while (sem->status <= 0) { @@ -95,11 +95,15 @@ bool knot_sem_timedwait(knot_sem_t *sem, unsigned long ms) struct timespec end; timespec_now_shift(&end, ms); if (sem->status == SEM_STATUS_POSIX) { +#if !defined(__APPLE__) int semret; do { semret = sem_timedwait(&sem->semaphore, &end); } while (semret != 0 && errno != ETIMEDOUT); // repeat wait as it might be interrupted by a signal return (semret == 0); +#else + return false; +#endif } else { pthread_mutex_lock(&sem->status_lock->mutex); while (sem->status <= 0 && !timespec_past(&end)) { @@ -147,9 +151,11 @@ void knot_sem_post(knot_sem_t *sem) { assert(sem != NULL); if (sem->status == SEM_STATUS_POSIX) { +#if !defined(__APPLE__) int semret = sem_post(&sem->semaphore); (void)semret; assert(semret == 0); +#endif } else { pthread_mutex_lock(&sem->status_lock->mutex); sem->status++; @@ -163,7 +169,9 @@ void knot_sem_destroy(knot_sem_t *sem) assert(sem != NULL); knot_sem_wait(sem); // NOTE this is questionable if the initial value was > 1 if (sem->status == SEM_STATUS_POSIX) { +#if !defined(__APPLE__) sem_destroy(&sem->semaphore); +#endif } else { pthread_cond_destroy(&sem->status_lock->cond); pthread_mutex_destroy(&sem->status_lock->mutex);