From d7e8979b2e280ffbb4523e372a33161b683fc038 Mon Sep 17 00:00:00 2001 From: Pavel Borisov Date: Tue, 8 Nov 2022 15:00:58 +0400 Subject: [PATCH] Invert wakeup queue order --- src/backend/storage/lmgr/lwlock.c | 43 +++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c index f5a149b4f42..c07bc174351 100644 --- a/src/backend/storage/lmgr/lwlock.c +++ b/src/backend/storage/lmgr/lwlock.c @@ -1597,7 +1597,8 @@ LWLockUpdateVar(LWLock *lock, uint64 *valptr, uint64 val) oldHead = INVALID_LOCK_PROCNO, oldTail = INVALID_LOCK_PROCNO, oldReplaceHead = INVALID_LOCK_PROCNO, - wakeupTail = INVALID_LOCK_PROCNO; + wakeupHead = INVALID_LOCK_PROCNO, + wakeupCur = INVALID_LOCK_PROCNO; PRINT_LWDEBUG("LWLockUpdateVar", lock, LW_EXCLUSIVE); @@ -1709,9 +1710,14 @@ LWLockUpdateVar(LWLock *lock, uint64 *valptr, uint64 val) newTail = newHead; /* Push to the wakeup list */ - Assert(pgprocno != wakeupTail); - NextReleaseLink(pgprocno) = wakeupTail; - wakeupTail = pgprocno; + Assert(pgprocno != wakeupHead); + if (wakeupHead == INVALID_LOCK_PROCNO) + wakeupHead = wakeupCur = pgprocno; + else + NextReleaseLink(wakeupCur) = pgprocno; + + NextReleaseLink(pgprocno) = INVALID_LOCK_PROCNO; + wakeupCur = pgprocno; } else { @@ -1737,7 +1743,7 @@ LWLockUpdateVar(LWLock *lock, uint64 *valptr, uint64 val) } /* Awaken any waiters removed from the queue. */ - awakenWaiters(wakeupTail, lock); + awakenWaiters(wakeupHead, lock); } /* @@ -1757,7 +1763,8 @@ LWLockRelease(LWLock *lock) oldTail = INVALID_LOCK_PROCNO, oldReplaceHead = INVALID_LOCK_PROCNO, oldReplaceTail = INVALID_LOCK_PROCNO, - wakeupTail = INVALID_LOCK_PROCNO; + wakeupHead = INVALID_LOCK_PROCNO, + wakeupCur = INVALID_LOCK_PROCNO; bool new_release_ok = true; bool wakeup = false; LWLockMode lastMode = LW_WAIT_UNTIL_FREE; @@ -1966,9 +1973,14 @@ LWLockRelease(LWLock *lock) nextStepPrevPgprocno = prevPgprocno; /* Push to the wakeup list */ - Assert(pgprocno != wakeupTail); - NextReleaseLink(pgprocno) = wakeupTail; - wakeupTail = pgprocno; + Assert(pgprocno != wakeupHead); + if (wakeupHead == INVALID_LOCK_PROCNO) + wakeupHead = wakeupCur = pgprocno; + else + NextReleaseLink(wakeupCur) = pgprocno; + + NextReleaseLink(pgprocno) = INVALID_LOCK_PROCNO; + wakeupCur = pgprocno; } else { @@ -2013,9 +2025,14 @@ LWLockRelease(LWLock *lock) } /* Push to the wakeup list */ - Assert(pgprocno != wakeupTail); - NextReleaseLink(pgprocno) = wakeupTail; - wakeupTail = pgprocno; + Assert(pgprocno != wakeupHead); + if (wakeupHead == INVALID_LOCK_PROCNO) + wakeupHead = wakeupCur = pgprocno; + else + NextReleaseLink(wakeupCur) = pgprocno; + + NextReleaseLink(pgprocno) = INVALID_LOCK_PROCNO; + wakeupCur = pgprocno; } } @@ -2040,7 +2057,7 @@ LWLockRelease(LWLock *lock) } /* Awaken any waiters removed from the queue. */ - awakenWaiters(wakeupTail, lock); + awakenWaiters(wakeupHead, lock); /* Now okay to allow cancel/die interrupts. */ RESUME_INTERRUPTS(); -- 2.24.3 (Apple Git-128)