diff --git a/gpui/src/app.rs b/gpui/src/app.rs index f99707cb8d..6a801812d1 100644 --- a/gpui/src/app.rs +++ b/gpui/src/app.rs @@ -1159,6 +1159,8 @@ impl MutableAppContext { pub fn finish_pending_tasks(&self) -> impl Future { let mut pending_tasks = self.future_handlers.keys().cloned().collect::>(); + pending_tasks.extend(self.stream_handlers.keys()); + let task_done = self.task_done.1.clone(); async move { @@ -3267,23 +3269,34 @@ mod tests { let (_, view) = app.add_window(|_| View); model.update(&mut app, |_, ctx| { - let _ = ctx.spawn(async {}, |_, _, _| {}); - let _ = ctx.spawn(async {}, |_, _, _| {}); - let _ = - ctx.spawn_stream(smol::stream::iter(vec![1, 2, 3]), |_, _, _| {}, |_, _| {}); + ctx.spawn(async {}, |_, _, _| {}).detach(); + ctx.spawn(async {}, |_, _, _| {}).detach(); }); view.update(&mut app, |_, ctx| { - let _ = ctx.spawn(async {}, |_, _, _| {}); - let _ = ctx.spawn(async {}, |_, _, _| {}); - let _ = - ctx.spawn_stream(smol::stream::iter(vec![1, 2, 3]), |_, _, _| {}, |_, _| {}); + ctx.spawn(async {}, |_, _, _| {}).detach(); + ctx.spawn(async {}, |_, _, _| {}).detach(); }); assert!(!app.0.borrow().future_handlers.is_empty()); app.finish_pending_tasks().await; assert!(app.0.borrow().future_handlers.is_empty()); app.finish_pending_tasks().await; // Don't block if there are no tasks + + model.update(&mut app, |_, ctx| { + ctx.spawn_stream(smol::stream::iter(vec![1, 2, 3]), |_, _, _| {}, |_, _| {}) + .detach(); + }); + + view.update(&mut app, |_, ctx| { + ctx.spawn_stream(smol::stream::iter(vec![1, 2, 3]), |_, _, _| {}, |_, _| {}) + .detach(); + }); + + assert!(!app.0.borrow().stream_handlers.is_empty()); + app.finish_pending_tasks().await; + assert!(app.0.borrow().stream_handlers.is_empty()); + app.finish_pending_tasks().await; // Don't block if there are no tasks }); } }