diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 1eb7616d926f45dcde622924b229814a34e817c2..612dcbdbcf2f20253d85ae6f8d755386fbbc8d47 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -1343,6 +1343,15 @@ impl Project { { *sharing_has_stopped = true; 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(); } } diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index d5e9b392e77da8ce05cee389597e8ea696c7e876..befcfe9fd159d1aec7c3e0313eff3679043bb2f6 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -81,7 +81,7 @@ pub struct RemoteWorktree { pub(crate) background_snapshot: Arc>, project_id: u64, client: Arc, - updates_tx: UnboundedSender, + updates_tx: Option>, last_scan_id_rx: watch::Receiver, replica_id: ReplicaId, diagnostic_summaries: TreeMap, @@ -202,7 +202,7 @@ impl Worktree { replica_id, snapshot: snapshot.clone(), background_snapshot: background_snapshot.clone(), - updates_tx, + updates_tx: Some(updates_tx), last_scan_id_rx, client: client.clone(), diagnostic_summaries: TreeMap::from_ordered_entries( @@ -1042,13 +1042,19 @@ impl RemoteWorktree { self.snapshot.clone() } + pub fn disconnected_from_host(&mut self) { + self.updates_tx.take(); + } + pub fn update_from_remote( &mut self, envelope: TypedEnvelope, ) -> Result<()> { - self.updates_tx - .unbounded_send(envelope.payload) - .expect("consumer runs to completion"); + if let Some(updates_tx) = &self.updates_tx { + updates_tx + .unbounded_send(envelope.payload) + .expect("consumer runs to completion"); + } Ok(()) }