[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master 34810ab 4/4: Avoid interleaving stderr lines when s
From: |
Paul Eggert |
Subject: |
[Emacs-diffs] master 34810ab 4/4: Avoid interleaving stderr lines when shutting down |
Date: |
Sat, 13 Jul 2019 19:53:28 -0400 (EDT) |
branch: master
commit 34810ab4f9990a8de1e503fdf6b485d8eeea1601
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>
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.
---
src/emacs.c | 38 ++++++++++++++++++++++----------------
src/sysdep.c | 2 +-
2 files changed, 23 insertions(+), 17 deletions(-)
diff --git a/src/emacs.c b/src/emacs.c
index 9c93748..ad661a0 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -2454,23 +2454,29 @@ shut_down_emacs (int sig, Lisp_Object stuff)
/* If we are controlling the terminal, reset terminal modes. */
#ifndef DOS_NT
- {
- pid_t pgrp = getpgrp ();
- pid_t tpgrp = tcgetpgrp (0);
- if ((tpgrp != -1) && tpgrp == pgrp)
- {
- reset_all_sys_modes ();
- if (sig && sig != SIGTERM)
- {
- static char const format[] = "Fatal error %d: ";
- char buf[sizeof format - 2 + INT_STRLEN_BOUND (int)];
- int buflen = sprintf (buf, format, sig);
- char const *sig_desc = safe_strsignal (sig);
+ pid_t tpgrp = tcgetpgrp (STDIN_FILENO);
+ if (tpgrp != -1 && tpgrp == getpgrp ())
+ {
+ reset_all_sys_modes ();
+ if (sig && sig != SIGTERM)
+ {
+ static char const fmt[] = "Fatal error %d: %n%s\n";
+ char buf[max ((sizeof fmt - sizeof "%d%n%s\n"
+ + INT_STRLEN_BOUND (int) + 1),
+ min (PIPE_BUF, MAX_ALLOCA))];
+ char const *sig_desc = safe_strsignal (sig);
+ int nlen;
+ int buflen = snprintf (buf, sizeof buf, fmt, sig, &nlen, sig_desc);
+ if (0 <= buflen && buflen < sizeof buf)
emacs_write (STDERR_FILENO, buf, buflen);
- emacs_write (STDERR_FILENO, sig_desc, strlen (sig_desc));
- }
- }
- }
+ else
+ {
+ emacs_write (STDERR_FILENO, buf, nlen);
+ emacs_write (STDERR_FILENO, sig_desc, strlen (sig_desc));
+ emacs_write (STDERR_FILENO, fmt + sizeof fmt - 2, 1);
+ }
+ }
+ }
#else
fflush (stdout);
reset_all_sys_modes ();
diff --git a/src/sysdep.c b/src/sysdep.c
index 9301405..f747825 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -2436,7 +2436,7 @@ emacs_backtrace (int backtrace_limit)
if (npointers)
{
- emacs_write (STDERR_FILENO, "\nBacktrace:\n", 12);
+ emacs_write (STDERR_FILENO, "Backtrace:\n", 11);
backtrace_symbols_fd (buffer, npointers, STDERR_FILENO);
if (bounded_limit < npointers)
emacs_write (STDERR_FILENO, "...\n", 4);