Index: fusl/src/thread/__wait.c |
diff --git a/fusl/src/thread/__wait.c b/fusl/src/thread/__wait.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..dc33c1a30992e6c04e4482cef8a2f8279d18262a |
--- /dev/null |
+++ b/fusl/src/thread/__wait.c |
@@ -0,0 +1,17 @@ |
+#include "pthread_impl.h" |
+ |
+void __wait(volatile int *addr, volatile int *waiters, int val, int priv) |
+{ |
+ int spins=100; |
+ if (priv) priv = FUTEX_PRIVATE; |
+ while (spins-- && (!waiters || !*waiters)) { |
+ if (*addr==val) a_spin(); |
+ else return; |
+ } |
+ if (waiters) a_inc(waiters); |
+ while (*addr==val) { |
+ __syscall(SYS_futex, addr, FUTEX_WAIT|priv, val, 0) != -ENOSYS |
+ || __syscall(SYS_futex, addr, FUTEX_WAIT, val, 0); |
+ } |
+ if (waiters) a_dec(waiters); |
+} |