]> git.eshelyaron.com Git - emacs.git/commitdiff
Make message_to_stderr do one single fwrite
authorLars Ingebrigtsen <larsi@gnus.org>
Mon, 24 Jun 2019 22:46:02 +0000 (00:46 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Mon, 24 Jun 2019 22:46:20 +0000 (00:46 +0200)
* src/xdisp.c (message_to_stderr): When running as a batch
process, the output from `message' goes to stderr, and has a
newline appended.  Rewrite the code so that only one fwrite is
performed to enable messages that are shorter than PIPE_BUF
(usually 4096 on modern operating systems) are written out as one
chunk, as this will ensure that the messages are not interleaved
with messages from other processes that are writing at the same
time.  This does not affect other stderr outputs, just the ones
from `message'.

src/xdisp.c

index 5d70440f1cb02dad2c0a622cdcfbe701c4e64a2a..25e8932945e810446af7403d33b0e701f6f80eac 100644 (file)
@@ -10705,10 +10705,22 @@ message_to_stderr (Lisp_Object m)
       else
        s = m;
 
-      fwrite (SDATA (s), SBYTES (s), 1, stderr);
+      /* We want to write this out with a single fwrite call so that
+        output doesn't interleave with other processes writing to
+        stderr at the same time. */
+      {
+       int length = min (INT_MAX, SBYTES (s) + 1);
+       char *string = xmalloc (length);
+
+       memcpy (string, SSDATA (s), length - 1);
+       string[length - 1] = '\n';
+       fwrite (string, 1, length, stderr);
+       xfree (string);
+      }
     }
-  if (!cursor_in_echo_area)
+  else if (!cursor_in_echo_area)
     fputc ('\n', stderr);
+
   fflush (stderr);
 }