static void forget_matching_split(Relation reln, RelFileNode node, BlockNumber insertblk, OffsetNumber offnum, bool is_root) { Buffer buffer; Page page; BTItem btitem; BlockNumber rightblk; List *l; /* Get downlink TID from page */ buffer = XLogReadBuffer(false, reln, insertblk); if (!BufferIsValid(buffer)) elog(PANIC, "forget_matching_split: block unfound"); page = (Page) BufferGetPage(buffer); btitem = (BTItem) PageGetItem(page, PageGetItemId(page, offnum)); rightblk = ItemPointerGetBlockNumber(&(btitem->bti_itup.t_tid)); Assert(ItemPointerGetOffsetNumber(&(btitem->bti_itup.t_tid)) == P_HIKEY); UnlockAndReleaseBuffer(buffer); foreach(l, incomplete_splits) { bt_incomplete_split *split = (bt_incomplete_split *) lfirst(l); if (RelFileNodeEquals(node, split->node) && rightblk == split->rightblk) { if (is_root != split->is_root) elog(LOG, "forget_matching_split: fishy is_root data"); incomplete_splits = lremove(split, incomplete_splits); break; /* need not look further */ } }
void clock_release(sdlclock c) { if(c==NULL) return; sclock *_c = (sclock*)c; lremove(_clocks, _c); free(_c->lkptable); free(_c); }