diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/storage/lmgr/condition_variable.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/backend/storage/lmgr/condition_variable.c b/src/backend/storage/lmgr/condition_variable.c index 25c5cd7b45b..ef1d5baf016 100644 --- a/src/backend/storage/lmgr/condition_variable.c +++ b/src/backend/storage/lmgr/condition_variable.c @@ -69,9 +69,11 @@ ConditionVariablePrepareToSleep(ConditionVariable *cv) { WaitEventSet *new_event_set; - new_event_set = CreateWaitEventSet(TopMemoryContext, 1); + new_event_set = CreateWaitEventSet(TopMemoryContext, 2); AddWaitEventToSet(new_event_set, WL_LATCH_SET, PGINVALID_SOCKET, MyLatch, NULL); + AddWaitEventToSet(new_event_set, WL_POSTMASTER_DEATH, PGINVALID_SOCKET, + NULL, NULL); /* Don't set cv_wait_event_set until we have a correct WES. */ cv_wait_event_set = new_event_set; } @@ -149,11 +151,20 @@ ConditionVariableSleep(ConditionVariable *cv, uint32 wait_event_info) CHECK_FOR_INTERRUPTS(); /* - * Wait for latch to be set. We don't care about the result because - * our contract permits spurious returns. + * Wait for latch to be set. (If we're awakened for some other + * reason, the code below will cope anyway.) */ WaitEventSetWait(cv_wait_event_set, -1, &event, 1, wait_event_info); + if (event.events & WL_POSTMASTER_DEATH) + { + /* + * Emergency bailout if postmaster has died. This is to avoid the + * necessity for manual cleanup of all postmaster children. + */ + exit(1); + } + /* Reset latch before examining the state of the wait list. */ ResetLatch(MyLatch); |