about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJunliang HU <jlhu@cse.cuhk.edu.hk>2022-12-09 21:11:46 +0800
committerJunliang HU <jlhu@cse.cuhk.edu.hk>2022-12-09 21:35:06 +0800
commit7d466570f47f67819edb556ccd3658b9073ec088 (patch)
tree569b63f3789812765cd21b86ca48df0dfbb97a9a
parent6e8a54d0f68702cf7981c8299357838eb0f4d5b2 (diff)
downloadrust-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.rs7
-rw-r--r--crates/rust-analyzer/src/global_state.rs2
-rw-r--r--crates/rust-analyzer/src/task_pool.rs3
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 }
     }