diff options
Diffstat (limited to 'src/backend/storage/ipc/sinvaladt.c')
-rw-r--r-- | src/backend/storage/ipc/sinvaladt.c | 32 |
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. */ |