about summary refs log tree commit diff
path: root/src/thread/sem_timedwait.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/thread/sem_timedwait.c')
-rw-r--r--src/thread/sem_timedwait.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/thread/sem_timedwait.c b/src/thread/sem_timedwait.c
new file mode 100644
index 00000000..e6604364
--- /dev/null
+++ b/src/thread/sem_timedwait.c
@@ -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;
+	}
+}