Mercurial > hg
changeset 40119:e70b616a077b
rust-chg: remove SIGCHLD handler which won't work in oxidized chg
Since pager is managed by the Rust part, the C code doesn't know the pager
pid. I could make the Rust part teach the pid to C, but still installing
SIGCHLD handler seems horrible idea since we no longer use handcrafted
low-level process management functions.
Instead, I'm thinking of adding async handler to send SIGPIPE at the exit
of the pager.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Mon, 24 Sep 2018 22:19:49 +0900 |
parents | cd490ac908c0 |
children | 89742f1fa6cb |
files | rust/chg/src/sighandlers.c rust/chg/src/uihandler.rs |
diffstat | 2 files changed, 4 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/rust/chg/src/sighandlers.c Mon Sep 24 22:04:57 2018 +0900 +++ b/rust/chg/src/sighandlers.c Mon Sep 24 22:19:49 2018 +0900 @@ -11,16 +11,8 @@ #include <errno.h> #include <signal.h> #include <string.h> -#include <sys/wait.h> #include <unistd.h> -#ifdef __GNUC__ -#define UNUSED_ __attribute__((unused)) -#else -#define UNUSED_ -#endif - -static pid_t pagerpid = 0; static pid_t peerpgid = 0; static pid_t peerpid = 0; @@ -65,17 +57,6 @@ return; } -static void handlechildsignal(int sig UNUSED_) -{ - if (peerpid == 0 || pagerpid == 0) - return; - /* if pager exits, notify the server with SIGPIPE immediately. - * otherwise the server won't get SIGPIPE if it does not write - * anything. (issue5278) */ - if (waitpid(pagerpid, NULL, WNOHANG) == pagerpid) - kill(peerpid, SIGPIPE); -} - /* * Installs signal handlers. * @@ -131,11 +112,6 @@ sa.sa_flags = SA_RESTART; if (sigaction(SIGTSTP, &sa, NULL) < 0) return -1; - /* get notified when pager exits */ - sa.sa_handler = handlechildsignal; - sa.sa_flags = SA_RESTART; - if (sigaction(SIGCHLD, &sa, NULL) < 0) - return -1; return 0; } @@ -164,8 +140,6 @@ return -1; if (sigaction(SIGTSTP, &sa, NULL) < 0) return -1; - if (sigaction(SIGCHLD, &sa, NULL) < 0) - return -1; /* ignore Ctrl+C while shutting down to make pager exits cleanly */ sa.sa_handler = SIG_IGN;
--- a/rust/chg/src/uihandler.rs Mon Sep 24 22:04:57 2018 +0900 +++ b/rust/chg/src/uihandler.rs Mon Sep 24 22:19:49 2018 +0900 @@ -53,6 +53,10 @@ .spawn_async()?; let pin = pager.stdin().take().unwrap(); procutil::set_blocking_fd(pin.as_raw_fd())?; + // TODO: if pager exits, notify the server with SIGPIPE immediately. + // otherwise the server won't get SIGPIPE if it does not write + // anything. (issue5278) + // kill(peerpid, SIGPIPE); tokio::spawn(pager.map(|_| ()).map_err(|_| ())); // just ignore errors Ok((self, pin)) }