From 61360ea05f88eea52d6984b8ecdfd9cf5a8e03f3 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Thu, 25 Apr 2024 12:57:46 -0500 Subject: [PATCH] extend the subscriber list instead of overriding it; fixes subscribers added in mark_dirty (#2319) --- packages/signals/src/signal.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/signals/src/signal.rs b/packages/signals/src/signal.rs index ee7f184d2..be3aa33af 100644 --- a/packages/signals/src/signal.rs +++ b/packages/signals/src/signal.rs @@ -155,7 +155,8 @@ impl>> Signal { // We cannot hold the subscribers lock while calling mark_dirty, because mark_dirty can run user code which may cause a new subscriber to be added. If we hold the lock, we will deadlock. let mut subscribers = std::mem::take(&mut *inner.subscribers.lock().unwrap()); subscribers.retain(|reactive_context| reactive_context.mark_dirty()); - *inner.subscribers.lock().unwrap() = subscribers; + // Extend the subscribers list instead of overwriting it in case a subscriber is added while reactive contexts are marked dirty + inner.subscribers.lock().unwrap().extend(subscribers); } }