From f690acf1044b823edbe85a67f5503a4c111bff2e Mon Sep 17 00:00:00 2001 From: Tom Lane <tgl@sss.pgh.pa.us> Date: Tue, 18 Feb 2003 02:53:29 +0000 Subject: [PATCH] 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. --- src/backend/commands/async.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c index a3c27b8f810..169c4ce278c 100644 --- a/src/backend/commands/async.c +++ b/src/backend/commands/async.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/async.c,v 1.91 2002/09/16 01:24:41 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/async.c,v 1.92 2003/02/18 02:53:29 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -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 { -- GitLab