-
-#ifdef unix
- __sync_fetch_and_add(&pool->pin, -1);
- __sync_fetch_and_add (&set->pin, -1);
-#else
- _InterlockedDecrement16 (&pool->pin);
- _InterlockedDecrement16 (&set->pin);
-#endif
- return bt->err = 0;
-}
-
-// deallocate a deleted page
-// place on free chain out of allocator page
-// fence key must already be removed from parent
-
-BTERR bt_freepage(BtDb *bt, uid page_no)
-{
- // obtain delete lock on deleted page
-
- if( bt_lockpage(bt, page_no, BtLockDelete, NULL) )
- return bt->err;
-
- // obtain write lock on deleted page
-
- if( bt_lockpage(bt, page_no, BtLockWrite, &bt->temp) )
- return bt->err;
-
- // lock allocation page
-
- bt_spinwritelock(bt->mgr->latchmgr->lock);
-
- // store free chain in allocation page second right
- bt_putid(bt->temp->right, bt_getid(bt->mgr->latchmgr->alloc[1].right));
- bt_putid(bt->mgr->latchmgr->alloc[1].right, page_no);
-
- // unlock page zero
-
- bt_spinreleasewrite(bt->mgr->latchmgr->lock);
-
- // remove write lock on deleted node
-
- if( bt_unlockpage(bt, page_no, BtLockWrite) )
- return bt->err;
-
- // remove delete lock on deleted node
-
- if( bt_unlockpage(bt, page_no, BtLockDelete) )
- return bt->err;
-
- return 0;