From eebbba4924a498a8887259ce1565059f8661e117 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@enterprisedb.com>
Date: Wed, 10 Oct 2018 14:50:53 +1300
Subject: [PATCH 2/2] Remove async-signal-unsafe bgworker_die() function.

The default SIGTERM handler for background workers called ereport()
directly.  Hopefully background workers typically install their own
handler, but for the benefit of those that don't, let's install the
standard die() handler instead.  That defers handling until the next
CHECK_FOR_INTERRUPTS().

Author: Thomas Munro
Discussion: https://postgr.es/m/CA%2BTgmobwExL4kNj_eXJxPah_tVQ31N0cYDbUN0FFm6uaY_%2BX%3Dw%40mail.gmail.com
---
 src/backend/postmaster/bgworker.c | 16 +---------------
 1 file changed, 1 insertion(+), 15 deletions(-)

diff --git a/src/backend/postmaster/bgworker.c b/src/backend/postmaster/bgworker.c
index d2b695e1462..13f48244e79 100644
--- a/src/backend/postmaster/bgworker.c
+++ b/src/backend/postmaster/bgworker.c
@@ -661,20 +661,6 @@ bgworker_quickdie(SIGNAL_ARGS)
 	_exit(2);
 }
 
-/*
- * Standard SIGTERM handler for background workers
- */
-static void
-bgworker_die(SIGNAL_ARGS)
-{
-	PG_SETMASK(&BlockSig);
-
-	ereport(FATAL,
-			(errcode(ERRCODE_ADMIN_SHUTDOWN),
-			 errmsg("terminating background worker \"%s\" due to administrator command",
-					MyBgworkerEntry->bgw_type)));
-}
-
 /*
  * Standard SIGUSR1 handler for unconnected workers
  *
@@ -751,7 +737,7 @@ StartBackgroundWorker(void)
 		pqsignal(SIGUSR1, bgworker_sigusr1_handler);
 		pqsignal(SIGFPE, SIG_IGN);
 	}
-	pqsignal(SIGTERM, bgworker_die);
+	pqsignal(SIGTERM, die);		/* die at next CFI */
 	pqsignal(SIGHUP, SIG_IGN);
 
 	pqsignal(SIGQUIT, bgworker_quickdie);
-- 
2.17.1 (Apple Git-112)

