ioprio.cpp raw
1 // Copyright (c) 2016 The Limenka developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5 #include <limenka-build-config.h> // IWYU pragma: keep
6
7 #include <util/ioprio.h>
8
9 #if HAVE_IOPRIO_SYSCALL
10
11 #ifndef _GNU_SOURCE
12 #define _GNU_SOURCE
13 #endif
14 #include <unistd.h>
15 #include <sys/syscall.h>
16
17 #ifndef IOPRIO_WHO_PROCESS
18 #define IOPRIO_WHO_PROCESS 1
19 #endif
20 #ifndef IOPRIO_CLASS_IDLE
21 #define IOPRIO_CLASS_IDLE 3
22 #endif
23 #ifndef IOPRIO_CLASS_SHIFT
24 #define IOPRIO_CLASS_SHIFT 13
25 #endif
26
27 int ioprio_get() {
28 return syscall(SYS_ioprio_get, IOPRIO_WHO_PROCESS, 0);
29 }
30
31 int ioprio_set(const int ioprio) {
32 return syscall(SYS_ioprio_set, IOPRIO_WHO_PROCESS, 0, ioprio);
33 }
34
35 int ioprio_set_idle() {
36 return ioprio_set(7 | (IOPRIO_CLASS_IDLE << IOPRIO_CLASS_SHIFT));
37 }
38
39 #elif HAVE_IOPOLICY
40
41 #include <sys/resource.h>
42
43 int ioprio_get() {
44 return getiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_THREAD);
45 }
46
47 int ioprio_set(const int ioprio) {
48 return setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_THREAD, ioprio);
49 }
50
51 int ioprio_set_idle() {
52 return ioprio_set(IOPOL_UTILITY);
53 }
54
55 #endif
56
57
58 #if HAVE_WINDOWS_IOPRIO
59
60 #include <windows.h>
61 #include <io.h>
62 #include <cstddef>
63 #include <cstdint>
64 #include <cstdio>
65
66 bool ioprio_set_file_idle(FILE * const F) {
67 FILE_IO_PRIORITY_HINT_INFO priorityHint = {
68 .PriorityHint = IoPriorityHintLow,
69 };
70 intptr_t osfhandle = _get_osfhandle(_fileno(F));
71 if (osfhandle == (intptr_t)INVALID_HANDLE_VALUE || osfhandle == (intptr_t)-2) {
72 return false;
73 }
74 HANDLE hFile = (HANDLE)osfhandle;
75
76 return SetFileInformationByHandle(hFile, FileIoPriorityHintInfo, &priorityHint, sizeof(priorityHint));
77 }
78
79 #endif
80