diff --git a/configure.ac b/configure.ac index 35720fef..720315f0 100644 --- a/configure.ac +++ b/configure.ac @@ -517,6 +517,9 @@ gl_GETOPT # Find the best function to set timestamps. AC_CHECK_FUNCS([futimens futimes futimesat utimes utime], [break]) +# This is nice to have but not mandatory. +AC_CHECK_FUNCS([posix_fadvise]) + TUKLIB_PROGNAME TUKLIB_INTEGER TUKLIB_PHYSMEM diff --git a/src/xz/file_io.c b/src/xz/file_io.c index 09edcca6..56acf3bd 100644 --- a/src/xz/file_io.c +++ b/src/xz/file_io.c @@ -293,6 +293,10 @@ io_open_src_real(file_pair *pair) pair->src_fd = STDIN_FILENO; #ifdef TUKLIB_DOSLIKE setmode(STDIN_FILENO, O_BINARY); +#endif +#ifdef HAVE_POSIX_FADVISE + // It will fail if stdin is a pipe and that's fine. + (void)posix_fadvise(STDIN_FILENO, 0, 0, POSIX_FADV_SEQUENTIAL); #endif return false; } @@ -497,6 +501,17 @@ io_open_src_real(file_pair *pair) } #endif +#ifdef HAVE_POSIX_FADVISE + const int fadvise_ret = posix_fadvise( + pair->src_fd, 0, 0, POSIX_FADV_SEQUENTIAL); + + // It shouldn't fail, but if it does anyway, it doesn't matter. + // Check it with an assertion so that if something gets messed + // up in the future, it will get caught when debugging is enabled. + assert(fadvise_ret == 0); + (void)fadvise_ret; +#endif + return false; error_msg: