Async_NotifyHandler must save and restore ImmediateInterruptOK. Fixes
authorTom Lane <[email protected]>
Tue, 18 Feb 2003 02:53:46 +0000 (02:53 +0000)
committerTom Lane <[email protected]>
Tue, 18 Feb 2003 02:53:46 +0000 (02:53 +0000)
known problem with failure to respond to 'pg_ctl stop -m fast', and
probable problems if SIGINT or SIGTERM arrives while processing a
SIGUSR2 interrupt that arrived while waiting for a new client query.

src/backend/commands/async.c

index dc720132fbbc502680431dc284b6d8b86f08ac98..069c3212cc183d876b3b84c89b95b9c4ea020ace 100644 (file)
@@ -599,6 +599,16 @@ Async_NotifyHandler(SIGNAL_ARGS)
 
        if (notifyInterruptEnabled)
        {
+               bool            save_ImmediateInterruptOK = ImmediateInterruptOK;
+
+               /*
+                * 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.)
+                */
+               ImmediateInterruptOK = false;
+
                /*
                 * I'm not sure whether some flavors of Unix might allow another
                 * SIGUSR2 occurrence to recursively interrupt this routine. To
@@ -626,6 +636,13 @@ Async_NotifyHandler(SIGNAL_ARGS)
                                        elog(LOG, "Async_NotifyHandler: done");
                        }
                }
+
+               /*
+                * Restore ImmediateInterruptOK, and check for interrupts if needed.
+                */
+               ImmediateInterruptOK = save_ImmediateInterruptOK;
+               if (save_ImmediateInterruptOK)
+                       CHECK_FOR_INTERRUPTS();
        }
        else
        {