mirror of
https://github.com/postgres/postgres.git
synced 2025-11-06 07:49:08 +03:00
Add a default local latch for use in signal handlers.
To do so, move InitializeLatchSupport() into the new common process initialization functions, and add a new global variable MyLatch. MyLatch is usable as soon InitPostmasterChild() has been called (i.e. very early during startup). Initially it points to a process local latch that exists in all processes. InitProcess/InitAuxiliaryProcess then replaces that local latch with PGPROC->procLatch. During shutdown the reverse happens. This is primarily advantageous for two reasons: For one it simplifies dealing with the shared process latch, especially in signal handlers, because instead of having to check for MyProc, MyLatch can be used unconditionally. For another, a later patch that makes FEs/BE communication use latches, now can rely on the existence of a latch, even before having gone through InitProcess. Discussion: 20140927191243.GD5423@alap3.anarazel.de
This commit is contained in:
@@ -827,13 +827,13 @@ shm_mq_send_bytes(shm_mq_handle *mqh, Size nbytes, const void *data,
|
||||
* at top of loop, because setting an already-set latch is much
|
||||
* cheaper than setting one that has been reset.
|
||||
*/
|
||||
WaitLatch(&MyProc->procLatch, WL_LATCH_SET, 0);
|
||||
WaitLatch(MyLatch, WL_LATCH_SET, 0);
|
||||
|
||||
/* An interrupt may have occurred while we were waiting. */
|
||||
CHECK_FOR_INTERRUPTS();
|
||||
|
||||
/* Reset the latch so we don't spin. */
|
||||
ResetLatch(&MyProc->procLatch);
|
||||
ResetLatch(MyLatch);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -924,13 +924,13 @@ shm_mq_receive_bytes(shm_mq *mq, Size bytes_needed, bool nowait,
|
||||
* loop, because setting an already-set latch is much cheaper than
|
||||
* setting one that has been reset.
|
||||
*/
|
||||
WaitLatch(&MyProc->procLatch, WL_LATCH_SET, 0);
|
||||
WaitLatch(MyLatch, WL_LATCH_SET, 0);
|
||||
|
||||
/* An interrupt may have occurred while we were waiting. */
|
||||
CHECK_FOR_INTERRUPTS();
|
||||
|
||||
/* Reset the latch so we don't spin. */
|
||||
ResetLatch(&MyProc->procLatch);
|
||||
ResetLatch(MyLatch);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -991,13 +991,13 @@ shm_mq_wait_internal(volatile shm_mq *mq, PGPROC *volatile * ptr,
|
||||
}
|
||||
|
||||
/* Wait to be signalled. */
|
||||
WaitLatch(&MyProc->procLatch, WL_LATCH_SET, 0);
|
||||
WaitLatch(MyLatch, WL_LATCH_SET, 0);
|
||||
|
||||
/* An interrupt may have occurred while we were waiting. */
|
||||
CHECK_FOR_INTERRUPTS();
|
||||
|
||||
/* Reset the latch so we don't spin. */
|
||||
ResetLatch(&MyProc->procLatch);
|
||||
ResetLatch(MyLatch);
|
||||
}
|
||||
}
|
||||
PG_CATCH();
|
||||
|
||||
Reference in New Issue
Block a user