]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
semaphore: force nonposix implementation on macOS
authorDaniel Salzman <daniel.salzman@nic.cz>
Sun, 10 Aug 2025 17:06:29 +0000 (19:06 +0200)
committerDaniel Salzman <daniel.salzman@nic.cz>
Mon, 11 Aug 2025 12:08:52 +0000 (14:08 +0200)
This solves two issues:
 - error: undeclared function 'sem_timedwait'
 - warning: 'sem_*' is deprecated

src/contrib/semaphore.c

index 443d046c7d239f9ee4a2d56ade3a1a0f1095c3b9..61cf2466f18fdb146822005bebb6ed86607eeec9 100644 (file)
 #include <stdint.h>
 #include <time.h>
 
-#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);