diff --git a/src/base64.c b/src/base64.c index fddb61c..1a36c91 100644 --- a/src/base64.c +++ b/src/base64.c @@ -26,6 +26,7 @@ #include "system.h" #include "error.h" +#include "fadvise.h" #include "xstrtol.h" #include "quote.h" #include "quotearg.h" @@ -302,6 +303,8 @@ main (int argc, char **argv) error (EXIT_FAILURE, errno, "%s", infile); } + fadvise (input_fh, FADVISE_SEQUENTIAL); + if (decode) do_decode (input_fh, stdout, ignore_garbage); else diff --git a/src/cat.c b/src/cat.c index c4a2a9e..47b5053 100644 --- a/src/cat.c +++ b/src/cat.c @@ -34,6 +34,7 @@ #include "system.h" #include "error.h" +#include "fadvise.h" #include "full-write.h" #include "quote.h" #include "safe-read.h" @@ -700,6 +701,8 @@ main (int argc, char **argv) } insize = io_blksize (stat_buf); + fdadvise (input_desc, 0, 0, FADVISE_SEQUENTIAL); + /* Compare the device and i-node numbers of this input file with the corresponding values of the (output file associated with) stdout, and skip this input file if they coincide. Input diff --git a/src/cksum.c b/src/cksum.c index d240eb3..282c777 100644 --- a/src/cksum.c +++ b/src/cksum.c @@ -43,6 +43,7 @@ #include #include #include "system.h" +#include "fadvise.h" #include "xfreopen.h" #ifdef CRCTAB @@ -205,6 +206,8 @@ cksum (const char *file, bool print_name) } } + fadvise (fp, FADVISE_SEQUENTIAL); + while ((bytes_read = fread (buf, 1, BUFLEN, fp)) > 0) { unsigned char *cp = buf; diff --git a/src/comm.c b/src/comm.c index ff42802..06b80b0 100644 --- a/src/comm.c +++ b/src/comm.c @@ -24,6 +24,7 @@ #include "system.h" #include "linebuffer.h" #include "error.h" +#include "fadvise.h" #include "hard-locale.h" #include "quote.h" #include "stdio--.h" @@ -273,6 +274,8 @@ compare_files (char **infiles) if (!streams[i]) error (EXIT_FAILURE, errno, "%s", infiles[i]); + fadvise (streams[i], FADVISE_SEQUENTIAL); + thisline[i] = readlinebuffer (all_line[i][alt[i][0]], streams[i]); if (ferror (streams[i])) error (EXIT_FAILURE, errno, "%s", infiles[i]); diff --git a/src/cut.c b/src/cut.c index 5fcf074..58776d9 100644 --- a/src/cut.c +++ b/src/cut.c @@ -31,6 +31,7 @@ #include "system.h" #include "error.h" +#include "fadvise.h" #include "getndelim2.h" #include "hash.h" #include "quote.h" @@ -733,6 +734,8 @@ cut_file (char const *file) } } + fadvise (stream, FADVISE_SEQUENTIAL); + cut_stream (stream); if (ferror (stream)) diff --git a/src/expand.c b/src/expand.c index be50063..249255d 100644 --- a/src/expand.c +++ b/src/expand.c @@ -40,6 +40,7 @@ #include #include "system.h" #include "error.h" +#include "fadvise.h" #include "quote.h" #include "xstrndup.h" @@ -243,13 +244,14 @@ next_file (FILE *fp) if (STREQ (file, "-")) { have_read_stdin = true; - prev_file = file; - return stdin; + fp = stdin; } - fp = fopen (file, "r"); + else + fp = fopen (file, "r"); if (fp) { prev_file = file; + fadvise (fp, FADVISE_SEQUENTIAL); return fp; } error (0, errno, "%s", file); diff --git a/src/fmt.c b/src/fmt.c index 1a268ee..8a5d8bd 100644 --- a/src/fmt.c +++ b/src/fmt.c @@ -27,6 +27,7 @@ #include "system.h" #include "error.h" +#include "fadvise.h" #include "quote.h" #include "xstrtol.h" @@ -463,6 +464,7 @@ set_prefix (char *p) static void fmt (FILE *f) { + fadvise (f, FADVISE_SEQUENTIAL); tabs = false; other_indent = 0; next_char = get_prefix (f); diff --git a/src/fold.c b/src/fold.c index 9364a03..d585856 100644 --- a/src/fold.c +++ b/src/fold.c @@ -24,6 +24,7 @@ #include "system.h" #include "error.h" +#include "fadvise.h" #include "quote.h" #include "xstrtol.h" @@ -142,6 +143,8 @@ fold_file (char const *filename, size_t width) return false; } + fadvise (stdin, FADVISE_SEQUENTIAL); + while ((c = getc (istream)) != EOF) { if (offset_out + 1 >= allocated_out) diff --git a/src/join.c b/src/join.c index c977116..fa18c9d 100644 --- a/src/join.c +++ b/src/join.c @@ -24,6 +24,7 @@ #include "system.h" #include "error.h" +#include "fadvise.h" #include "hard-locale.h" #include "linebuffer.h" #include "memcasecmp.h" @@ -617,6 +618,9 @@ join (FILE *fp1, FILE *fp2) int diff; bool eof1, eof2; + fadvise (fp1, FADVISE_SEQUENTIAL); + fadvise (fp2, FADVISE_SEQUENTIAL); + /* Read the first line of each file. */ initseq (&seq1); getseq (fp1, &seq1, 1); diff --git a/src/md5sum.c b/src/md5sum.c index cbf1986..10d4fa2 100644 --- a/src/md5sum.c +++ b/src/md5sum.c @@ -36,6 +36,7 @@ # include "sha512.h" #endif #include "error.h" +#include "fadvise.h" #include "stdio--.h" #include "xfreopen.h" @@ -406,6 +407,8 @@ digest_file (const char *filename, int *binary, unsigned char *bin_result) } } + fadvise (fp, FADVISE_SEQUENTIAL); + err = DIGEST_STREAM (fp, bin_result); if (err) { diff --git a/src/nl.c b/src/nl.c index a9446f4..634a975 100644 --- a/src/nl.c +++ b/src/nl.c @@ -28,6 +28,7 @@ #include #include "error.h" +#include "fadvise.h" #include "linebuffer.h" #include "quote.h" #include "xstrtol.h" @@ -439,6 +440,8 @@ nl_file (char const *file) } } + fadvise (stream, FADVISE_SEQUENTIAL); + process_file (stream); if (ferror (stream)) diff --git a/src/paste.c b/src/paste.c index 36e1cfb..dbbf52d 100644 --- a/src/paste.c +++ b/src/paste.c @@ -42,6 +42,7 @@ #include #include "system.h" #include "error.h" +#include "fadvise.h" #include "quotearg.h" /* The official name of this program (e.g., no `g' prefix). */ @@ -211,6 +212,7 @@ paste_parallel (size_t nfiles, char **fnamptr) error (EXIT_FAILURE, errno, "%s", fnamptr[files_open]); else if (fileno (fileptr[files_open]) == STDIN_FILENO) opened_stdin = true; + fadvise (fileptr[files_open], FADVISE_SEQUENTIAL); } } @@ -367,6 +369,7 @@ paste_serial (size_t nfiles, char **fnamptr) ok = false; continue; } + fadvise (fileptr, FADVISE_SEQUENTIAL); } delimptr = delims; /* Set up for delimiter string. */ diff --git a/src/pr.c b/src/pr.c index f942151..9c2d10c 100644 --- a/src/pr.c +++ b/src/pr.c @@ -314,6 +314,7 @@ #include #include "system.h" #include "error.h" +#include "fadvise.h" #include "hard-locale.h" #include "mbswidth.h" #include "quote.h" @@ -1507,6 +1508,7 @@ open_file (char *name, COLUMN *p) error (0, errno, "%s", name); return false; } + fadvise (p->fp, FADVISE_SEQUENTIAL); p->status = OPEN; p->full_page_printed = false; ++total_files; diff --git a/src/ptx.c b/src/ptx.c index c6efb04..ba5aec5 100644 --- a/src/ptx.c +++ b/src/ptx.c @@ -25,6 +25,7 @@ #include "argmatch.h" #include "diacrit.h" #include "error.h" +#include "fadvise.h" #include "quote.h" #include "quotearg.h" #include "regex.h" @@ -538,6 +539,8 @@ swallow_file_in_memory (const char *file_name, BLOCK *block) { size_t in_memory_size; + fdadvise (file_handle, 0, 0, FADVISE_SEQUENTIAL); + block->start = xmalloc ((size_t) stat_block.st_size); if ((in_memory_size = read (file_handle, diff --git a/src/shuf.c b/src/shuf.c index 67b19af..e8ae645 100644 --- a/src/shuf.c +++ b/src/shuf.c @@ -23,6 +23,7 @@ #include "system.h" #include "error.h" +#include "fadvise.h" #include "getopt.h" #include "quote.h" #include "quotearg.h" @@ -378,6 +379,8 @@ main (int argc, char **argv) usage (EXIT_FAILURE); } + fadvise (stdin, FADVISE_SEQUENTIAL); + n_lines = read_input (stdin, eolbyte, &input_lines); line = input_lines; } diff --git a/src/sum.c b/src/sum.c index d0d160f..4b98e59 100644 --- a/src/sum.c +++ b/src/sum.c @@ -26,6 +26,7 @@ #include #include "system.h" #include "error.h" +#include "fadvise.h" #include "human.h" #include "safe-read.h" #include "xfreopen.h" @@ -110,6 +111,8 @@ bsd_sum_file (const char *file, int print_name) } } + fadvise (fp, FADVISE_SEQUENTIAL); + while ((ch = getc (fp)) != EOF) { total_bytes++; diff --git a/src/tee.c b/src/tee.c index 39d9892..a5b0369 100644 --- a/src/tee.c +++ b/src/tee.c @@ -23,6 +23,7 @@ #include "system.h" #include "error.h" +#include "fadvise.h" #include "stdio--.h" #include "xfreopen.h" @@ -157,6 +158,8 @@ tee_files (int nfiles, const char **files) if (O_BINARY && ! isatty (STDOUT_FILENO)) xfreopen (NULL, "wb", stdout); + fadvise (stdin, FADVISE_SEQUENTIAL); + /* In the array of NFILES + 1 descriptors, make the first one correspond to standard output. */ descriptors[0] = stdout; diff --git a/src/tr.c b/src/tr.c index 3722b4d..a5b6810 100644 --- a/src/tr.c +++ b/src/tr.c @@ -25,6 +25,7 @@ #include "system.h" #include "error.h" +#include "fadvise.h" #include "quote.h" #include "safe-read.h" #include "xfreopen.h" @@ -1754,6 +1755,8 @@ main (int argc, char **argv) if (O_BINARY && ! isatty (STDOUT_FILENO)) xfreopen (NULL, "wb", stdout); + fadvise (stdin, FADVISE_SEQUENTIAL); + if (squeeze_repeats && non_option_args == 1) { set_initialize (s1, complement, in_squeeze_set); diff --git a/src/tsort.c b/src/tsort.c index b5c187b..4f51f30 100644 --- a/src/tsort.c +++ b/src/tsort.c @@ -29,6 +29,7 @@ #include "system.h" #include "long-options.h" #include "error.h" +#include "fadvise.h" #include "quote.h" #include "readtokens.h" #include "stdio--.h" @@ -444,6 +445,8 @@ tsort (const char *file) if (!is_stdin && ! freopen (file, "r", stdin)) error (EXIT_FAILURE, errno, "%s", file); + fadvise (stdin, FADVISE_SEQUENTIAL); + init_tokenbuffer (&tokenbuffer); while (1) diff --git a/src/unexpand.c b/src/unexpand.c index e9e5c6a..14b8df0 100644 --- a/src/unexpand.c +++ b/src/unexpand.c @@ -41,6 +41,7 @@ #include #include "system.h" #include "error.h" +#include "fadvise.h" #include "quote.h" #include "xstrndup.h" @@ -262,13 +263,14 @@ next_file (FILE *fp) if (STREQ (file, "-")) { have_read_stdin = true; - prev_file = file; - return stdin; + fp = stdin; } - fp = fopen (file, "r"); + else + fp = fopen (file, "r"); if (fp) { prev_file = file; + fadvise (fp, FADVISE_SEQUENTIAL); return fp; } error (0, errno, "%s", file); diff --git a/src/uniq.c b/src/uniq.c index df59b12..86ca8c9 100644 --- a/src/uniq.c +++ b/src/uniq.c @@ -25,6 +25,7 @@ #include "argmatch.h" #include "linebuffer.h" #include "error.h" +#include "fadvise.h" #include "hard-locale.h" #include "posixver.h" #include "quote.h" @@ -286,6 +287,8 @@ check_file (const char *infile, const char *outfile, char delimiter) if (! (STREQ (outfile, "-") || freopen (outfile, "w", stdout))) error (EXIT_FAILURE, errno, "%s", outfile); + fadvise (stdin, FADVISE_SEQUENTIAL); + thisline = &lb1; prevline = &lb2; diff --git a/src/wc.c b/src/wc.c index 6df7fed..a2dfb47 100644 --- a/src/wc.c +++ b/src/wc.c @@ -29,6 +29,7 @@ #include "system.h" #include "argv-iter.h" #include "error.h" +#include "fadvise.h" #include "mbchar.h" #include "physmem.h" #include "quote.h" @@ -211,6 +212,10 @@ wc (int fd, char const *file_x, struct fstatus *fstatus) } count_complicated = print_words || print_linelength; + /* Only advise the kernel of our access pattern if we need to read(). */ + if (!count_bytes || count_chars || print_lines || count_complicated) + fdadvise (fd, 0, 0, FADVISE_SEQUENTIAL); + /* When counting only bytes, save some line- and word-counting overhead. If FD is a `regular' Unix file, using lseek is enough to get its `size' in bytes. Otherwise, read blocks of BUFFER_SIZE @@ -238,6 +243,7 @@ wc (int fd, char const *file_x, struct fstatus *fstatus) } else { + fdadvise (fd, 0, 0, FADVISE_SEQUENTIAL); while ((bytes_read = safe_read (fd, buf, BUFFER_SIZE)) > 0) { if (bytes_read == SAFE_READ_ERROR)