Skip to content

Commit

Permalink
- revamp priority changing on windows, add cvar `i_allowprioritychang…
Browse files Browse the repository at this point in the history
…e` to disallow priority changing entirely, allowing batch scripts to dictate GZDoom's process priority
  • Loading branch information
madame-rachelle committed Jan 31, 2025
1 parent 59ac494 commit f21b68c
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 7 deletions.
16 changes: 10 additions & 6 deletions src/common/platform/win32/i_input.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ EXTERN_CVAR(Bool, i_pauseinbackground);


CVAR (Bool, k_allowfullscreentoggle, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
CVAR (Bool, i_allowprioritychange, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)

static void I_CheckGUICapture ()
{
Expand Down Expand Up @@ -485,13 +486,16 @@ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

case WM_ACTIVATEAPP:
AppActive = (wParam == TRUE);
if (wParam || !i_pauseinbackground)
if (!i_pauseinbackground && i_allowprioritychange)
{
SetPriorityClass (GetCurrentProcess (), INGAME_PRIORITY_CLASS);
}
else if (!noidle && !(sysCallbacks.NetGame && sysCallbacks.NetGame()))
{
SetPriorityClass (GetCurrentProcess (), IDLE_PRIORITY_CLASS);
if (wParam)
{
SetPriorityClass (GetCurrentProcess (), INGAME_PRIORITY_CLASS);
}
else if (!noidle && !(sysCallbacks.NetGame && sysCallbacks.NetGame()))
{
SetPriorityClass (GetCurrentProcess (), IDLE_PRIORITY_CLASS);
}
}
S_SetSoundPaused (wParam);
break;
Expand Down
5 changes: 4 additions & 1 deletion src/common/platform/win32/i_system.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,9 @@ void CalculateCPUSpeed()
// probably never use the performance statistics.
min_diff = freq.LowPart * 11 / 200;

// just in case we were launched with a custom priority class, keep it
DWORD OldPriorityClass = GetPriorityClass(GetCurrentProcess());

// Minimize the chance of task switching during the testing by going very
// high priority. This is another reason to avoid timing for too long.
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
Expand All @@ -258,7 +261,7 @@ void CalculateCPUSpeed()
do { QueryPerformanceCounter(&count1); } while ((count1.QuadPart - count2.QuadPart) < min_diff);
ClockCalibration.Unclock();

SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
SetPriorityClass(GetCurrentProcess(), OldPriorityClass);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);

PerfToSec = double(count1.QuadPart - count2.QuadPart) / (double(ClockCalibration.GetRawCounter()) * freq.QuadPart);
Expand Down

0 comments on commit f21b68c

Please sign in to comment.