BtPage page;
page = (BtPage)(pool->map + (subpage << bt->mgr->page_bits));
-// madvise (page, bt->mgr->page_size, MADV_WILLNEED);
return page;
}
}
// allocate a new page
+// return with page pinned.
BTERR bt_newpage(BtDb *bt, BtPageSet *set)
{
if( slotptr(set->page, slot)->type == Duplicate )
len -= BtId;
+ // not there if we reach the stopper key
+
+ if( slot == set->page->cnt )
+ if( !bt_getid (set->page->right) )
+ break;
+
// if key exists, return >= 0 value bytes copied
// otherwise return (-1)
return bt->err;
memcpy (right->page, bt->frame, bt->mgr->page_size);
- bt_unpinpool (right->pool);
// update lower keys to continue in old page
bt_unlockpage (BtLockParent, right->latch);
bt_unpinlatch (right->latch);
+ bt_unpinpool (right->pool);
return 0;
}
}
#endif
+void bt_poolaudit (BtMgr *mgr)
+{
+uint slot = 0;
+BtPool *pool;
+
+ while( slot++ < mgr->poolcnt ) {
+ pool = mgr->pool + slot;
+ if( pool->pin & ~CLOCK_bit )
+ fprintf(stderr, "pool slot %d pinned\n", slot);
+ }
+}
+
uint bt_latchaudit (BtDb *bt)
{
ushort idx, hashidx;
if( !bt->frame->free ) {
for( idx = 0; idx++ < bt->frame->cnt - 1; ) {
ptr = keyptr(bt->frame, idx+1);
- if( keycmp (keyptr(bt->frame, idx), ptr->key, ptr->len) >= 0 )
+ if( keycmp (keyptr(bt->frame, idx), ptr->key, ptr->len) > 0 )
fprintf(stderr, "page %.8x idx %.2x out of order\n", page_no, idx);
}
if( !bt->frame->lvl )
}
else if( len < BT_maxkey )
key[len++] = ch;
+
fprintf(stderr, "finished %s for %d keys, %d found\n", args->infile, line, found);
break;
set->page = bt_page (bt, set->pool, page_no);
else
break;
+ madvise (set->page, bt->mgr->page_size, MADV_WILLNEED);
set->latch = bt_pinlatch (bt, page_no);
bt_lockpage (BtLockRead, set->latch);
next = bt_getid (set->page->right);
elapsed = getCpuTime(2);
fprintf(stderr, " sys %dm%.3fs\n", (int)(elapsed/60), elapsed - (int)(elapsed/60)*60);
+ bt_poolaudit (mgr);
bt_mgrclose (mgr);
}