- // take write access if all bits are clear
-
- if( !prev->bits->xlock ) {
- if( !prev->bits->share )
- return 1;
- } else
- __sync_fetch_and_and(latch->value, ~XCL);
-
- return 0;
-}
-
-// clear write mode
-// wake up sleeping readers
-
-void bt_spinreleasewrite(BtSpinLatch *latch)
-{
-BtSpinLatch prev[1];
-
- *prev->value = __sync_fetch_and_and(latch->value, ~(XCL | READ));
-
- // alternate read/write phases
-
- if( prev->bits->read )
- if( sys_futex( latch->value, FUTEX_WAKE_BITSET, INT_MAX, NULL, NULL, QueRd ) )
- return;
-
- if( prev->bits->wrt )
- sys_futex( latch->value, FUTEX_WAKE_BITSET, 1, NULL, NULL, QueWr );
-}
-
-// decrement reader count
-// wake up sleeping writers
-
-void bt_spinreleaseread(BtSpinLatch *latch)
-{
-BtSpinLatch prev[1];
-
- *prev->value = __sync_sub_and_fetch(latch->value, SHARE);
-
- // alternate read/write phases
-
- if( prev->bits->wrt ) {
- if( !prev->bits->share )
- sys_futex( latch->value, FUTEX_WAKE_BITSET, 1, NULL, NULL, QueWr );
- return;
- }
-
- if( prev->bits->read ) {
- __sync_fetch_and_and(latch->value, ~READ);
- sys_futex (latch->value, FUTEX_WAKE_BITSET, INT_MAX, NULL, NULL, QueRd);
- }