emacs-diffs
[Top][All Lists]
Advanced

[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);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]