>From 46b810081165fecae5086b71fafdb3eb19c30df5 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 6 Dec 2018 10:46:06 -0800 Subject: [PATCH 2/2] emacsclient: avoid background chatter * lib-src/emacsclient.c (process_grouping): New function. (act_on_signals, main): Use it. (main): Omit "Waiting for Emacs..." and later "\n" messages if in background, since that messes up the screen. --- lib-src/emacsclient.c | 51 ++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c index 653ab955df..c596fb23ae 100644 --- a/lib-src/emacsclient.c +++ b/lib-src/emacsclient.c @@ -1095,6 +1095,26 @@ find_tty (const char **tty_type, const char **tty_name, bool noabort) return true; } +/* Return the process group if in the foreground, the negative of the + process group if in the background, and zero if there is no + foreground process group for the controlling terminal. + Unfortunately, use of this function introduces an unavoidable race, + since whether the process is in the foreground or background can + change at any time. */ + +static pid_t +process_grouping (void) +{ +#ifdef SOCKETS_IN_FILE_SYSTEM + pid_t tcpgrp = tcgetpgrp (STDOUT_FILENO); + if (0 <= tcpgrp) + { + pid_t pgrp = getpgrp (); + return tcpgrp == pgrp ? pgrp : -pgrp; + } +#endif + return 0; +} #ifdef SOCKETS_IN_FILE_SYSTEM @@ -1253,21 +1273,17 @@ act_on_signals (HSOCKET emacs_socket) { got_sigcont = 0; took_action = true; - pid_t tcpgrp = tcgetpgrp (STDOUT_FILENO); - if (0 <= tcpgrp) + pid_t grouping = process_grouping (); + if (grouping < 0) { - pid_t pgrp = getpgrp (); - if (tcpgrp == pgrp) - { - /* We are in the foreground. */ - send_to_emacs (emacs_socket, "-resume \n"); - } - else if (tty) + if (tty) { - /* We are in the background; cancel the continue. */ - kill (-pgrp, SIGTTIN); + /* Cancel the continue. */ + kill (grouping, SIGTTIN); } } + else + send_to_emacs (emacs_socket, "-resume \n"); } if (got_sigtstp) @@ -1767,13 +1783,12 @@ main (int argc, char **argv) exit (EXIT_FAILURE); } -#ifndef WINDOWSNT +#ifdef SOCKETS_IN_FILE_SYSTEM if (tty) { - pid_t pgrp = getpgrp (); - pid_t tcpgrp = tcgetpgrp (STDOUT_FILENO); - if (0 <= tcpgrp && tcpgrp != pgrp) - kill (-pgrp, SIGTTIN); + pid_t grouping = process_grouping (); + if (grouping < 0) + kill (grouping, SIGTTIN); } #endif @@ -1946,7 +1961,7 @@ main (int argc, char **argv) send_to_emacs (emacs_socket, "\n"); /* Wait for an answer. */ - if (!eval && !tty && !nowait && !quiet) + if (!eval && !tty && !nowait && !quiet && 0 <= process_grouping ()) { printf ("Waiting for Emacs..."); skiplf = false; @@ -2052,7 +2067,7 @@ main (int argc, char **argv) } } - if (!skiplf) + if (!skiplf && 0 <= process_grouping ()) printf ("\n"); if (rl < 0) -- 2.19.2