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); } }