diff options
| author | Junliang HU <jlhu@cse.cuhk.edu.hk> | 2022-12-09 21:11:46 +0800 |
|---|---|---|
| committer | Junliang HU <jlhu@cse.cuhk.edu.hk> | 2022-12-09 21:35:06 +0800 |
| commit | 7d466570f47f67819edb556ccd3658b9073ec088 (patch) | |
| tree | 569b63f3789812765cd21b86ca48df0dfbb97a9a | |
| parent | 6e8a54d0f68702cf7981c8299357838eb0f4d5b2 (diff) | |
| download | rust-7d466570f47f67819edb556ccd3658b9073ec088.tar.gz rust-7d466570f47f67819edb556ccd3658b9073ec088.zip | |
Add numThreads in config to avoid spawning lots of threads every time
| -rw-r--r-- | crates/rust-analyzer/src/config.rs | 7 | ||||
| -rw-r--r-- | crates/rust-analyzer/src/global_state.rs | 2 | ||||
| -rw-r--r-- | crates/rust-analyzer/src/task_pool.rs | 3 |
3 files changed, 10 insertions, 2 deletions
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index 6c0d712a4f4..a90775933c2 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs @@ -403,6 +403,9 @@ config_data! { /// Whether to show `can't find Cargo.toml` error message. notifications_cargoTomlNotFound: bool = "true", + /// How many worker threads in the main loop. The default `null` means to pick automatically. + numThreads: Option<usize> = "null", + /// Expand attribute macros. Requires `#rust-analyzer.procMacro.enable#` to be set. procMacro_attributes_enable: bool = "true", /// Enable support for procedural macros, implies `#rust-analyzer.cargo.buildScripts.enable#`. @@ -1454,6 +1457,10 @@ impl Config { } } + pub fn main_loop_num_threads(&self) -> usize { + self.data.numThreads.unwrap_or(num_cpus::get_physical().try_into().unwrap_or(1)) + } + pub fn typing_autoclose_angle(&self) -> bool { self.data.typing_autoClosingAngleBrackets_enable } diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs index 4e8bc8d6462..fb9415b5dc3 100644 --- a/crates/rust-analyzer/src/global_state.rs +++ b/crates/rust-analyzer/src/global_state.rs @@ -134,7 +134,7 @@ impl GlobalState { let task_pool = { let (sender, receiver) = unbounded(); - let handle = TaskPool::new(sender); + let handle = TaskPool::new_with_threads(sender, config.main_loop_num_threads()); Handle { handle, receiver } }; diff --git a/crates/rust-analyzer/src/task_pool.rs b/crates/rust-analyzer/src/task_pool.rs index aeeb3b7c582..616e449984a 100644 --- a/crates/rust-analyzer/src/task_pool.rs +++ b/crates/rust-analyzer/src/task_pool.rs @@ -8,12 +8,13 @@ pub(crate) struct TaskPool<T> { } impl<T> TaskPool<T> { - pub(crate) fn new(sender: Sender<T>) -> TaskPool<T> { + pub(crate) fn new_with_threads(sender: Sender<T>, threads: usize) -> TaskPool<T> { const STACK_SIZE: usize = 8 * 1024 * 1024; let inner = threadpool::Builder::new() .thread_name("Worker".into()) .thread_stack_size(STACK_SIZE) + .num_threads(threads) .build(); TaskPool { sender, inner } } |
