From 9b521d6097e9620f714e880318cb02bc7c214cfd Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 22 Jun 2022 17:39:34 +0200 Subject: [PATCH] Use `Arc` to understand which await points are parking --- crates/collab/src/integration_tests.rs | 23 +++++++++++++++++------ crates/gpui/src/executor.rs | 17 ++++++++++------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/crates/collab/src/integration_tests.rs b/crates/collab/src/integration_tests.rs index 3d8b128659a54a27c98c2eca2815ad34bec8288c..02c3a2ea8a6fe1d5e95aabcabab6b3b7ce27522f 100644 --- a/crates/collab/src/integration_tests.rs +++ b/crates/collab/src/integration_tests.rs @@ -4400,7 +4400,7 @@ async fn test_random_collaboration( deterministic: Arc, rng: StdRng, ) { - cx.foreground().forbid_parking(); + deterministic.forbid_parking(); let max_peers = env::var("MAX_PEERS") .map(|i| i.parse().expect("invalid `MAX_PEERS` variable")) .unwrap_or(5); @@ -4626,10 +4626,13 @@ async fn test_random_collaboration( while operations < max_operations { if operations == disconnect_host_at { server.disconnect_client(user_ids[0]); - cx.foreground().advance_clock(RECEIVE_TIMEOUT); + deterministic.advance_clock(RECEIVE_TIMEOUT); drop(op_start_signals); + + deterministic.start_waiting(); let mut clients = futures::future::join_all(clients).await; - cx.foreground().run_until_parked(); + deterministic.finish_waiting(); + deterministic.run_until_parked(); let (host, host_project, mut host_cx, host_err) = clients.remove(0); if let Some(host_err) = host_err { @@ -4681,6 +4684,8 @@ async fn test_random_collaboration( cx.leak_detector(), next_entity_id, ); + + deterministic.start_waiting(); let guest = server.create_client(&mut guest_cx, &guest_username).await; let guest_project = Project::remote( host_project_id, @@ -4693,6 +4698,8 @@ async fn test_random_collaboration( ) .await .unwrap(); + deterministic.finish_waiting(); + let op_start_signal = futures::channel::mpsc::unbounded(); user_ids.push(guest.current_user_id(&guest_cx)); op_start_signals.push(op_start_signal.0); @@ -4715,8 +4722,10 @@ async fn test_random_collaboration( op_start_signals.remove(guest_ix); server.forbid_connections(); server.disconnect_client(removed_guest_id); - cx.foreground().advance_clock(RECEIVE_TIMEOUT); + deterministic.advance_clock(RECEIVE_TIMEOUT); + deterministic.start_waiting(); let (guest, guest_project, mut guest_cx, guest_err) = guest.await; + deterministic.finish_waiting(); server.allow_connections(); if let Some(guest_err) = guest_err { @@ -4766,15 +4775,17 @@ async fn test_random_collaboration( } if rng.lock().gen_bool(0.8) { - cx.foreground().run_until_parked(); + deterministic.run_until_parked(); } } } } drop(op_start_signals); + deterministic.start_waiting(); let mut clients = futures::future::join_all(clients).await; - cx.foreground().run_until_parked(); + deterministic.finish_waiting(); + deterministic.run_until_parked(); let (host_client, host_project, mut host_cx, host_err) = clients.remove(0); if let Some(host_err) = host_err { diff --git a/crates/gpui/src/executor.rs b/crates/gpui/src/executor.rs index 1bc8d61c44306abd612d412f4db9a5c18ba17136..76ee8ca4d6628bba8b72d31dd1ff78c191202088 100644 --- a/crates/gpui/src/executor.rs +++ b/crates/gpui/src/executor.rs @@ -366,6 +366,14 @@ impl Deterministic { self.state.lock().now = new_now; } + pub fn start_waiting(&self) { + self.state.lock().waiting_backtrace = Some(backtrace::Backtrace::new_unresolved()); + } + + pub fn finish_waiting(&self) { + self.state.lock().waiting_backtrace.take(); + } + pub fn forbid_parking(&self) { use rand::prelude::*; @@ -500,10 +508,7 @@ impl Foreground { #[cfg(any(test, feature = "test-support"))] pub fn start_waiting(&self) { match self { - Self::Deterministic { executor, .. } => { - executor.state.lock().waiting_backtrace = - Some(backtrace::Backtrace::new_unresolved()); - } + Self::Deterministic { executor, .. } => executor.start_waiting(), _ => panic!("this method can only be called on a deterministic executor"), } } @@ -511,9 +516,7 @@ impl Foreground { #[cfg(any(test, feature = "test-support"))] pub fn finish_waiting(&self) { match self { - Self::Deterministic { executor, .. } => { - executor.state.lock().waiting_backtrace.take(); - } + Self::Deterministic { executor, .. } => executor.finish_waiting(), _ => panic!("this method can only be called on a deterministic executor"), } }