diff options
author | Morph <39850852+Morph1984@users.noreply.github.com> | 2023-03-03 20:54:15 -0500 |
---|---|---|
committer | Morph <39850852+Morph1984@users.noreply.github.com> | 2023-03-05 02:36:31 -0500 |
commit | 026eaddbeef4d0a4992fb19b40af9242f09c3c6a (patch) | |
tree | d275b240a3871e5c7aa4ed944a6e8f3f3b3b79c3 /src/common/windows | |
parent | 3453beb1e0fa7af3db4e07418f3ea8d997d005be (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.cpp | 22 |
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()); } |