aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2019-07-13 16:42:18 -0700
committerPaul Eggert2019-07-13 16:53:21 -0700
commit34810ab4f9990a8de1e503fdf6b485d8eeea1601 (patch)
treea97171120e27f65dfe9ed5c4cc6c59625ce24e8b /src
parent9a34591ddd5ef481af5bad1fd0b76c39fce4e8e3 (diff)
downloademacs-34810ab4f9990a8de1e503fdf6b485d8eeea1601.tar.gz
emacs-34810ab4f9990a8de1e503fdf6b485d8eeea1601.zip
Avoid interleaving stderr lines when shutting down
* src/emacs.c (shut_down_emacs) [!DOS_NT]: Avoid interleaving to stderr in the usual case, by using a single write and by appending a newline. * src/sysdep.c (emacs_backtrace) [HAVE_BACKTRACE_SYMBOLS_FD]: Omit newline since shut_down_emacs now does that.
Diffstat (limited to 'src')
-rw-r--r--src/emacs.c38
-rw-r--r--src/sysdep.c2
2 files changed, 23 insertions, 17 deletions
diff --git a/src/emacs.c b/src/emacs.c
index 9c93748a0f5..ad661a081b5 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -2454,23 +2454,29 @@ shut_down_emacs (int sig, Lisp_Object stuff)
2454 2454
2455 /* If we are controlling the terminal, reset terminal modes. */ 2455 /* If we are controlling the terminal, reset terminal modes. */
2456#ifndef DOS_NT 2456#ifndef DOS_NT
2457 { 2457 pid_t tpgrp = tcgetpgrp (STDIN_FILENO);
2458 pid_t pgrp = getpgrp (); 2458 if (tpgrp != -1 && tpgrp == getpgrp ())
2459 pid_t tpgrp = tcgetpgrp (0); 2459 {
2460 if ((tpgrp != -1) && tpgrp == pgrp) 2460 reset_all_sys_modes ();
2461 { 2461 if (sig && sig != SIGTERM)
2462 reset_all_sys_modes (); 2462 {
2463 if (sig && sig != SIGTERM) 2463 static char const fmt[] = "Fatal error %d: %n%s\n";
2464 { 2464 char buf[max ((sizeof fmt - sizeof "%d%n%s\n"
2465 static char const format[] = "Fatal error %d: "; 2465 + INT_STRLEN_BOUND (int) + 1),
2466 char buf[sizeof format - 2 + INT_STRLEN_BOUND (int)]; 2466 min (PIPE_BUF, MAX_ALLOCA))];
2467 int buflen = sprintf (buf, format, sig); 2467 char const *sig_desc = safe_strsignal (sig);
2468 char const *sig_desc = safe_strsignal (sig); 2468 int nlen;
2469 int buflen = snprintf (buf, sizeof buf, fmt, sig, &nlen, sig_desc);
2470 if (0 <= buflen && buflen < sizeof buf)
2469 emacs_write (STDERR_FILENO, buf, buflen); 2471 emacs_write (STDERR_FILENO, buf, buflen);
2470 emacs_write (STDERR_FILENO, sig_desc, strlen (sig_desc)); 2472 else
2471 } 2473 {
2472 } 2474 emacs_write (STDERR_FILENO, buf, nlen);
2473 } 2475 emacs_write (STDERR_FILENO, sig_desc, strlen (sig_desc));
2476 emacs_write (STDERR_FILENO, fmt + sizeof fmt - 2, 1);
2477 }
2478 }
2479 }
2474#else 2480#else
2475 fflush (stdout); 2481 fflush (stdout);
2476 reset_all_sys_modes (); 2482 reset_all_sys_modes ();
diff --git a/src/sysdep.c b/src/sysdep.c
index 9301405943b..f7478253a35 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -2436,7 +2436,7 @@ emacs_backtrace (int backtrace_limit)
2436 2436
2437 if (npointers) 2437 if (npointers)
2438 { 2438 {
2439 emacs_write (STDERR_FILENO, "\nBacktrace:\n", 12); 2439 emacs_write (STDERR_FILENO, "Backtrace:\n", 11);
2440 backtrace_symbols_fd (buffer, npointers, STDERR_FILENO); 2440 backtrace_symbols_fd (buffer, npointers, STDERR_FILENO);
2441 if (bounded_limit < npointers) 2441 if (bounded_limit < npointers)
2442 emacs_write (STDERR_FILENO, "...\n", 4); 2442 emacs_write (STDERR_FILENO, "...\n", 4);