diff options
Diffstat (limited to 'crates/ra_lsp_server/src/main_loop.rs')
-rw-r--r-- | crates/ra_lsp_server/src/main_loop.rs | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index c3580ab67..e65bb0972 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs | |||
@@ -20,7 +20,7 @@ use crate::{ | |||
20 | main_loop::subscriptions::Subscriptions, | 20 | main_loop::subscriptions::Subscriptions, |
21 | project_model::workspace_loader, | 21 | project_model::workspace_loader, |
22 | req, | 22 | req, |
23 | server_world::{ServerWorld, ServerWorldState}, | 23 | server_world::{ServerWorld, ServerWorldState, CompletedRequest}, |
24 | Result, | 24 | Result, |
25 | InitializationOptions, | 25 | InitializationOptions, |
26 | }; | 26 | }; |
@@ -45,6 +45,17 @@ enum Task { | |||
45 | Notify(RawNotification), | 45 | Notify(RawNotification), |
46 | } | 46 | } |
47 | 47 | ||
48 | struct PendingRequest { | ||
49 | received: Instant, | ||
50 | method: String, | ||
51 | } | ||
52 | |||
53 | impl From<(u64, PendingRequest)> for CompletedRequest { | ||
54 | fn from((id, pending): (u64, PendingRequest)) -> CompletedRequest { | ||
55 | CompletedRequest { id, method: pending.method, duration: pending.received.elapsed() } | ||
56 | } | ||
57 | } | ||
58 | |||
48 | const THREADPOOL_SIZE: usize = 8; | 59 | const THREADPOOL_SIZE: usize = 8; |
49 | 60 | ||
50 | pub fn main_loop( | 61 | pub fn main_loop( |
@@ -97,7 +108,9 @@ pub fn main_loop( | |||
97 | ); | 108 | ); |
98 | 109 | ||
99 | log::info!("waiting for tasks to finish..."); | 110 | log::info!("waiting for tasks to finish..."); |
100 | task_receiver.into_iter().for_each(|task| on_task(task, msg_sender, &mut pending_requests)); | 111 | task_receiver |
112 | .into_iter() | ||
113 | .for_each(|task| on_task(task, msg_sender, &mut pending_requests, &mut state)); | ||
101 | log::info!("...tasks have finished"); | 114 | log::info!("...tasks have finished"); |
102 | log::info!("joining threadpool..."); | 115 | log::info!("joining threadpool..."); |
103 | drop(pool); | 116 | drop(pool); |
@@ -159,7 +172,7 @@ fn main_loop_inner( | |||
159 | task_sender: Sender<Task>, | 172 | task_sender: Sender<Task>, |
160 | task_receiver: Receiver<Task>, | 173 | task_receiver: Receiver<Task>, |
161 | state: &mut ServerWorldState, | 174 | state: &mut ServerWorldState, |
162 | pending_requests: &mut FxHashMap<u64, Instant>, | 175 | pending_requests: &mut FxHashMap<u64, PendingRequest>, |
163 | subs: &mut Subscriptions, | 176 | subs: &mut Subscriptions, |
164 | ) -> Result<()> { | 177 | ) -> Result<()> { |
165 | // We try not to index more than THREADPOOL_SIZE - 3 libraries at the same | 178 | // We try not to index more than THREADPOOL_SIZE - 3 libraries at the same |
@@ -195,7 +208,7 @@ fn main_loop_inner( | |||
195 | let mut state_changed = false; | 208 | let mut state_changed = false; |
196 | match event { | 209 | match event { |
197 | Event::Task(task) => { | 210 | Event::Task(task) => { |
198 | on_task(task, msg_sender, pending_requests); | 211 | on_task(task, msg_sender, pending_requests, state); |
199 | state.maybe_collect_garbage(); | 212 | state.maybe_collect_garbage(); |
200 | } | 213 | } |
201 | Event::Vfs(task) => { | 214 | Event::Vfs(task) => { |
@@ -292,12 +305,15 @@ fn main_loop_inner( | |||
292 | fn on_task( | 305 | fn on_task( |
293 | task: Task, | 306 | task: Task, |
294 | msg_sender: &Sender<RawMessage>, | 307 | msg_sender: &Sender<RawMessage>, |
295 | pending_requests: &mut FxHashMap<u64, Instant>, | 308 | pending_requests: &mut FxHashMap<u64, PendingRequest>, |
309 | state: &mut ServerWorldState, | ||
296 | ) { | 310 | ) { |
297 | match task { | 311 | match task { |
298 | Task::Respond(response) => { | 312 | Task::Respond(response) => { |
299 | if let Some(request_received) = pending_requests.remove(&response.id) { | 313 | if let Some(pending) = pending_requests.remove(&response.id) { |
300 | log::info!("handled req#{} in {:?}", response.id, request_received.elapsed()); | 314 | let completed = CompletedRequest::from((response.id, pending)); |
315 | log::info!("handled req#{} in {:?}", completed.id, completed.duration); | ||
316 | state.complete_request(completed); | ||
301 | msg_sender.send(response.into()).unwrap(); | 317 | msg_sender.send(response.into()).unwrap(); |
302 | } | 318 | } |
303 | } | 319 | } |
@@ -309,12 +325,13 @@ fn on_task( | |||
309 | 325 | ||
310 | fn on_request( | 326 | fn on_request( |
311 | world: &mut ServerWorldState, | 327 | world: &mut ServerWorldState, |
312 | pending_requests: &mut FxHashMap<u64, Instant>, | 328 | pending_requests: &mut FxHashMap<u64, PendingRequest>, |
313 | pool: &ThreadPool, | 329 | pool: &ThreadPool, |
314 | sender: &Sender<Task>, | 330 | sender: &Sender<Task>, |
315 | request_received: Instant, | 331 | request_received: Instant, |
316 | req: RawRequest, | 332 | req: RawRequest, |
317 | ) -> Result<Option<RawRequest>> { | 333 | ) -> Result<Option<RawRequest>> { |
334 | let method = req.method.clone(); | ||
318 | let mut pool_dispatcher = PoolDispatcher { req: Some(req), res: None, pool, world, sender }; | 335 | let mut pool_dispatcher = PoolDispatcher { req: Some(req), res: None, pool, world, sender }; |
319 | let req = pool_dispatcher | 336 | let req = pool_dispatcher |
320 | .on::<req::AnalyzerStatus>(handlers::handle_analyzer_status)? | 337 | .on::<req::AnalyzerStatus>(handlers::handle_analyzer_status)? |
@@ -348,7 +365,8 @@ fn on_request( | |||
348 | .finish(); | 365 | .finish(); |
349 | match req { | 366 | match req { |
350 | Ok(id) => { | 367 | Ok(id) => { |
351 | let prev = pending_requests.insert(id, request_received); | 368 | let prev = |
369 | pending_requests.insert(id, PendingRequest { method, received: request_received }); | ||
352 | assert!(prev.is_none(), "duplicate request: {}", id); | 370 | assert!(prev.is_none(), "duplicate request: {}", id); |
353 | Ok(None) | 371 | Ok(None) |
354 | } | 372 | } |
@@ -359,7 +377,7 @@ fn on_request( | |||
359 | fn on_notification( | 377 | fn on_notification( |
360 | msg_sender: &Sender<RawMessage>, | 378 | msg_sender: &Sender<RawMessage>, |
361 | state: &mut ServerWorldState, | 379 | state: &mut ServerWorldState, |
362 | pending_requests: &mut FxHashMap<u64, Instant>, | 380 | pending_requests: &mut FxHashMap<u64, PendingRequest>, |
363 | subs: &mut Subscriptions, | 381 | subs: &mut Subscriptions, |
364 | not: RawNotification, | 382 | not: RawNotification, |
365 | ) -> Result<()> { | 383 | ) -> Result<()> { |