Skip to content
Snippets Groups Projects
Commit 03f06ff3 authored by Tom Lane's avatar Tom Lane
Browse files

Fix some more bugs in signal handlers and process shutdown logic.

WalSndKill was doing things exactly backwards: it should first clear
MyWalSnd (to stop signal handlers from touching MyWalSnd->latch),
then disown the latch, and only then mark the WalSnd struct unused by
clearing its pid field.

Also, WalRcvSigUsr1Handler and worker_spi_sighup failed to preserve
errno, which is surely a requirement for any signal handler.

Per discussion of recent buildfarm failures.  Back-patch as far
as the relevant code exists.
parent e5c22c15
No related branches found
No related tags found
No related merge requests found
...@@ -920,17 +920,23 @@ InitWalSnd(void) ...@@ -920,17 +920,23 @@ InitWalSnd(void)
static void static void
WalSndKill(int code, Datum arg) WalSndKill(int code, Datum arg)
{ {
Assert(MyWalSnd != NULL); WalSnd *walsnd = MyWalSnd;
Assert(walsnd != NULL);
/*
* Clear MyWalSnd first; then disown the latch. This is so that signal
* handlers won't try to touch the latch after it's no longer ours.
*/
MyWalSnd = NULL;
DisownLatch(&walsnd->latch);
/* /*
* Mark WalSnd struct no longer in use. Assume that no lock is required * Mark WalSnd struct no longer in use. Assume that no lock is required
* for this. * for this.
*/ */
MyWalSnd->pid = 0; walsnd->pid = 0;
DisownLatch(&MyWalSnd->latch);
/* WalSnd struct isn't mine anymore */
MyWalSnd = NULL;
} }
/* /*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment