aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/ipc/sinvaladt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/storage/ipc/sinvaladt.c')
-rw-r--r--src/backend/storage/ipc/sinvaladt.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/backend/storage/ipc/sinvaladt.c b/src/backend/storage/ipc/sinvaladt.c
index e7c3fb2f548..e6805d96b1c 100644
--- a/src/backend/storage/ipc/sinvaladt.c
+++ b/src/backend/storage/ipc/sinvaladt.c
@@ -25,6 +25,7 @@
#include "storage/shmem.h"
#include "storage/sinvaladt.h"
#include "storage/spin.h"
+#include "access/transam.h"
/*
@@ -401,6 +402,37 @@ BackendIdGetProc(int backendID)
}
/*
+ * BackendIdGetTransactionIds
+ * Get the xid and xmin of the backend. The result may be out of date
+ * arbitrarily quickly, so the caller must be careful about how this
+ * information is used.
+ */
+void
+BackendIdGetTransactionIds(int backendID, TransactionId *xid, TransactionId *xmin)
+{
+ ProcState *stateP;
+ SISeg *segP = shmInvalBuffer;
+ PGXACT *xact;
+
+ *xid = InvalidTransactionId;
+ *xmin = InvalidTransactionId;
+
+ /* Need to lock out additions/removals of backends */
+ LWLockAcquire(SInvalWriteLock, LW_SHARED);
+
+ if (backendID > 0 && backendID <= segP->lastBackend)
+ {
+ stateP = &segP->procState[backendID - 1];
+ xact = &ProcGlobal->allPgXact[stateP->proc->pgprocno];
+
+ *xid = xact->xid;
+ *xmin = xact->xmin;
+ }
+
+ LWLockRelease(SInvalWriteLock);
+}
+
+/*
* SIInsertDataEntries
* Add new invalidation message(s) to the buffer.
*/