summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2009-10-20 19:19:58 +0100
committerPádraig Brady <P@draigBrady.com>2009-10-21 16:56:00 +0100
commit710fe413fed61aacad4e0124eb7fcebc3a20fb6c (patch)
tree20cfd9192502f671e501cbffcc300f40a5b4f10e /src
parent71adb516deee94274669f968636194bf261b1207 (diff)
downloadcoreutils-710fe413fed61aacad4e0124eb7fcebc3a20fb6c.tar.xz
md5sum, sha*sum, sum: line-buffer the printed checksums
* src/md5sum.c (main): Set stdout to line buffered mode to ensure parallel running instances don't intersperse their output. This adds 5% to the run time in the worst case of many zero length files, or 2% with standard file sizes. * src/sum.c (main): Likewise. * tests/misc/md5sum-parallel: New test for atomic output. * tests/Makefile.am: Reference it. * NEWS: Mention the fix
Diffstat (limited to 'src')
-rw-r--r--src/md5sum.c6
-rw-r--r--src/sum.c4
2 files changed, 8 insertions, 2 deletions
diff --git a/src/md5sum.c b/src/md5sum.c
index aa2a144a7..b7db03ecd 100644
--- a/src/md5sum.c
+++ b/src/md5sum.c
@@ -513,7 +513,6 @@ digest_check (const char *checkfile_name)
if (!status_only)
{
printf (_("%s: FAILED open or read\n"), filename);
- fflush (stdout);
}
}
else
@@ -539,7 +538,6 @@ digest_check (const char *checkfile_name)
printf ("%s: %s\n", filename, _("FAILED"));
else if (!quiet)
printf ("%s: %s\n", filename, _("OK"));
- fflush (stdout);
}
}
}
@@ -619,6 +617,10 @@ main (int argc, char **argv)
atexit (close_stdout);
+ /* Line buffer stdout to ensure lines are written atomically and immediately
+ so that processes running in parallel do not intersperse their output. */
+ setvbuf (stdout, NULL, _IOLBF, 0);
+
while ((opt = getopt_long (argc, argv, "bctw", long_options, NULL)) != -1)
switch (opt)
{
diff --git a/src/sum.c b/src/sum.c
index 91d7f34ba..f0e0cc09a 100644
--- a/src/sum.c
+++ b/src/sum.c
@@ -233,6 +233,10 @@ main (int argc, char **argv)
atexit (close_stdout);
+ /* Line buffer stdout to ensure lines are written atomically and immediately
+ so that processes running in parallel do not intersperse their output. */
+ setvbuf (stdout, NULL, _IOLBF, 0);
+
have_read_stdin = false;
while ((optc = getopt_long (argc, argv, "rs", longopts, NULL)) != -1)