[llvm] Windows: use EcoQoS for ThreadPriority::Background (PR #148797)

Alexandre Ganea via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 21 06:32:58 PDT 2025


================
@@ -107,6 +107,38 @@ void llvm::get_thread_name(SmallVectorImpl<char> &Name) {
 }
 
 SetThreadPriorityResult llvm::set_thread_priority(ThreadPriority Priority) {
+
+  // SetThreadInformation is only available on Windows 8 and later. Since we still
+  // support compilation on Windows 7, we load the function dynamically.
+  typedef BOOL(WINAPI * SetThreadInformation_t)(
+      HANDLE hThread, THREAD_INFORMATION_CLASS ThreadInformationClass,
+      _In_reads_bytes_(ThreadInformationSize) PVOID ThreadInformation,
+      ULONG ThreadInformationSize);
+  static const auto pfnSetThreadInformation =
+      (SetThreadInformation_t)GetProcAddress(
+          GetModuleHandle(TEXT("kernel32.dll")), "SetThreadInformation");
+
+  if (pfnSetThreadInformation) {
+    auto setThreadInformation = [](ULONG ControlMaskAndStateMask) {
+      THREAD_POWER_THROTTLING_STATE state{};
+      state.Version = THREAD_POWER_THROTTLING_CURRENT_VERSION;
+      state.ControlMask = ControlMask;
+      state.StateMask = StateMask;
+      return pfnSetThreadInformation(GetCurrentThread(), ThreadPowerThrottling,
+                                     &state, sizeof(state));
+    };
+
+    // Use EcoQoS for ThreadPriority::Background available (running on most
+    // efficent cores at the most efficient cpu frequency):
+    // https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-setthreadinformation
+    // https://learn.microsoft.com/en-us/windows/win32/procthread/quality-of-service
+    if (Priority == ThreadPriority::Background) {
----------------
aganea wrote:

Just one last thing: the LLVM coding standards prefer eliding braces for one line statements after in `if`/`else`, please see https://releases.llvm.org/20.1.0/docs/CodingStandards.html#don-t-use-braces-on-simple-single-statement-bodies-of-if-else-loop-statements
But you could also write this as a single statement:
```
setThreadInformation(Priority == ThreadPriority::Background ? THREAD_POWER_THROTTLING_EXECUTION_SPEED : 0);
```

https://github.com/llvm/llvm-project/pull/148797


More information about the llvm-commits mailing list