Merge pull request #443 from flisky/master

fixes to usability and some edge case cleanup
This commit is contained in:
Jon Kelley authored and GitHub committed 2022-06-13 10:57:23 -04:00
commit 24273e4433
3 files changed
+15 -26

No files matched your search

+4 -5
View File
@@ -609,7 +609,7 @@ impl ScopeState {
/// Create a subscription that schedules a future render for the reference component /// Create a subscription that schedules a future render for the reference component
/// ///
/// ## Notice: you should prefer using prepare_update and get_scope_id /// ## Notice: you should prefer using schedule_update_any and scope_id
pub fn schedule_update(&self) -> Arc<dyn Fn() + Send + Sync + 'static> { pub fn schedule_update(&self) -> Arc<dyn Fn() + Send + Sync + 'static> {
let (chan, id) = (self.tasks.sender.clone(), self.scope_id()); let (chan, id) = (self.tasks.sender.clone(), self.scope_id());
Arc::new(move || { Arc::new(move || {
@@ -1000,12 +1000,11 @@ impl TaskQueue {
fn remove(&self, id: TaskId) { fn remove(&self, id: TaskId) {
if let Ok(mut tasks) = self.tasks.try_borrow_mut() { if let Ok(mut tasks) = self.tasks.try_borrow_mut() {
let _ = tasks.remove(&id); let _ = tasks.remove(&id);
if let Some(task_map) = self.task_map.borrow_mut().get_mut(&id.scope) {
task_map.remove(&id);
}
} }
// the task map is still around, but it'll be removed when the scope is unmounted // the task map is still around, but it'll be removed when the scope is unmounted
if let Some(task_map) = self.task_map.borrow_mut().get_mut(&id.scope) {
task_map.remove(&id);
}
} }
pub(crate) fn has_tasks(&self) -> bool { pub(crate) fn has_tasks(&self) -> bool {
+4 -21
View File
@@ -337,29 +337,12 @@ impl VirtualDom {
let scopes = &mut self.scopes; let scopes = &mut self.scopes;
let task_poll = poll_fn(|cx| { let task_poll = poll_fn(|cx| {
//
let mut any_pending = false;
let mut tasks = scopes.tasks.tasks.borrow_mut(); let mut tasks = scopes.tasks.tasks.borrow_mut();
let mut to_remove = vec![]; tasks.retain(|_, task| task.as_mut().poll(cx).is_pending());
// this would be better served by retain match tasks.is_empty() {
for (id, task) in tasks.iter_mut() { true => Poll::Ready(()),
if task.as_mut().poll(cx).is_ready() { false => Poll::Pending,
to_remove.push(*id);
} else {
any_pending = true;
}
}
for id in to_remove {
tasks.remove(&id);
}
// Resolve the future if any singular task is ready
match any_pending {
true => Poll::Pending,
false => Poll::Ready(()),
} }
}); });
+7
View File
@@ -74,6 +74,13 @@ impl AtomRoot {
} }
} else { } else {
log::trace!("no atoms found for {:?}", ptr); log::trace!("no atoms found for {:?}", ptr);
atoms.insert(
ptr,
Slot {
value: Rc::new(value),
subscribers: HashSet::new(),
},
);
} }
} }