implement POSIX semaphores
[musl] / src / thread / sem_timedwait.c
diff --git a/src/thread/sem_timedwait.c b/src/thread/sem_timedwait.c
new file mode 100644 (file)
index 0000000..e660436
--- /dev/null
@@ -0,0 +1,18 @@
+#include <semaphore.h>
+#include "pthread_impl.h"
+
+int sem_timedwait(sem_t *sem, const struct timespec *at)
+{
+       int val;
+
+       for (;;) {
+               if (a_fetch_add(sem->__val, -1) > 0) return 0;
+               val = a_fetch_add(sem->__val, 1);
+               CANCELPT_BEGIN;
+               if (val <= 0 && __timedwait(sem->__val, val, CLOCK_REALTIME, at, 0) == ETIMEDOUT) {
+                       errno = ETIMEDOUT;
+                       return -1;
+               }
+               CANCELPT_END;
+       }
+}