aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_lsp_server/src/main_loop.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-05-29 13:42:14 +0100
committerAleksey Kladov <[email protected]>2019-05-29 13:47:46 +0100
commit2c9a1cb3dd941b3f2f608a0633f620478bce0c68 (patch)
tree130e5984e2a40f467815f9feb49c989beaa7ca97 /crates/ra_lsp_server/src/main_loop.rs
parente45c350a3b0ec5b25c23c334e09eba2901adbcd4 (diff)
add latest requests to status page
Diffstat (limited to 'crates/ra_lsp_server/src/main_loop.rs')
-rw-r--r--crates/ra_lsp_server/src/main_loop.rs38
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
48struct PendingRequest {
49 received: Instant,
50 method: String,
51}
52
53impl 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
48const THREADPOOL_SIZE: usize = 8; 59const THREADPOOL_SIZE: usize = 8;
49 60
50pub fn main_loop( 61pub 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(
292fn on_task( 305fn 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
310fn on_request( 326fn 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(
359fn on_notification( 377fn 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<()> {