diff --git a/crates/gpui/src/elements/list.rs b/crates/gpui/src/elements/list.rs index d77c91e655..47f0a82774 100644 --- a/crates/gpui/src/elements/list.rs +++ b/crates/gpui/src/elements/list.rs @@ -1,8 +1,9 @@ //! A list element that can be used to render a large number of differently sized elements //! efficiently. Clients of this API need to ensure that elements outside of the scrolled -//! area do not change their height for this element to function correctly. In order to minimize -//! re-renders, this element's state is stored intrusively on your own views, so that your code -//! can coordinate directly with the list element's cached state. +//! area do not change their height for this element to function correctly. If your elements +//! do change height, notify the list element via [`ListState::splice`] or [`ListState::reset`]. +//! In order to minimize re-renders, this element's state is stored intrusively +//! on your own views, so that your code can coordinate directly with the list element's cached state. //! //! If all of your elements are the same height, see [`UniformList`] for a simpler API diff --git a/crates/remote/src/ssh_session.rs b/crates/remote/src/ssh_session.rs index 16b7662871..d578e2eadd 100644 --- a/crates/remote/src/ssh_session.rs +++ b/crates/remote/src/ssh_session.rs @@ -1023,7 +1023,7 @@ impl SshRemoteClient { server_cx.update(|cx| ChannelClient::new(incoming_rx, outgoing_tx, cx, "fake-server")); let connection: Arc = Arc::new(fake::FakeRemoteConnection { connection_options: opts.clone(), - server_cx: fake::SendableCx::new(server_cx.to_async()), + server_cx: fake::SendableCx::new(server_cx), server_channel: server_client.clone(), }); @@ -2251,7 +2251,7 @@ mod fake { }, select_biased, FutureExt, SinkExt, StreamExt, }; - use gpui::{AsyncAppContext, Task}; + use gpui::{AsyncAppContext, Task, TestAppContext}; use rpc::proto::Envelope; use super::{ @@ -2266,15 +2266,19 @@ mod fake { } pub(super) struct SendableCx(AsyncAppContext); - // safety: you can only get the other cx on the main thread. impl SendableCx { - pub(super) fn new(cx: AsyncAppContext) -> Self { - Self(cx) + // SAFETY: When run in test mode, GPUI is always single threaded. + pub(super) fn new(cx: &TestAppContext) -> Self { + Self(cx.to_async()) } + + // SAFETY: Enforce that we're on the main thread by requiring a valid AsyncAppContext fn get(&self, _: &AsyncAppContext) -> AsyncAppContext { self.0.clone() } } + + // SAFETY: There is no way to access a SendableCx from a different thread, see [`SendableCx::new`] and [`SendableCx::get`] unsafe impl Send for SendableCx {} unsafe impl Sync for SendableCx {}