Assert(TransactionIdIsValid(allPgXact[proc->pgprocno].xid));
/* Add ourselves to the list of processes needing a group XID clear. */
- proc->clearXid = true;
- proc->backendLatestXid = latestXid;
+ proc->procArrayGroupMember = true;
+ proc->procArrayGroupMemberXid = latestXid;
while (true)
{
- nextidx = pg_atomic_read_u32(&procglobal->firstClearXidElem);
- pg_atomic_write_u32(&proc->nextClearXidElem, nextidx);
+ nextidx = pg_atomic_read_u32(&procglobal->procArrayGroupFirst);
+ pg_atomic_write_u32(&proc->procArrayGroupNext, nextidx);
- if (pg_atomic_compare_exchange_u32(&procglobal->firstClearXidElem,
+ if (pg_atomic_compare_exchange_u32(&procglobal->procArrayGroupFirst,
&nextidx,
(uint32) proc->pgprocno))
break;
{
/* acts as a read barrier */
PGSemaphoreLock(&proc->sem);
- if (!proc->clearXid)
+ if (!proc->procArrayGroupMember)
break;
extraWaits++;
}
- Assert(pg_atomic_read_u32(&proc->nextClearXidElem) == INVALID_PGPROCNO);
+ Assert(pg_atomic_read_u32(&proc->procArrayGroupNext) == INVALID_PGPROCNO);
/* Fix semaphore count for any absorbed wakeups */
while (extraWaits-- > 0)
*/
while (true)
{
- nextidx = pg_atomic_read_u32(&procglobal->firstClearXidElem);
- if (pg_atomic_compare_exchange_u32(&procglobal->firstClearXidElem,
+ nextidx = pg_atomic_read_u32(&procglobal->procArrayGroupFirst);
+ if (pg_atomic_compare_exchange_u32(&procglobal->procArrayGroupFirst,
&nextidx,
INVALID_PGPROCNO))
break;
PGPROC *proc = &allProcs[nextidx];
PGXACT *pgxact = &allPgXact[nextidx];
- ProcArrayEndTransactionInternal(proc, pgxact, proc->backendLatestXid);
+ ProcArrayEndTransactionInternal(proc, pgxact, proc->procArrayGroupMemberXid);
/* Move to next proc in list. */
- nextidx = pg_atomic_read_u32(&proc->nextClearXidElem);
+ nextidx = pg_atomic_read_u32(&proc->procArrayGroupNext);
}
/* We're done with the lock now. */
{
PGPROC *proc = &allProcs[wakeidx];
- wakeidx = pg_atomic_read_u32(&proc->nextClearXidElem);
- pg_atomic_write_u32(&proc->nextClearXidElem, INVALID_PGPROCNO);
+ wakeidx = pg_atomic_read_u32(&proc->procArrayGroupNext);
+ pg_atomic_write_u32(&proc->procArrayGroupNext, INVALID_PGPROCNO);
/* ensure all previous writes are visible before follower continues. */
pg_write_barrier();
- proc->clearXid = false;
+ proc->procArrayGroupMember = false;
if (proc != MyProc)
PGSemaphoreUnlock(&proc->sem);
ProcGlobal->startupBufferPinWaitBufId = -1;
ProcGlobal->walwriterLatch = NULL;
ProcGlobal->checkpointerLatch = NULL;
- pg_atomic_init_u32(&ProcGlobal->firstClearXidElem, INVALID_PGPROCNO);
+ pg_atomic_init_u32(&ProcGlobal->procArrayGroupFirst, INVALID_PGPROCNO);
/*
* Create and initialize all the PGPROC structures we'll need. There are
SHMQueueElemInit(&(MyProc->syncRepLinks));
/* Initialize fields for group XID clearing. */
- MyProc->clearXid = false;
- MyProc->backendLatestXid = InvalidTransactionId;
- pg_atomic_init_u32(&MyProc->nextClearXidElem, INVALID_PGPROCNO);
+ MyProc->procArrayGroupMember = false;
+ MyProc->procArrayGroupMemberXid = InvalidTransactionId;
+ pg_atomic_init_u32(&MyProc->procArrayGroupNext, INVALID_PGPROCNO);
/* Check that group locking fields are in a proper initial state. */
Assert(MyProc->lockGroupLeaderIdentifier == 0);
struct XidCache subxids; /* cache for subtransaction XIDs */
/* Support for group XID clearing. */
- bool clearXid;
- pg_atomic_uint32 nextClearXidElem;
- TransactionId backendLatestXid;
+ /* true, if member of ProcArray group waiting for XID clear */
+ bool procArrayGroupMember;
+ /* next ProcArray group member waiting for XID clear */
+ pg_atomic_uint32 procArrayGroupNext;
+ /*
+ * latest transaction id among the transaction's main XID and
+ * subtransactions
+ */
+ TransactionId procArrayGroupMemberXid;
/* Per-backend LWLock. Protects fields below. */
LWLock backendLock;
/* Head of list of bgworker free PGPROC structures */
PGPROC *bgworkerFreeProcs;
/* First pgproc waiting for group XID clear */
- pg_atomic_uint32 firstClearXidElem;
+ pg_atomic_uint32 procArrayGroupFirst;
/* WALWriter process's latch */
Latch *walwriterLatch;
/* Checkpointer process's latch */