diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2024-11-01 13:47:20 +0200 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2024-11-01 13:47:20 +0200 |
commit | a9c546a5a3783810a1b665f246fc6d0a596d0606 (patch) | |
tree | 24dd96745733f9a63f0a68d7c19773e64fa6a81d /src/backend/access/transam/xlogwait.c | |
parent | e819bbb7c82ac048ffd865ba3f2d2c4933923c77 (diff) | |
download | postgresql-a9c546a5a3783810a1b665f246fc6d0a596d0606.tar.gz postgresql-a9c546a5a3783810a1b665f246fc6d0a596d0606.zip |
Use ProcNumbers instead of direct Latch pointers to address other procs
This is in preparation for replacing Latches with a new abstraction.
That's still work in progress, but this seems a little tidier anyway,
so let's get this refactoring out of the way already.
Discussion: https://www.postgresql.org/message-id/391abe21-413e-4d91-a650-b663af49500c%40iki.fi
Diffstat (limited to 'src/backend/access/transam/xlogwait.c')
-rw-r--r-- | src/backend/access/transam/xlogwait.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/src/backend/access/transam/xlogwait.c b/src/backend/access/transam/xlogwait.c index 0ec0898cfbf..9b8c2ae794f 100644 --- a/src/backend/access/transam/xlogwait.c +++ b/src/backend/access/transam/xlogwait.c @@ -112,7 +112,7 @@ addLSNWaiter(XLogRecPtr lsn) Assert(!procInfo->inHeap); - procInfo->latch = MyLatch; + procInfo->procno = MyProcNumber; procInfo->waitLSN = lsn; pairingheap_add(&waitLSNState->waitersHeap, &procInfo->phNode); @@ -154,16 +154,17 @@ void WaitLSNSetLatches(XLogRecPtr currentLSN) { int i; - Latch **wakeUpProcLatches; + ProcNumber *wakeUpProcs; int numWakeUpProcs = 0; - wakeUpProcLatches = palloc(sizeof(Latch *) * MaxBackends); + wakeUpProcs = palloc(sizeof(ProcNumber) * MaxBackends); LWLockAcquire(WaitLSNLock, LW_EXCLUSIVE); /* * Iterate the pairing heap of waiting processes till we find LSN not yet - * replayed. Record the process latches to set them later. + * replayed. Record the process numbers to wake up, but to avoid holding + * the lock for too long, send the wakeups only after releasing the lock. */ while (!pairingheap_is_empty(&waitLSNState->waitersHeap)) { @@ -174,7 +175,7 @@ WaitLSNSetLatches(XLogRecPtr currentLSN) procInfo->waitLSN > currentLSN) break; - wakeUpProcLatches[numWakeUpProcs++] = procInfo->latch; + wakeUpProcs[numWakeUpProcs++] = procInfo->procno; (void) pairingheap_remove_first(&waitLSNState->waitersHeap); procInfo->inHeap = false; } @@ -191,9 +192,9 @@ WaitLSNSetLatches(XLogRecPtr currentLSN) */ for (i = 0; i < numWakeUpProcs; i++) { - SetLatch(wakeUpProcLatches[i]); + SetLatch(&GetPGProcByNumber(wakeUpProcs[i])->procLatch); } - pfree(wakeUpProcLatches); + pfree(wakeUpProcs); } /* |