Bugfix: ioprio: Correct type juggling and handle edge cases

This commit is contained in:
Luke Dashjr 2025-03-02 22:06:44 +00:00
parent 0fd00fcb11
commit 8c989494c2
2 changed files with 18 additions and 11 deletions

View File

@ -986,18 +986,23 @@ AC_DEFINE_UNQUOTED([HAVE_IOPRIO_SYSCALL], [$HAVE_IOPRIO_SYSCALL], [Define to 1 i
AC_MSG_CHECKING(for Windows file I/O priority functions) AC_MSG_CHECKING(for Windows file I/O priority functions)
AC_COMPILE_IFELSE([ AC_COMPILE_IFELSE([
AC_LANG_PROGRAM([[ AC_LANG_PROGRAM([[
#define _WIN32_WINNT 0x0600 #define _WIN32_WINNT 0x0601
#include <windows.h> #include <windows.h>
#include <io.h> #include <io.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h> #include <stdio.h>
]],[[ ]],[[
static const FILE_IO_PRIORITY_HINT_INFO priorityHint = { FILE_IO_PRIORITY_HINT_INFO priorityHint = {
.PriorityHint = IoPriorityHintLow, .PriorityHint = IoPriorityHintLow,
}; };
FILE * const F = fopen("test", "r"); FILE * const F = fopen("test", "r");
HANDLE hFile = _get_osfhandle(_fileno(F)); intptr_t osfhandle = _get_osfhandle(_fileno(F));
if (osfhandle == (intptr_t)INVALID_HANDLE_VALUE) osfhandle = 0;
HANDLE hFile = (HANDLE)osfhandle;
SetFileInformationByHandle(hFile, FileIoPriorityHintInfo, &priorityHint, sizeof(priorityHint)); bool rv = SetFileInformationByHandle(hFile, FileIoPriorityHintInfo, &priorityHint, sizeof(priorityHint));
return rv;
]]) ]])
],[ ],[
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])

View File

@ -59,19 +59,21 @@ int ioprio_set_idle() {
#if HAVE_WINDOWS_IOPRIO #if HAVE_WINDOWS_IOPRIO
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT 0x0600
#include <windows.h> #include <windows.h>
#include <io.h> #include <io.h>
#include <cstddef>
#include <cstdint>
#include <cstdio>
bool ioprio_set_file_idle(FILE * const F) { bool ioprio_set_file_idle(FILE * const F) {
static const FILE_IO_PRIORITY_HINT_INFO priorityHint = { FILE_IO_PRIORITY_HINT_INFO priorityHint = {
.PriorityHint = IoPriorityHintLow, .PriorityHint = IoPriorityHintLow,
}; };
HANDLE hFile = _get_osfhandle(_fileno(F)); intptr_t osfhandle = _get_osfhandle(_fileno(F));
if (osfhandle == (intptr_t)INVALID_HANDLE_VALUE || osfhandle == (intptr_t)-2) {
return false;
}
HANDLE hFile = (HANDLE)osfhandle;
return SetFileInformationByHandle(hFile, FileIoPriorityHintInfo, &priorityHint, sizeof(priorityHint)); return SetFileInformationByHandle(hFile, FileIoPriorityHintInfo, &priorityHint, sizeof(priorityHint));
} }