diff options
Diffstat (limited to 'src/backend/access/gin/ginbtree.c')
| -rw-r--r-- | src/backend/access/gin/ginbtree.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/src/backend/access/gin/ginbtree.c b/src/backend/access/gin/ginbtree.c index bb150a46893..ed3286651fc 100644 --- a/src/backend/access/gin/ginbtree.c +++ b/src/backend/access/gin/ginbtree.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gin/ginbtree.c,v 1.15 2010/01/02 16:57:33 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/gin/ginbtree.c,v 1.15.6.1 2010/08/01 02:12:51 tgl Exp $ *------------------------------------------------------------------------- */ @@ -267,6 +267,8 @@ findParents(GinBtree btree, GinBtreeStack *stack, /* * Insert value (stored in GinBtree) to tree described by stack + * + * NB: the passed-in stack is freed, as though by freeGinBtreeStack. */ void ginInsertValue(GinBtree btree, GinBtreeStack *stack) @@ -308,10 +310,11 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack) PageSetTLI(page, ThisTimeLineID); } - UnlockReleaseBuffer(stack->buffer); + LockBuffer(stack->buffer, GIN_UNLOCK); END_CRIT_SECTION(); - freeGinBtreeStack(stack->parent); + freeGinBtreeStack(stack); + return; } else @@ -325,7 +328,6 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack) */ newlpage = btree->splitPage(btree, stack->buffer, rbuffer, stack->off, &rdata); - ((ginxlogSplit *) (rdata->data))->rootBlkno = rootBlkno; parent = stack->parent; @@ -341,7 +343,6 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack) ((ginxlogSplit *) (rdata->data))->isRootSplit = TRUE; ((ginxlogSplit *) (rdata->data))->rrlink = InvalidBlockNumber; - page = BufferGetPage(stack->buffer); lpage = BufferGetPage(lbuffer); rpage = BufferGetPage(rbuffer); @@ -375,10 +376,11 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack) UnlockReleaseBuffer(rbuffer); UnlockReleaseBuffer(lbuffer); - UnlockReleaseBuffer(stack->buffer); - + LockBuffer(stack->buffer, GIN_UNLOCK); END_CRIT_SECTION(); + freeGinBtreeStack(stack); + return; } else |
