From d7f9a07f4e4ea29e636ff2d59c5b01059975bcb1 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Sun, 15 Jan 2023 13:52:06 -0600 Subject: [PATCH] fix --- packages/core/src/arena.rs | 5 +++++ packages/core/src/diff.rs | 8 +++++++- packages/core/src/scopes.rs | 6 +++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/core/src/arena.rs b/packages/core/src/arena.rs index a1a211527..92986e3e0 100644 --- a/packages/core/src/arena.rs +++ b/packages/core/src/arena.rs @@ -111,6 +111,11 @@ impl VirtualDom { for hook in scope.hook_list.get_mut().drain(..) { drop(unsafe { BumpBox::from_raw(hook) }); } + + // Drop all the futures once the hooks are dropped + for task_id in scope.spawned_tasks.borrow_mut().drain() { + scope.tasks.remove(task_id); + } } fn drop_scope_inner(&mut self, node: &VNode) { diff --git a/packages/core/src/diff.rs b/packages/core/src/diff.rs index 410eec55c..ba1806647 100644 --- a/packages/core/src/diff.rs +++ b/packages/core/src/diff.rs @@ -938,7 +938,13 @@ impl<'b> VirtualDom { // make sure to wipe any of its props and listeners self.ensure_drop_safety(scope); - self.scopes.remove(scope.0); + let scope_id = scope.0; + let scope = unsafe { self.scopes.get_unchecked_mut(scope.0) }; + // Drop all the futures once the hooks are dropped + for task_id in scope.spawned_tasks.borrow_mut().drain() { + scope.tasks.remove(task_id); + } + self.scopes.remove(scope_id); } fn find_first_element(&self, node: &'b VNode<'b>) -> ElementId { diff --git a/packages/core/src/scopes.rs b/packages/core/src/scopes.rs index 2f18d14bd..5be209c4c 100644 --- a/packages/core/src/scopes.rs +++ b/packages/core/src/scopes.rs @@ -319,7 +319,9 @@ impl<'src> ScopeState { /// Pushes the future onto the poll queue to be polled after the component renders. pub fn push_future(&self, fut: impl Future + 'static) -> TaskId { - self.tasks.spawn(self.id, fut) + let id = self.tasks.spawn(self.id, fut); + self.spawned_tasks.borrow_mut().insert(id); + id } /// Spawns the future but does not return the [`TaskId`] @@ -340,6 +342,8 @@ impl<'src> ScopeState { .unbounded_send(SchedulerMsg::TaskNotified(id)) .expect("Scheduler should exist"); + self.spawned_tasks.borrow_mut().insert(id); + id }