summaryrefslogtreecommitdiff
path: root/src/common/windows
diff options
context:
space:
mode:
authorMorph <39850852+Morph1984@users.noreply.github.com>2023-03-03 20:54:15 -0500
committerMorph <39850852+Morph1984@users.noreply.github.com>2023-03-05 02:36:31 -0500
commit026eaddbeef4d0a4992fb19b40af9242f09c3c6a (patch)
treed275b240a3871e5c7aa4ed944a6e8f3f3b3b79c3 /src/common/windows
parent3453beb1e0fa7af3db4e07418f3ea8d997d005be (diff)
timer_resolution: Set current process to High QoS
Ensures that this process is treated as a high performance process by the Windows scheduler.
Diffstat (limited to 'src/common/windows')
-rw-r--r--src/common/windows/timer_resolution.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/common/windows/timer_resolution.cpp b/src/common/windows/timer_resolution.cpp
index 6c2063a4c..29c6e5c7e 100644
--- a/src/common/windows/timer_resolution.cpp
+++ b/src/common/windows/timer_resolution.cpp
@@ -18,6 +18,15 @@ NTSYSAPI LONG NTAPI NtSetTimerResolution(ULONG DesiredResolution, BOOLEAN SetRes
NTSYSAPI LONG NTAPI NtDelayExecution(BOOLEAN Alertable, PLARGE_INTEGER DelayInterval);
}
+// Defines for compatibility with older Windows 10 SDKs.
+
+#ifndef PROCESS_POWER_THROTTLING_EXECUTION_SPEED
+#define PROCESS_POWER_THROTTLING_EXECUTION_SPEED 0x1
+#endif
+#ifndef PROCESS_POWER_THROTTLING_IGNORE_TIMER_RESOLUTION
+#define PROCESS_POWER_THROTTLING_IGNORE_TIMER_RESOLUTION 0x4
+#endif
+
namespace Common::Windows {
namespace {
@@ -51,6 +60,18 @@ TimerResolution GetTimerResolution() {
};
}
+void SetHighQoS() {
+ // https://learn.microsoft.com/en-us/windows/win32/procthread/quality-of-service
+ PROCESS_POWER_THROTTLING_STATE PowerThrottling{
+ .Version{PROCESS_POWER_THROTTLING_CURRENT_VERSION},
+ .ControlMask{PROCESS_POWER_THROTTLING_EXECUTION_SPEED |
+ PROCESS_POWER_THROTTLING_IGNORE_TIMER_RESOLUTION},
+ .StateMask{},
+ };
+ SetProcessInformation(GetCurrentProcess(), ProcessPowerThrottling, &PowerThrottling,
+ sizeof(PROCESS_POWER_THROTTLING_STATE));
+}
+
} // Anonymous namespace
nanoseconds GetMinimumTimerResolution() {
@@ -74,6 +95,7 @@ nanoseconds SetCurrentTimerResolution(nanoseconds timer_resolution) {
}
nanoseconds SetCurrentTimerResolutionToMaximum() {
+ SetHighQoS();
return SetCurrentTimerResolution(GetMaximumTimerResolution());
}