diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2011-08-10 12:20:45 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2011-08-10 12:20:45 -0400 |
commit | 989f530d3f793ed1c990d705d0958bfd2a533b85 (patch) | |
tree | a6676b9e587c9caf40b0e8dfd99bbd6bab4dd35f /src/backend/replication/walsender.c | |
parent | 74d099494c5853a44188316ba117a8909b299d40 (diff) |
Back-patch assorted latch-related fixes.
Fix a whole bunch of signal handlers that had been hacked to do things that
might change errno, without adding the necessary save/restore logic for
errno. Also make some minor fixes in unix_latch.c, and clean up bizarre
and unsafe scheme for disowning the process's latch. While at it, rename
the PGPROC latch field to procLatch for consistency with 9.2.
Issues noted while reviewing a patch by Peter Geoghegan.
Diffstat (limited to 'src/backend/replication/walsender.c')
-rw-r--r-- | src/backend/replication/walsender.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index aaa048525b4..bc7b3146b7b 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -1188,18 +1188,26 @@ XLogSend(char *msgbuf, bool *caughtup) static void WalSndSigHupHandler(SIGNAL_ARGS) { + int save_errno = errno; + got_SIGHUP = true; if (MyWalSnd) SetLatch(&MyWalSnd->latch); + + errno = save_errno; } /* SIGTERM: set flag to shut down */ static void WalSndShutdownHandler(SIGNAL_ARGS) { + int save_errno = errno; + walsender_shutdown_requested = true; if (MyWalSnd) SetLatch(&MyWalSnd->latch); + + errno = save_errno; } /* @@ -1238,16 +1246,24 @@ WalSndQuickDieHandler(SIGNAL_ARGS) static void WalSndXLogSendHandler(SIGNAL_ARGS) { + int save_errno = errno; + latch_sigusr1_handler(); + + errno = save_errno; } /* SIGUSR2: set flag to do a last cycle and shut down afterwards */ static void WalSndLastCycleHandler(SIGNAL_ARGS) { + int save_errno = errno; + walsender_ready_to_stop = true; if (MyWalSnd) SetLatch(&MyWalSnd->latch); + + errno = save_errno; } /* Set up signal handlers */ |