Bump main thread priority on windows

This commit is contained in:
Aleksey Kladov 2020-01-26 12:02:56 +01:00
parent 40109941db
commit 493a903f22
3 changed files with 23 additions and 0 deletions

1
Cargo.lock generated
View file

@ -1079,6 +1079,7 @@ dependencies = [
"tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"test_utils 0.1.0", "test_utils 0.1.0",
"threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]

View file

@ -30,6 +30,9 @@ env_logger = { version = "0.7.1", default-features = false }
ra_cargo_watch = { path = "../ra_cargo_watch" } ra_cargo_watch = { path = "../ra_cargo_watch" }
either = "1.5" either = "1.5"
[target.'cfg(windows)'.dependencies]
winapi = "0.3"
[dev-dependencies] [dev-dependencies]
tempfile = "3" tempfile = "3"
test_utils = { path = "../test_utils" } test_utils = { path = "../test_utils" }

View file

@ -57,6 +57,25 @@ pub fn main_loop(
) -> Result<()> { ) -> Result<()> {
log::info!("server_config: {:#?}", config); log::info!("server_config: {:#?}", config);
// Windows scheduler implements priority boosts: if thread waits for an
// event (like a condvar), and event fires, priority of the thread is
// temporary bumped. This optimization backfires in our case: each time the
// `main_loop` schedules a task to run on a threadpool, the worker threads
// gets a higher priority, and (on a machine with fewer cores) displaces the
// main loop! We work-around this by marking the main loop as a
// higher-priority thread.
//
// https://docs.microsoft.com/en-us/windows/win32/procthread/scheduling-priorities
// https://docs.microsoft.com/en-us/windows/win32/procthread/priority-boosts
// https://github.com/rust-analyzer/rust-analyzer/issues/2835
#[cfg(windows)]
unsafe {
use winapi::um::processthreadsapi::*;
let thread = GetCurrentThread();
let thread_priority_above_normal = 1;
SetThreadPriority(thread, thread_priority_above_normal);
}
let mut loop_state = LoopState::default(); let mut loop_state = LoopState::default();
let mut world_state = { let mut world_state = {
let feature_flags = { let feature_flags = {