]> granicus.if.org Git - postgresql/commitdiff
Don't unblock SIGQUIT in the SIGQUIT handler
authorPeter Eisentraut <peter_e@gmx.net>
Wed, 16 Dec 2009 23:05:00 +0000 (23:05 +0000)
committerPeter Eisentraut <peter_e@gmx.net>
Wed, 16 Dec 2009 23:05:00 +0000 (23:05 +0000)
This was possibly linked to a deadlock-like situation in glibc syslog code
invoked by the ereport call in quickdie().  In any case, a signal handler
should not unblock its own signal unless there is a specific reason to.

src/backend/tcop/postgres.c
src/include/libpq/pqsignal.h

index 884748c9b125a7f4a3a9622c05ac854d664f66c7..f2e892374b0c830cc82486233ab8e87c506bbc19 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.577 2009/12/16 22:55:33 petere Exp $
+ *       $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.578 2009/12/16 23:05:00 petere Exp $
  *
  * NOTES
  *       this is the "main" module of the postgres backend and
@@ -2538,6 +2538,7 @@ drop_unnamed_stmt(void)
 void
 quickdie(SIGNAL_ARGS)
 {
+       sigaddset(&BlockSig, SIGQUIT); /* prevent nested calls */
        PG_SETMASK(&BlockSig);
 
        /*
index 6061898b36bb90b5b10caf6423af962b2fecb233..90237f947a470acec1a54d1d32f2b7fab880a196 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/libpq/pqsignal.h,v 1.35 2009/12/16 22:55:34 petere Exp $
+ * $PostgreSQL: pgsql/src/include/libpq/pqsignal.h,v 1.36 2009/12/16 23:05:00 petere Exp $
  *
  * NOTES
  *       This shouldn't be in libpq, but the monitor and some other
@@ -38,6 +38,7 @@ extern int    UnBlockSig,
 int                    pqsigsetmask(int mask);
 #endif
 
+#define sigaddset(set, signum) (*(set) |= (sigmask(signum)))
 #define sigdelset(set, signum) (*(set) &= ~(sigmask(signum)))
 #endif /* not HAVE_SIGPROCMASK */