+ if( !idx ) {
+ if( bt_lockpage (bt, set->page_no, BtLockAccess) )
+ return bt->err;
+
+ if( bt_lockpage (bt, set->page_no, BtLockWrite) )
+ return bt->err;
+
+ if( bt_unlockpage (bt, set->page_no, BtLockAccess) )
+ return bt->err;
+
+ if( bt_mappage (bt, &set->page, set->page_no) )
+ return bt->err;
+
+ rparent->page_no = bt_getid (parent->page->right);
+ rparent->page = bt->temp;
+
+ if( bt_lockpage (bt, rparent->page_no, BtLockAccess) )
+ return bt->err;
+
+ if( bt_lockpage (bt, rparent->page_no, BtLockWrite) )
+ return bt->err;
+
+ if( bt_unlockpage (bt, rparent->page_no, BtLockAccess) )
+ return bt->err;
+
+ if( bt_mappage (bt, &rparent->page, rparent->page_no) )
+ return bt->err;
+
+ if( !rparent->page->kill ) {
+ sibling->page_no = bt_getid (set->page->right);
+
+ if( bt_lockpage (bt, sibling->page_no, BtLockAccess) )
+ return bt->err;
+
+ if( bt_lockpage (bt, sibling->page_no, BtLockWrite) )
+ return bt->err;
+
+ if( bt_unlockpage (bt, sibling->page_no, BtLockAccess) )
+ return bt->err;
+
+ sibling->page = bt->temp2;
+
+ if( bt_mappage (bt, &sibling->page, sibling->page_no) )
+ return bt->err;
+
+ if( !sibling->page->kill )
+ return bt_removeparent (bt, set, parent, sibling, rparent, lvl+1);
+
+ // try again later
+
+ if( bt_unlockpage (bt, sibling->page_no, BtLockWrite) )
+ return bt->err;
+ }
+
+ if( bt_unlockpage (bt, set->page_no, BtLockWrite) )
+ return bt->err;
+
+ if( bt_unlockpage (bt, rparent->page_no, BtLockWrite) )
+ return bt->err;
+
+ if( bt_unlockpage (bt, parent->page_no, BtLockWrite) )
+ return bt->err;
+#ifdef linux
+ sched_yield();
+#else
+ SwitchToThread();
+#endif
+ continue;
+ }