diff --git a/src/backend/storage/lmgr/procarraylock.c b/src/backend/storage/lmgr/procarraylock.c index 7cd4b6b..13b51cb 100644 --- a/src/backend/storage/lmgr/procarraylock.c +++ b/src/backend/storage/lmgr/procarraylock.c @@ -153,9 +153,10 @@ ProcArrayLockClearTransaction(TransactionId latestXid) { volatile ProcArrayLockStruct *lock = ProcArrayLockPointer(); PGPROC *proc = MyProc; - int extraWaits = 0; bool mustwait; + Assert(TransactionIdIsValid(latestXid)); + HOLD_INTERRUPTS(); /* Acquire mutex. Time spent holding mutex should be short! */ @@ -186,8 +187,11 @@ ProcArrayLockClearTransaction(TransactionId latestXid) /* Rats, must wait. */ proc->flWaitLink = lock->ending; lock->ending = proc; - if (!TransactionIdIsValid(lock->latest_ending_xid) || - TransactionIdPrecedes(lock->latest_ending_xid, latestXid)) + /* + * lock->latest_ending_xid may be invalid, but invalid transaction + * IDs always precede valid ones. + */ + if (TransactionIdPrecedes(lock->latest_ending_xid, latestXid)) lock->latest_ending_xid = latestXid; mustwait = true; } @@ -202,7 +206,9 @@ ProcArrayLockClearTransaction(TransactionId latestXid) */ if (mustwait) { - extraWaits += FlexLockWait(ProcArrayLock, 2); + int extraWaits; + + extraWaits = FlexLockWait(ProcArrayLock, 2); while (extraWaits-- > 0) PGSemaphoreUnlock(&proc->sem); } @@ -247,7 +253,7 @@ ProcArrayLockRelease(void) ending = lock->ending; vproc = ending; - while (vproc != NULL) + do { volatile PGXACT *pgxact = &ProcGlobal->allPgXact[vproc->pgprocno]; @@ -258,7 +264,7 @@ ProcArrayLockRelease(void) pgxact->nxids = 0; pgxact->overflowed = false; vproc = vproc->flWaitLink; - } + } while (vproc != NULL); /* Also advance global latestCompletedXid */ if (TransactionIdPrecedes(ShmemVariableCache->latestCompletedXid,