diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index b4543b02b0..f19ff21081 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -1283,10 +1283,6 @@ impl Buffer { self.text.wait_for_edits(edit_ids) } - pub fn wait_for_version(&mut self, version: clock::Global) -> impl Future { - self.text.wait_for_version(version) - } - pub fn set_active_selections( &mut self, selections: Arc<[Selection]>, diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 9dde473377..9533429ba9 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -2289,11 +2289,12 @@ impl Project { Ok::<_, anyhow::Error>((project_id, buffer)) })?; - buffer - .update(&mut cx, |buffer, _| { - buffer.wait_for_version(requested_version) - }) - .await; + if !buffer + .read_with(&cx, |buffer, _| buffer.version()) + .observed_all(&requested_version) + { + Err(anyhow!("save request depends on unreceived edits"))?; + } let (saved_version, mtime) = buffer.update(&mut cx, |buffer, cx| buffer.save(cx)).await?; Ok(proto::BufferSaved { diff --git a/crates/server/src/rpc.rs b/crates/server/src/rpc.rs index e0b919a50e..4fb88d0992 100644 --- a/crates/server/src/rpc.rs +++ b/crates/server/src/rpc.rs @@ -4215,6 +4215,21 @@ mod tests { .await .expect("completion request failed"); } + 20..=29 if buffer.read_with(&cx, |buffer, _| buffer.is_dirty()) => { + let (requested_version, save) = buffer.update(&mut cx, |buffer, cx| { + log::info!( + "Guest {}: saving buffer {:?}", + guest_id, + buffer.file().unwrap().full_path(cx) + ); + (buffer.version(), buffer.save(cx)) + }); + let (saved_version, _) = save.await.expect("completion request failed"); + buffer.read_with(&cx, |buffer, _| { + assert!(buffer.version().observed_all(&saved_version)); + assert!(saved_version.observed_all(&requested_version)); + }); + } _ => { buffer.update(&mut cx, |buffer, cx| { log::info!( diff --git a/crates/text/src/text.rs b/crates/text/src/text.rs index da003b5d44..9b7f8dd230 100644 --- a/crates/text/src/text.rs +++ b/crates/text/src/text.rs @@ -21,7 +21,7 @@ use operation_queue::OperationQueue; pub use patch::Patch; pub use point::*; pub use point_utf16::*; -use postage::{barrier, oneshot, prelude::*}; +use postage::{oneshot, prelude::*}; #[cfg(any(test, feature = "test-support"))] pub use random_char_iter::*; use rope::TextDimension; @@ -53,7 +53,6 @@ pub struct Buffer { pub lamport_clock: clock::Lamport, subscriptions: Topic, edit_id_resolvers: HashMap>>, - version_barriers: Vec<(clock::Global, barrier::Sender)>, } #[derive(Clone, Debug)] @@ -575,7 +574,6 @@ impl Buffer { lamport_clock, subscriptions: Default::default(), edit_id_resolvers: Default::default(), - version_barriers: Default::default(), } } @@ -837,8 +835,6 @@ impl Buffer { } } } - self.version_barriers - .retain(|(version, _)| !self.snapshot.version().observed_all(version)); Ok(()) } @@ -1309,16 +1305,6 @@ impl Buffer { } } - pub fn wait_for_version(&mut self, version: clock::Global) -> impl Future { - let (tx, mut rx) = barrier::channel(); - if !self.snapshot.version.observed_all(&version) { - self.version_barriers.push((version, tx)); - } - async move { - rx.recv().await; - } - } - fn resolve_edit(&mut self, edit_id: clock::Local) { for mut tx in self .edit_id_resolvers