wip: more scheduler work

This commit is contained in:
Jonathan Kelley committed 2021-09-01 23:33:25 -04:00
1 parent 1cd5e69712
commit 44b4384961
4 files changed
+16 -10

No files matched your search

+1 -1
View File
@@ -1,3 +1,3 @@
{ {
"rust-analyzer.inlayHints.enable": true "rust-analyzer.inlayHints.enable": false
} }
+1 -1
View File
@@ -153,7 +153,7 @@ impl<'bump> DiffMachine<'bump> {
} }
} }
pub fn diff_scope(&'bump mut self, id: ScopeId) { pub fn diff_scope(&mut self, id: ScopeId) {
if let Some(component) = self.vdom.get_scope_mut(id) { if let Some(component) = self.vdom.get_scope_mut(id) {
let (old, new) = (component.frames.wip_head(), component.frames.fin_head()); let (old, new) = (component.frames.wip_head(), component.frames.fin_head());
self.stack.push(DiffInstruction::DiffNode { new, old }); self.stack.push(DiffInstruction::DiffNode { new, old });
+9 -7
View File
@@ -335,20 +335,20 @@ impl Scheduler {
/// ///
/// Will use the standard priority-based scheduling, batching, etc, but just won't interact with the async reactor. /// Will use the standard priority-based scheduling, batching, etc, but just won't interact with the async reactor.
pub fn work_sync<'a>(&'a mut self) -> Vec<Mutations<'a>> { pub fn work_sync<'a>(&'a mut self) -> Vec<Mutations<'a>> {
let mut committed_mutations = Vec::<Mutations<'static>>::new(); let mut committed_mutations = Vec::new();
// Internalize any pending work since the last time we ran
self.manually_poll_events(); self.manually_poll_events();
if !self.has_any_work() { if !self.has_any_work() {
self.pool.clean_up_garbage(); self.pool.clean_up_garbage();
return committed_mutations;
} }
while self.has_any_work() { self.consume_pending_events();
// do work
// Create work from the pending event queue while self.has_any_work() {
self.consume_pending_events(); self.shift_priorities();
self.work_on_current_lane(&mut || false, &mut committed_mutations);
} }
committed_mutations committed_mutations
@@ -419,7 +419,9 @@ impl Scheduler {
committed_mutations committed_mutations
} }
// returns true if the lane is finished /// Load the current lane, and work on it, periodically checking in if the deadline has been reached.
///
/// Returns true if the lane is finished before the deadline could be met.
pub fn work_on_current_lane( pub fn work_on_current_lane(
&mut self, &mut self,
deadline_reached: &mut impl FnMut() -> bool, deadline_reached: &mut impl FnMut() -> bool,
+5 -1
View File
@@ -228,6 +228,9 @@ impl VirtualDom {
unsafe { std::mem::transmute(diff_machine.mutations) } unsafe { std::mem::transmute(diff_machine.mutations) }
} }
/// Compute a manual diff of the VirtualDOM between states.
///
/// This can be useful when state inside the DOM is remotely changed from the outside, but not propogated as an event.
pub fn diff<'s>(&'s mut self) -> Mutations<'s> { pub fn diff<'s>(&'s mut self) -> Mutations<'s> {
let cur_component = self let cur_component = self
.scheduler .scheduler
@@ -236,7 +239,8 @@ impl VirtualDom {
.expect("The base scope should never be moved"); .expect("The base scope should never be moved");
if cur_component.run_scope(&self.scheduler.pool) { if cur_component.run_scope(&self.scheduler.pool) {
let mut diff_machine = DiffMachine::new(Mutations::new(), todo!()); let mut diff_machine: DiffMachine<'s> =
DiffMachine::new(Mutations::new(), &mut self.scheduler.pool);
diff_machine.diff_scope(self.base_scope); diff_machine.diff_scope(self.base_scope);
diff_machine.mutations diff_machine.mutations
} else { } else {