DioxusLabs / dioxus

Fullstack GUI library for web, desktop, mobile, and more.
https://dioxuslabs.com
Apache License 2.0
18.5k stars 703 forks source link

Signal subscribers added during an update gets ignored #2306

Closed elias098 closed 1 week ago

elias098 commented 2 weeks ago

Problem

Currently new subscribers created when updating subscribers get overwritten, thus are ignored.

the code looks like this

// 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;

but i would expect

*inner.subscribers.lock().unwrap() = subscribers;

to be something like

*inner.subscribers.lock().unwrap().extend(subscribers);

Questionnaire