#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)
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);
}
{
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) {
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)) {
{
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++;
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);