diff options
Diffstat (limited to 'src/backend/access/rtree/rtscan.c')
-rw-r--r-- | src/backend/access/rtree/rtscan.c | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/src/backend/access/rtree/rtscan.c b/src/backend/access/rtree/rtscan.c index 9dac2a15c06..d3530966e6d 100644 --- a/src/backend/access/rtree/rtscan.c +++ b/src/backend/access/rtree/rtscan.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/rtree/rtscan.c,v 1.51 2004/01/07 18:56:24 neilc Exp $ + * $PostgreSQL: pgsql/src/backend/access/rtree/rtscan.c,v 1.52 2004/07/01 00:49:31 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -42,6 +42,7 @@ static void adjustiptr(IndexScanDesc s, ItemPointer iptr, typedef struct RTScanListData { IndexScanDesc rtsl_scan; + TransactionId rtsl_creatingXid; struct RTScanListData *rtsl_next; } RTScanListData; @@ -240,6 +241,7 @@ rtregscan(IndexScanDesc s) l = (RTScanList) palloc(sizeof(RTScanListData)); l->rtsl_scan = s; + l->rtsl_creatingXid = GetCurrentTransactionId(); l->rtsl_next = RTScans; RTScans = l; } @@ -290,6 +292,46 @@ AtEOXact_rtree(void) RTScans = NULL; } +/* + * AtEOSubXact_rtree() --- clean up rtree subsystem at subxact abort or commit. + * + * This is here because it needs to touch this module's static var RTScans. + */ +void +AtEOSubXact_rtree(TransactionId childXid) +{ + RTScanList l; + RTScanList prev; + RTScanList next; + + /* + * Note: these actions should only be necessary during xact abort; but + * they can't hurt during a commit. + */ + + /* + * Forget active scans that were started in this subtransaction. + */ + prev = NULL; + + for (l = RTScans; l != NULL; l = next) + { + next = l->rtsl_next; + if (l->rtsl_creatingXid == childXid) + { + if (prev == NULL) + RTScans = next; + else + prev->rtsl_next = next; + + pfree(l); + /* prev does not change */ + } + else + prev = l; + } +} + void rtadjscans(Relation r, int op, BlockNumber blkno, OffsetNumber offnum) { |