From: Bruno Haible Date: Mon, 20 Aug 2007 22:09:08 +0000 (+0000) Subject: Optimization: no need to flush stdin if we can determine quickly that stdin's X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7042775894700f8be0e6bc2a5ff3c49fc77296bc;p=pspp Optimization: no need to flush stdin if we can determine quickly that stdin's input buffer is empty. --- diff --git a/ChangeLog b/ChangeLog index 8a81c4a932..9fd9405b32 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2007-08-19 Bruno Haible + + * modules/closein (Depends-on): Add freadahead. + * lib/closein.c: Include freadahead.h. + (close_stdin): Skip the fseeko and fflush calls if freadahead(stdin) + is zero. + 2007-08-19 Bruno Haible * modules/freadahead-tests: New file. diff --git a/lib/closein.c b/lib/closein.c index 4450d5bd8d..bca7711bae 100644 --- a/lib/closein.c +++ b/lib/closein.c @@ -32,6 +32,7 @@ #include "closeout.h" #include "error.h" #include "exitfail.h" +#include "freadahead.h" #include "quotearg.h" static const char *file_name; @@ -80,10 +81,16 @@ close_stdin (void) { bool fail = false; - /* Only attempt flush if stdin is seekable, as fflush is entitled to - fail on non-seekable streams. */ - if (fseeko (stdin, 0, SEEK_CUR) == 0 && fflush (stdin) != 0) - fail = true; + /* There is no need to flush stdin if we can determine quickly that stdin's + input buffer is empty; in this case we know that if stdin is seekable, + fseeko (stdin, 0, SEEK_CUR) == lseek (0, 0, SEEK_CUR). */ + if (freadahead (stdin) > 0) + { + /* Only attempt flush if stdin is seekable, as fflush is entitled to + fail on non-seekable streams. */ + if (fseeko (stdin, 0, SEEK_CUR) == 0 && fflush (stdin) != 0) + fail = true; + } if (close_stream (stdin) != 0) fail = true; if (fail) diff --git a/modules/closein b/modules/closein index fefeae3648..522a383d3e 100644 --- a/modules/closein +++ b/modules/closein @@ -8,6 +8,7 @@ m4/closein.m4 Depends-on: closeout +freadahead fflush stdbool