diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c index a3c27b8f810..fa4c2429dbc 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.91.2.1 2003/02/18 02:53:46 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 {