diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c index 75ddab1e706..ff6b0660669 100644 --- a/src/backend/commands/async.c +++ b/src/backend/commands/async.c @@ -1673,11 +1673,15 @@ HandleNotifyInterrupt(void) /* * We may be called while ImmediateInterruptOK is true; turn it off - * while messing with the NOTIFY state. (We would have to save and - * restore it anyway, because PGSemaphore operations inside - * ProcessIncomingNotify() might reset it.) + * while messing with the NOTIFY 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 ProcessIncomingNotify() transiently sets + * ImmediateInterruptOK (eg while waiting on a lock), we won't get + * interrupted until we're done with the notify interrupt. */ ImmediateInterruptOK = false; + HOLD_INTERRUPTS(); /* * I'm not sure whether some flavors of Unix might allow another @@ -1707,8 +1711,10 @@ HandleNotifyInterrupt(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(); diff --git a/src/backend/storage/ipc/sinval.c b/src/backend/storage/ipc/sinval.c index 9ab16b16ed1..ff45c03b473 100644 --- a/src/backend/storage/ipc/sinval.c +++ b/src/backend/storage/ipc/sinval.c @@ -174,11 +174,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 @@ -202,8 +206,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();