aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/ipc/sinval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/storage/ipc/sinval.c')
-rw-r--r--src/backend/storage/ipc/sinval.c14
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();