From: Tom Lane Date: Tue, 18 Feb 2003 02:53:46 +0000 (+0000) Subject: Async_NotifyHandler must save and restore ImmediateInterruptOK. Fixes X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=1e95b28c800bebdb2a9ea9c43942967c38d1d670;p=users%2Fbernd%2Fpostgres.git Async_NotifyHandler must save and restore ImmediateInterruptOK. Fixes 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. --- diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c index dc720132fb..069c3212cc 100644 --- a/src/backend/commands/async.c +++ b/src/backend/commands/async.c @@ -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 {