X-Git-Url: https://pd.if.org/git/?p=btree;a=blobdiff_plain;f=threadskv7.c;h=6c74edbbf33f38f9f3a7418e2e3504b32de92e5b;hp=86d7300a2c3947e67076c360654ab805f5533eb7;hb=fc75a8e8904725c121a24ea8353250b5d92ba5b7;hpb=f145fa326b29ee6452e909d3dfa8d03df6495aca diff --git a/threadskv7.c b/threadskv7.c index 86d7300..6c74edb 100644 --- a/threadskv7.c +++ b/threadskv7.c @@ -1,11 +1,11 @@ -// btree version threadskv6 sched_yield version +// btree version threadskv7 sched_yield version // with reworked bt_deletekey code, // phase-fair reader writer lock, // librarian page split code, // duplicate key management // bi-directional cursors // traditional buffer pool manager -// and atomic key insert +// and atomic non-consistent key insert // 17 SEP 2014 @@ -1790,7 +1790,8 @@ BtVal *val; while( cnt++ < max ) { if( cnt == slot ) newslot = idx + 2; - if( cnt < max && slotptr(bt->frame,cnt)->dead ) + if( cnt < max || page->lvl ) + if( slotptr(bt->frame,cnt)->dead ) continue; // copy the value across @@ -1807,11 +1808,9 @@ BtVal *val; // make a librarian slot - if( idx ) { - slotptr(page, ++idx)->off = nxt; - slotptr(page, idx)->type = Librarian; - slotptr(page, idx)->dead = 1; - } + slotptr(page, ++idx)->off = nxt; + slotptr(page, idx)->type = Librarian; + slotptr(page, idx)->dead = 1; // set up the slot @@ -1925,8 +1924,10 @@ uint prev; idx = 0; while( cnt++ < max ) { - if( slotptr(set->page, cnt)->dead && cnt < max ) + if( cnt < max || set->page->lvl ) + if( slotptr(set->page, cnt)->dead && cnt < max ) continue; + src = valptr(set->page, cnt); nxt -= src->len + sizeof(BtVal); memcpy ((unsigned char *)bt->frame + nxt, src, src->len + sizeof(BtVal)); @@ -1938,11 +1939,9 @@ uint prev; // add librarian slot - if( idx ) { - slotptr(bt->frame, ++idx)->off = nxt; - slotptr(bt->frame, idx)->type = Librarian; - slotptr(bt->frame, idx)->dead = 1; - } + slotptr(bt->frame, ++idx)->off = nxt; + slotptr(bt->frame, idx)->type = Librarian; + slotptr(bt->frame, idx)->dead = 1; // add actual slot @@ -2011,11 +2010,9 @@ uint prev; // add librarian slot - if( idx ) { - slotptr(set->page, ++idx)->off = nxt; - slotptr(set->page, idx)->type = Librarian; - slotptr(set->page, idx)->dead = 1; - } + slotptr(set->page, ++idx)->off = nxt; + slotptr(set->page, idx)->type = Librarian; + slotptr(set->page, idx)->dead = 1; // add actual slot @@ -2046,16 +2043,18 @@ uint prev; // insert new fence for reformulated left block of smaller keys + ptr = (BtKey*)fencekey; bt_putid (value, set->page_no); - if( bt_insertkey (bt, fencekey+1, *fencekey, lvl+1, value, BtId, 1) ) + if( bt_insertkey (bt, ptr->key, ptr->len, lvl+1, value, BtId, 1) ) return bt->err; // switch fence for right block of larger keys to new right page + ptr = (BtKey*)rightkey; bt_putid (value, right->page_no); - if( bt_insertkey (bt, rightkey+1, *rightkey, lvl+1, value, BtId, 1) ) + if( bt_insertkey (bt, ptr->key, ptr->len, lvl+1, value, BtId, 1) ) return bt->err; bt_unlockpage (BtLockParent, set->latch);