Index: fusl/src/thread/pthread_rwlock_unlock.c |
diff --git a/fusl/src/thread/pthread_rwlock_unlock.c b/fusl/src/thread/pthread_rwlock_unlock.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7b5eec84d833c30673269e19b5467f2b13a05180 |
--- /dev/null |
+++ b/fusl/src/thread/pthread_rwlock_unlock.c |
@@ -0,0 +1,18 @@ |
+#include "pthread_impl.h" |
+ |
+int pthread_rwlock_unlock(pthread_rwlock_t *rw) |
+{ |
+ int val, cnt, waiters, new, priv = rw->_rw_shared^128; |
+ |
+ do { |
+ val = rw->_rw_lock; |
+ cnt = val & 0x7fffffff; |
+ waiters = rw->_rw_waiters; |
+ new = (cnt == 0x7fffffff || cnt == 1) ? 0 : val-1; |
+ } while (a_cas(&rw->_rw_lock, val, new) != val); |
+ |
+ if (!new && (waiters || val<0)) |
+ __wake(&rw->_rw_lock, cnt, priv); |
+ |
+ return 0; |
+} |