+// lite weight spin lock Latch Manager
+
+int sys_futex(void *addr1, int op, int val1, struct timespec *timeout, void *addr2, int val3)
+{
+ return syscall(SYS_futex, addr1, op, val1, timeout, addr2, val3);
+}
+
+void bt_mutexlock(BtMutexLatch *latch)
+{
+BtMutexLatch prev[1];
+uint slept = 0;
+
+ while( 1 ) {
+ *prev->value = __sync_fetch_and_or(latch->value, XCL);
+
+ if( !prev->bits->xlock ) { // did we set XCL bit?
+ if( slept )
+ __sync_fetch_and_sub(latch->value, WRT);
+ return;
+ }
+
+ if( !slept ) {
+ prev->bits->wrt++;
+ __sync_fetch_and_add(latch->value, WRT);
+ }
+
+ sys_futex (latch->value, FUTEX_WAIT_BITSET, *prev->value, NULL, NULL, QueWr);
+ slept = 1;
+ }
+}
+
+// try to obtain write lock
+
+// return 1 if obtained,
+// 0 otherwise
+
+int bt_mutextry(BtMutexLatch *latch)
+{
+BtMutexLatch prev[1];
+
+ *prev->value = __sync_fetch_and_or(latch->value, XCL);
+
+ // take write access if exclusive bit is clear
+
+ return !prev->bits->xlock;
+}
+
+// clear write mode
+
+void bt_releasemutex(BtMutexLatch *latch)
+{
+BtMutexLatch prev[1];
+
+ *prev->value = __sync_fetch_and_and(latch->value, ~XCL);
+
+ if( prev->bits->wrt )
+ sys_futex( latch->value, FUTEX_WAKE_BITSET, 1, NULL, NULL, QueWr );
+}
+