aboutsummaryrefslogtreecommitdiffstats
path: root/lib-src
diff options
context:
space:
mode:
authorPaul Eggert2018-12-06 08:54:00 -0800
committerPaul Eggert2018-12-06 10:48:04 -0800
commit2f985977f691a37a6d45298128b88d0cefcc93a1 (patch)
treeae4c47f464e89d2a48593ea17da7ac3f4dd10058 /lib-src
parentc5b6f1672bc62d9ffdd3c7200074727a4608af03 (diff)
downloademacs-2f985977f691a37a6d45298128b88d0cefcc93a1.tar.gz
emacs-2f985977f691a37a6d45298128b88d0cefcc93a1.zip
Fix emacsclient hang when backgrounded
Problem reported by Kaushal Modi in: https://lists.gnu.org/r/emacs-devel/2018-12/msg00083.html The tcdrain call replaced an fdatasync call which had no effect on the tty, so removing it entirely shouldn’t cause problems. The fdatasync call replaced an fsync call which also had no effect on the tty, and the fsync call seems to be badly-merged revenant of emacsclient’s old (circa 2004) way of communicating to and from Emacs via FILE * streams, where fsync was apparently needed when talking to sockets. * lib-src/emacsclient.c [!DOS_NT]: Don’t include termios.h. (flush_stdout): Remove. All callers removed. (main): Do not drain the tty after "Waiting for Emacs..." message. There should be no need to drain, and draining it might send us a SIGTTOU. Do not fflush stdout just before exiting, as exiting does that for us.
Diffstat (limited to 'lib-src')
-rw-r--r--lib-src/emacsclient.c16
1 files changed, 1 insertions, 15 deletions
diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c
index 7de36651143..653ab955df5 100644
--- a/lib-src/emacsclient.c
+++ b/lib-src/emacsclient.c
@@ -66,10 +66,6 @@ char *w32_getenv (const char *);
66 66
67#endif /* !WINDOWSNT */ 67#endif /* !WINDOWSNT */
68 68
69#ifndef DOS_NT
70# include <termios.h>
71#endif
72
73#include <ctype.h> 69#include <ctype.h>
74#include <errno.h> 70#include <errno.h>
75#include <getopt.h> 71#include <getopt.h>
@@ -1740,15 +1736,6 @@ start_daemon_and_retry_set_socket (void)
1740 return emacs_socket; 1736 return emacs_socket;
1741} 1737}
1742 1738
1743/* Flush standard output and its underlying file descriptor. */
1744static void
1745flush_stdout (HSOCKET emacs_socket)
1746{
1747 fflush (stdout);
1748 while (tcdrain (STDOUT_FILENO) != 0 && errno == EINTR)
1749 act_on_signals (emacs_socket);
1750}
1751
1752int 1739int
1753main (int argc, char **argv) 1740main (int argc, char **argv)
1754{ 1741{
@@ -1964,7 +1951,7 @@ main (int argc, char **argv)
1964 printf ("Waiting for Emacs..."); 1951 printf ("Waiting for Emacs...");
1965 skiplf = false; 1952 skiplf = false;
1966 } 1953 }
1967 flush_stdout (emacs_socket); 1954 fflush (stdout);
1968 1955
1969 /* Now, wait for an answer and print any messages. */ 1956 /* Now, wait for an answer and print any messages. */
1970 while (exit_status == EXIT_SUCCESS) 1957 while (exit_status == EXIT_SUCCESS)
@@ -2067,7 +2054,6 @@ main (int argc, char **argv)
2067 2054
2068 if (!skiplf) 2055 if (!skiplf)
2069 printf ("\n"); 2056 printf ("\n");
2070 flush_stdout (emacs_socket);
2071 2057
2072 if (rl < 0) 2058 if (rl < 0)
2073 exit_status = EXIT_FAILURE; 2059 exit_status = EXIT_FAILURE;