// share is count of read accessors
// grant write lock when share == 0
-typedef struct {
- volatile unsigned char mutex; // 1 = busy
- volatile unsigned char write:1; // 1 = exclusive
- volatile unsigned char readwait:1; // readers are waiting
- volatile unsigned char writewait:1; // writers are waiting
- volatile unsigned char filler:5;
- volatile ushort share; // count of readers holding locks
- volatile ushort rcnt; // count of waiting readers
- volatile ushort wcnt; // count of waiting writers
+volatile typedef struct {
+ unsigned char mutex[1]; // 1 = busy
+ unsigned char write:1; // 1 = exclusive
+ unsigned char readwait:1; // readers are waiting
+ unsigned char writewait:1; // writers are waiting
+ unsigned char filler:5;
+ ushort share; // count of readers holding locks
+ ushort rcnt; // count of waiting readers
+ ushort wcnt; // count of waiting writers
} BtLatch;
// Define the length of the page and key pointers
uint min; // next key offset
unsigned char bits:7; // page size in bits
unsigned char free:1; // page is on free list
- unsigned char lvl:5; // level of page
+ unsigned char lvl:6; // level of page
unsigned char kill:1; // page is being deleted
unsigned char dirty:1; // page has deleted keys
- unsigned char posted:1; // page fence has posted
unsigned char right[BtId]; // page number to right
} *BtPage;
while( 1 ) {
// obtain latch mutex
- while( __sync_lock_test_and_set(&latch->mutex, 1) )
+ while( __sync_lock_test_and_set(latch->mutex, 1) )
sched_yield();
if( decr )
latch->readwait = 1;
latch->rcnt++;
prev = *(uint *)latch & ~1;
- __sync_lock_release (&latch->mutex);
+ __sync_lock_release (latch->mutex);
sys_futex( (uint *)latch, FUTEX_WAIT_BITSET | private, prev, NULL, NULL, QueRd );
decr = 1;
continue;
latch->readwait = 0;
latch->share++;
- __sync_lock_release (&latch->mutex);
+ __sync_lock_release (latch->mutex);
return;
}
}
while( 1 ) {
// obtain latch mutex
- while( __sync_lock_test_and_set(&latch->mutex, 1) )
+ while( __sync_lock_test_and_set(latch->mutex, 1) )
sched_yield();
if( decr )
latch->writewait = 1;
latch->wcnt++;
prev = *(uint *)latch & ~1;
- __sync_lock_release (&latch->mutex);
+ __sync_lock_release (latch->mutex);
sys_futex( (uint *)latch, FUTEX_WAIT_BITSET | private, prev, NULL, NULL, QueWr );
decr = 1;
continue;
latch->writewait = 0;
latch->write = 1;
- __sync_lock_release (&latch->mutex);
+ __sync_lock_release (latch->mutex);
return;
}
}
// try for mutex,
// abandon request if not taken
- if( __sync_lock_test_and_set(&latch->mutex, 1) )
+ if( __sync_lock_test_and_set(latch->mutex, 1) )
return 0;
// see if write mode is available
// release latch mutex
- __sync_lock_release (&latch->mutex);
+ __sync_lock_release (latch->mutex);
return ans;
}
// obtain latch mutex
- while( __sync_lock_test_and_set(&latch->mutex, 1) )
+ while( __sync_lock_test_and_set(latch->mutex, 1) )
sched_yield();
latch->write = 0;
// release latch mutex
wakexit:
- __sync_lock_release (&latch->mutex);
+ __sync_lock_release (latch->mutex);
}
// decrement reader count
// obtain latch mutex
- while( __sync_lock_test_and_set(&latch->mutex, 1) )
+ while( __sync_lock_test_and_set(latch->mutex, 1) )
sched_yield();
latch->share--;
- // wake waiting writers
+ // wake one waiting writer
if( !latch->share && latch->wcnt )
sys_futex( (uint *)latch, FUTEX_WAKE_BITSET | private, 1, NULL, NULL, QueWr );
// release latch mutex
- __sync_lock_release (&latch->mutex);
+ __sync_lock_release (latch->mutex);
}
// link latch table entry into latch hash table