Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/proc-macro-api/src/pool.rs')
| -rw-r--r-- | crates/proc-macro-api/src/pool.rs | 50 |
1 files changed, 26 insertions, 24 deletions
diff --git a/crates/proc-macro-api/src/pool.rs b/crates/proc-macro-api/src/pool.rs index 4639374f3e..4215b0f2c0 100644 --- a/crates/proc-macro-api/src/pool.rs +++ b/crates/proc-macro-api/src/pool.rs @@ -27,12 +27,10 @@ impl ProcMacroServerPool { } fn pick_process(&self) -> &ProcMacroServerProcess { - for workers in &*self.workers { - if workers.can_use() { - return workers; - } - } - &self.workers[0] + self.workers + .iter() + .min_by_key(|w| w.number_of_active_req()) + .expect("worker pool must not be empty") } pub(crate) fn load_dylib( @@ -41,27 +39,31 @@ impl ProcMacroServerPool { _callback: Option<SubCallback<'_>>, ) -> Result<Vec<ProcMacro>, ServerError> { let _p = tracing::info_span!("ProcMacroServer::load_dylib").entered(); - let mut all_macros = Vec::new(); - for worker in &*self.workers { - let dylib_path = Arc::new(dylib.path.clone()); - let dylib_last_modified = std::fs::metadata(dylib_path.as_path()) - .ok() - .and_then(|metadata| metadata.modified().ok()); - let macros = worker.find_proc_macros(&dylib.path, None)?.unwrap(); - - for (name, kind) in macros { - all_macros.push(ProcMacro { - process: self.clone(), - name: name.into(), - kind, - dylib_path: Arc::new(dylib.path.clone()), - dylib_last_modified, - }); - } + let dylib_path = Arc::new(dylib.path.clone()); + let dylib_last_modified = std::fs::metadata(dylib_path.as_path()) + .ok() + .and_then(|metadata| metadata.modified().ok()); + + let first = &self.workers[0]; + let macros = first.find_proc_macros(&dylib.path, None)?.unwrap(); + + for worker in &self.workers[1..] { + let _ = worker.find_proc_macros(&dylib.path, None)?; } - Ok(all_macros) + let result = macros + .into_iter() + .map(|(name, kind)| ProcMacro { + process: self.clone(), + name: name.into(), + kind, + dylib_path: dylib_path.clone(), + dylib_last_modified, + }) + .collect(); + + Ok(result) } pub(crate) fn expand( |