diff --git a/crates/gpui_tokio/src/gpui_tokio.rs b/crates/gpui_tokio/src/gpui_tokio.rs index f6e1e0643b2c2a377c1bb8bd042f94c06d382709..d32843ae86f428a3f47f54e3387a75c5aedbcddc 100644 --- a/crates/gpui_tokio/src/gpui_tokio.rs +++ b/crates/gpui_tokio/src/gpui_tokio.rs @@ -17,37 +17,33 @@ pub fn init(cx: &mut App) { .build() .expect("Failed to initialize Tokio"); - cx.set_global(GlobalTokio::new(RuntimeHolder::Owned(runtime))); + let handle = runtime.handle().clone(); + cx.set_global(GlobalTokio { + owned_runtime: Some(runtime), + handle, + }); } /// Initializes the Tokio wrapper using a Tokio runtime handle. pub fn init_from_handle(cx: &mut App, handle: tokio::runtime::Handle) { - cx.set_global(GlobalTokio::new(RuntimeHolder::Shared(handle))); -} - -enum RuntimeHolder { - Owned(tokio::runtime::Runtime), - Shared(tokio::runtime::Handle), -} - -impl RuntimeHolder { - pub fn handle(&self) -> &tokio::runtime::Handle { - match self { - RuntimeHolder::Owned(runtime) => runtime.handle(), - RuntimeHolder::Shared(handle) => handle, - } - } + cx.set_global(GlobalTokio { + owned_runtime: None, + handle, + }); } struct GlobalTokio { - runtime: RuntimeHolder, + owned_runtime: Option, + handle: tokio::runtime::Handle, } impl Global for GlobalTokio {} -impl GlobalTokio { - fn new(runtime: RuntimeHolder) -> Self { - Self { runtime } +impl Drop for GlobalTokio { + fn drop(&mut self) { + if let Some(runtime) = self.owned_runtime.take() { + runtime.shutdown_background(); + } } } @@ -63,7 +59,7 @@ impl Tokio { R: Send + 'static, { cx.read_global(|tokio: &GlobalTokio, cx| { - let join_handle = tokio.runtime.handle().spawn(f); + let join_handle = tokio.handle.spawn(f); let abort_handle = join_handle.abort_handle(); let cancel = defer(move || { abort_handle.abort(); @@ -85,7 +81,7 @@ impl Tokio { R: Send + 'static, { cx.read_global(|tokio: &GlobalTokio, cx| { - let join_handle = tokio.runtime.handle().spawn(f); + let join_handle = tokio.handle.spawn(f); let abort_handle = join_handle.abort_handle(); let cancel = defer(move || { abort_handle.abort(); @@ -99,6 +95,6 @@ impl Tokio { } pub fn handle(cx: &App) -> tokio::runtime::Handle { - GlobalTokio::global(cx).runtime.handle().clone() + GlobalTokio::global(cx).handle.clone() } }