diff options
Diffstat (limited to 'src/backend/storage/ipc')
-rw-r--r-- | src/backend/storage/ipc/sinval.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/backend/storage/ipc/sinval.c b/src/backend/storage/ipc/sinval.c index 5e48d011788..98eb814dc3d 100644 --- a/src/backend/storage/ipc/sinval.c +++ b/src/backend/storage/ipc/sinval.c @@ -180,11 +180,15 @@ HandleCatchupInterrupt(void) /* * We may be called while ImmediateInterruptOK is true; turn it off - * while messing with the catchup state. (We would have to save and - * restore it anyway, because PGSemaphore operations inside - * ProcessCatchupEvent() might reset it.) + * while messing with the catchup state. This prevents problems if + * SIGINT or similar arrives while we're working. Just to be real + * sure, bump the interrupt holdoff counter as well. That way, even + * if something inside ProcessCatchupEvent() transiently sets + * ImmediateInterruptOK (eg while waiting on a lock), we won't get + * interrupted until we're done with the catchup interrupt. */ ImmediateInterruptOK = false; + HOLD_INTERRUPTS(); /* * I'm not sure whether some flavors of Unix might allow another @@ -208,8 +212,10 @@ HandleCatchupInterrupt(void) } /* - * Restore ImmediateInterruptOK, and check for interrupts if needed. + * Restore the holdoff level and ImmediateInterruptOK, and check for + * interrupts if needed. */ + RESUME_INTERRUPTS(); ImmediateInterruptOK = save_ImmediateInterruptOK; if (save_ImmediateInterruptOK) CHECK_FOR_INTERRUPTS(); |