diff --git a/configure.ac b/configure.ac index cbaec9612b28f..f150b9e7d500b 100644 --- a/configure.ac +++ b/configure.ac @@ -646,6 +646,31 @@ else have_ioprio_syscall=no fi +AC_MSG_CHECKING(for Windows file I/O priority functions) +AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + #define _WIN32_WINNT 0x0600 + #include + #include + #include + ]],[[ + static const FILE_IO_PRIORITY_HINT_INFO priorityHint = { + .PriorityHint = IoPriorityHintLow, + }; + FILE * const F = fopen("test", "r"); + HANDLE hFile = _get_osfhandle(_fileno(F)); + + SetFileInformationByHandle(hFile, FileIoPriorityHintInfo, &priorityHint, sizeof(priorityHint)); + ]]) +],[ + have_windows_ioprio=yes + AC_DEFINE(HAVE_WINDOWS_IOPRIO,1,[Define this symbol if you have Windows I/O priority functions]) +],[ + have_windows_ioprio=no +]) +AC_MSG_RESULT($have_windows_ioprio) + + dnl Check for MSG_NOSIGNAL AC_MSG_CHECKING(for MSG_NOSIGNAL) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], @@ -1217,6 +1242,7 @@ AM_CONDITIONAL([USE_LCOV],[test x$use_lcov = xyes]) AM_CONDITIONAL([GLIBC_BACK_COMPAT],[test x$use_glibc_compat = xyes]) AM_CONDITIONAL([HAVE_IOPOLICY],[test x$have_iopolicy = xyes]) AM_CONDITIONAL([HAVE_IOPRIO_SYSCALL],[test x$have_ioprio_syscall = xyes]) +AM_CONDITIONAL([HAVE_WINDOWS_IOPRIO],[test x$have_windows_ioprio = xyes]) AM_CONDITIONAL([HARDEN],[test x$use_hardening = xyes]) AM_CONDITIONAL([ENABLE_HWCRC32],[test x$enable_hwcrc32 = xyes]) AM_CONDITIONAL([EXPERIMENTAL_ASM],[test x$experimental_asm = xyes]) diff --git a/src/utilioprio.cpp b/src/utilioprio.cpp index a1e58703d4c81..f37ba470dbe7d 100644 --- a/src/utilioprio.cpp +++ b/src/utilioprio.cpp @@ -55,3 +55,25 @@ int ioprio_set_idle() { } #endif + + +#ifdef HAVE_WINDOWS_IOPRIO + +#ifdef _WIN32_WINNT +#undef _WIN32_WINNT +#endif +#define _WIN32_WINNT 0x0600 + +#include +#include + +bool ioprio_set_file_idle(FILE * const F) { + static const FILE_IO_PRIORITY_HINT_INFO priorityHint = { + .PriorityHint = IoPriorityHintLow, + }; + HANDLE hFile = _get_osfhandle(_fileno(F)); + + return SetFileInformationByHandle(hFile, FileIoPriorityHintInfo, &priorityHint, sizeof(priorityHint)); +} + +#endif diff --git a/src/utilioprio.h b/src/utilioprio.h index e9fdf71ffc166..4d259a47e5624 100644 --- a/src/utilioprio.h +++ b/src/utilioprio.h @@ -54,4 +54,10 @@ class ioprio_idler { #define IOPRIO_IDLER(actually_idle) (void)actually_idle; #endif +#ifdef HAVE_WINDOWS_IOPRIO +bool ioprio_set_file_idle(FILE *); +#else +#define ioprio_set_file_idle(f) ((void)false) +#endif + #endif // BITCOIN_UTIL_IOPRIO_H diff --git a/src/validation.cpp b/src/validation.cpp index 60a9f1e13e23d..64391d8dda567 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -996,6 +996,8 @@ bool ReadBlockFromDisk(CBlock& block, const CDiskBlockPos& pos, const Consensus: if (filein.IsNull()) return error("ReadBlockFromDisk: OpenBlockFile failed for %s", pos.ToString()); + ioprio_set_file_idle(filein.Get()); + // Read block try { filein >> block;