# HG changeset patch # User Yuya Nishihara # Date 1537795189 -32400 # Node ID e70b616a077bd2951c7549d4dc4f9c0b73277178 # Parent cd490ac908c013077b28d5dbd32dd4f260c97023 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. diff -r cd490ac908c0 -r e70b616a077b rust/chg/src/sighandlers.c --- 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 #include #include -#include #include -#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; diff -r cd490ac908c0 -r e70b616a077b rust/chg/src/uihandler.rs --- 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)) }