Don't wait for host's worktree updates if they disconnected

Co-Authored-By: Max Brunsfeld <max@zed.dev>
This commit is contained in:
Antonio Scandurra 2022-06-22 19:45:55 +02:00
parent 48ff443d10
commit 2d8ffbdfa2
2 changed files with 20 additions and 5 deletions

View file

@ -1343,6 +1343,15 @@ impl Project {
{ {
*sharing_has_stopped = true; *sharing_has_stopped = true;
self.collaborators.clear(); self.collaborators.clear();
for worktree in &self.worktrees {
if let Some(worktree) = worktree.upgrade(cx) {
worktree.update(cx, |worktree, _| {
if let Some(worktree) = worktree.as_remote_mut() {
worktree.disconnected_from_host();
}
});
}
}
cx.notify(); cx.notify();
} }
} }

View file

@ -81,7 +81,7 @@ pub struct RemoteWorktree {
pub(crate) background_snapshot: Arc<Mutex<Snapshot>>, pub(crate) background_snapshot: Arc<Mutex<Snapshot>>,
project_id: u64, project_id: u64,
client: Arc<Client>, client: Arc<Client>,
updates_tx: UnboundedSender<proto::UpdateWorktree>, updates_tx: Option<UnboundedSender<proto::UpdateWorktree>>,
last_scan_id_rx: watch::Receiver<usize>, last_scan_id_rx: watch::Receiver<usize>,
replica_id: ReplicaId, replica_id: ReplicaId,
diagnostic_summaries: TreeMap<PathKey, DiagnosticSummary>, diagnostic_summaries: TreeMap<PathKey, DiagnosticSummary>,
@ -202,7 +202,7 @@ impl Worktree {
replica_id, replica_id,
snapshot: snapshot.clone(), snapshot: snapshot.clone(),
background_snapshot: background_snapshot.clone(), background_snapshot: background_snapshot.clone(),
updates_tx, updates_tx: Some(updates_tx),
last_scan_id_rx, last_scan_id_rx,
client: client.clone(), client: client.clone(),
diagnostic_summaries: TreeMap::from_ordered_entries( diagnostic_summaries: TreeMap::from_ordered_entries(
@ -1042,13 +1042,19 @@ impl RemoteWorktree {
self.snapshot.clone() self.snapshot.clone()
} }
pub fn disconnected_from_host(&mut self) {
self.updates_tx.take();
}
pub fn update_from_remote( pub fn update_from_remote(
&mut self, &mut self,
envelope: TypedEnvelope<proto::UpdateWorktree>, envelope: TypedEnvelope<proto::UpdateWorktree>,
) -> Result<()> { ) -> Result<()> {
self.updates_tx if let Some(updates_tx) = &self.updates_tx {
.unbounded_send(envelope.payload) updates_tx
.expect("consumer runs to completion"); .unbounded_send(envelope.payload)
.expect("consumer runs to completion");
}
Ok(()) Ok(())
} }