1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-01 01:04:50 +03:00

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.
This commit is contained in:
Tom Lane 2014-02-01 16:21:04 -05:00
parent fad443753e
commit 81b116d987

View File

@ -950,17 +950,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;
} }
/* /*