]> pd.if.org Git - pdclib.old/blobdiff - opt/pthreads/mtx_timedlock.c
Add pthreads threading backend and move the POSIX port over to using it
[pdclib.old] / opt / pthreads / mtx_timedlock.c
diff --git a/opt/pthreads/mtx_timedlock.c b/opt/pthreads/mtx_timedlock.c
new file mode 100644 (file)
index 0000000..ed490a8
--- /dev/null
@@ -0,0 +1,38 @@
+#ifndef REGTEST
+#include <threads.h>
+// On Mac OS X, supress system definition of struct timespec
+#ifdef __APPLE__
+    #define _STRUCT_TIMESPEC struct timespec
+#endif
+#include <unistd.h>
+#include <pthread.h>
+
+/* Can only implement if timeouts are supported.
+ *
+ * Namely, Mac OS X does not implement timeouts 
+ */
+#if defined(_POSIX_TIMEOUTS) && (_POSIX_TIMEOUTS - 200112L) >= 0L
+int mtx_timedlock(mtx_t *restrict mtx, const struct timespec *restrict ts)
+{
+    switch(pthread_mutex_timedlock(mtx, ts)) {
+        case 0:
+            return thrd_success;
+        case ETIMEDOUT:
+            return thrd_timeout;
+        default:
+            return thrd_error;
+    }
+}
+#endif
+
+#endif
+
+#ifdef TEST
+#include <_PDCLIB_test.h>
+
+int main( void )
+{
+    return TEST_RESULTS;
+}
+
+#endif