From 65dcf0dc11ce00f5abfccc1e9c1090add12f1e33 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Wed, 30 Nov 2016 09:18:35 +0000 Subject: [PATCH] utilioprio: Add Windows support as ioprio_set_file_idle --- configure.ac | 25 +++++++++++++++++++++++++ src/node/blockstorage.cpp | 2 ++ src/util/ioprio.cpp | 22 ++++++++++++++++++++++ src/util/ioprio.h | 6 ++++++ 4 files changed, 55 insertions(+) diff --git a/configure.ac b/configure.ac index 33d6fd03d81b4..de3b5939df3ba 100644 --- a/configure.ac +++ b/configure.ac @@ -1106,6 +1106,31 @@ else fi AM_CONDITIONAL([HAVE_IOPRIO_SYSCALL], [test "$have_ioprio_syscall" = "yes"]) +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) +AM_CONDITIONAL([HAVE_WINDOWS_IOPRIO], [test "$have_windows_ioprio" = "yes"]) + if test "$use_thread_local" = "yes" || test "$use_thread_local" = "auto"; then TEMP_LDFLAGS="$LDFLAGS" LDFLAGS="$TEMP_LDFLAGS $PTHREAD_CFLAGS" diff --git a/src/node/blockstorage.cpp b/src/node/blockstorage.cpp index cd6aa233f68a2..c1261c80884ca 100644 --- a/src/node/blockstorage.cpp +++ b/src/node/blockstorage.cpp @@ -756,6 +756,8 @@ bool ReadBlockFromDisk(CBlock& block, const FlatFilePos& pos, const Consensus::P return error("ReadBlockFromDisk: OpenBlockFile failed for %s", pos.ToString()); } + ioprio_set_file_idle(filein.Get()); + // Read block try { filein >> block; diff --git a/src/util/ioprio.cpp b/src/util/ioprio.cpp index db280b4e8705f..d3eb0ff585340 100644 --- a/src/util/ioprio.cpp +++ b/src/util/ioprio.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/util/ioprio.h b/src/util/ioprio.h index e91ad59d53e3c..134a52de97c31 100644 --- a/src/util/ioprio.h +++ b/src/util/ioprio.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