RWLock readwr[1]; // read/write page lock
RWLock access[1]; // Access Intent/Page delete
RWLock parent[1]; // Posting of fence key in parent
RWLock readwr[1]; // read/write page lock
RWLock access[1]; // Access Intent/Page delete
RWLock parent[1]; // Posting of fence key in parent
- volatile uint next; // next entry in hash table chain
- volatile uint prev; // prev entry in hash table chain
- volatile ushort pin; // number of outstanding latches
+ uint slot; // entry slot in latch table
+ uint next; // next entry in hash table chain
+ uint prev; // prev entry in hash table chain
+ volatile ushort pin; // number of outstanding threads
BTERR bt_latchlink (BtDb *bt, uint hashidx, uint slot, uid page_no, uint loadit)
{
BTERR bt_latchlink (BtDb *bt, uint hashidx, uint slot, uid page_no, uint loadit)
{
BtLatchSet *latch = bt->mgr->latchsets + slot;
if( latch->next = bt->mgr->hashtable[hashidx].slot )
bt->mgr->latchsets[latch->next].prev = slot;
bt->mgr->hashtable[hashidx].slot = slot;
BtLatchSet *latch = bt->mgr->latchsets + slot;
if( latch->next = bt->mgr->hashtable[hashidx].slot )
bt->mgr->latchsets[latch->next].prev = slot;
bt->mgr->hashtable[hashidx].slot = slot;
- __sync_fetch_and_add(&set->pin, -1);
+ if( ~latch->pin & CLOCK_bit )
+ __sync_fetch_and_or(&latch->pin, CLOCK_bit);
+ __sync_fetch_and_add(&latch->pin, -1);
- _InterlockedDecrement16 (&set->pin);
+ if( ~latch->pin & CLOCK_bit )
+ _InterlockedOr16 (&latch->pin, CLOCK_bit);
+ _InterlockedDecrement16 (&latch->pin);
latch = bt->mgr->latchsets + slot;
#ifdef unix
__sync_fetch_and_add(&latch->pin, 1);
latch = bt->mgr->latchsets + slot;
#ifdef unix
__sync_fetch_and_add(&latch->pin, 1);
latch = mgr->latchsets + slot;
if( latch->dirty ) {
bt_writepage(mgr, page, latch->page_no);
latch->dirty = 0, num++;
}
latch = mgr->latchsets + slot;
if( latch->dirty ) {
bt_writepage(mgr, page, latch->page_no);
latch->dirty = 0, num++;
}
munmap (mgr->pagezero, mgr->page_size);
#else
FlushViewOfFile(mgr->pagezero, 0);
munmap (mgr->pagezero, mgr->page_size);
#else
FlushViewOfFile(mgr->pagezero, 0);
// calculate number of latch hash table entries
mgr->nlatchpage = (nodemax/16 * sizeof(BtHashEntry) + mgr->page_size - 1) / mgr->page_size;
// calculate number of latch hash table entries
mgr->nlatchpage = (nodemax/16 * sizeof(BtHashEntry) + mgr->page_size - 1) / mgr->page_size;
mgr->nlatchpage += nodemax; // size of the buffer pool in pages
mgr->nlatchpage += (sizeof(BtLatchSet) * nodemax + mgr->page_size - 1)/mgr->page_size;
mgr->nlatchpage += nodemax; // size of the buffer pool in pages
mgr->nlatchpage += (sizeof(BtLatchSet) * nodemax + mgr->page_size - 1)/mgr->page_size;
- mgr->pagezero = mmap (0, mgr->page_size, flag, MAP_SHARED, mgr->idx, ALLOC_page * mgr->page_size);
+ mgr->pagezero = mmap (0, mgr->page_size, flag, MAP_SHARED, mgr->idx, ALLOC_page << mgr->page_bits);
if( mgr->pagezero == MAP_FAILED ) {
fprintf (stderr, "Unable to mmap btree page zero, error = %d\n", errno);
return bt_mgrclose (mgr), NULL;
}
mlock (mgr->pagezero, mgr->page_size);
if( mgr->pagezero == MAP_FAILED ) {
fprintf (stderr, "Unable to mmap btree page zero, error = %d\n", errno);
return bt_mgrclose (mgr), NULL;
}
mlock (mgr->pagezero, mgr->page_size);
- mgr->hashtable = (void *)mmap (0, (uid)mgr->nlatchpage * mgr->page_size, flag, MAP_ANONYMOUS | MAP_SHARED, -1, 0);
+ mgr->hashtable = (void *)mmap (0, (uid)mgr->nlatchpage << mgr->page_bits, flag, MAP_ANONYMOUS | MAP_SHARED, -1, 0);
if( mgr->hashtable == MAP_FAILED ) {
fprintf (stderr, "Unable to mmap anonymous buffer pool pages, error = %d\n", errno);
return bt_mgrclose (mgr), NULL;
if( mgr->hashtable == MAP_FAILED ) {
fprintf (stderr, "Unable to mmap anonymous buffer pool pages, error = %d\n", errno);
return bt_mgrclose (mgr), NULL;