Checkpoint

This commit is contained in:
Nathan Sobo 2023-11-01 14:00:26 -06:00
parent 11b6d9e33a
commit 3f34a8e7ec
4 changed files with 14 additions and 31 deletions

View file

@ -102,7 +102,7 @@ impl BackgroundExecutor {
match future.as_mut().poll(&mut cx) { match future.as_mut().poll(&mut cx) {
Poll::Ready(result) => return result, Poll::Ready(result) => return result,
Poll::Pending => { Poll::Pending => {
if !self.dispatcher.poll() { if !self.dispatcher.poll(true) {
if awoken.swap(false, SeqCst) { if awoken.swap(false, SeqCst) {
continue; continue;
} }

View file

@ -162,7 +162,7 @@ pub trait PlatformDispatcher: Send + Sync {
fn dispatch(&self, runnable: Runnable); fn dispatch(&self, runnable: Runnable);
fn dispatch_on_main_thread(&self, runnable: Runnable); fn dispatch_on_main_thread(&self, runnable: Runnable);
fn dispatch_after(&self, duration: Duration, runnable: Runnable); fn dispatch_after(&self, duration: Duration, runnable: Runnable);
fn poll(&self) -> bool; fn poll(&self, background_only: bool) -> bool;
#[cfg(any(test, feature = "test-support"))] #[cfg(any(test, feature = "test-support"))]
fn as_test(&self) -> Option<&TestDispatcher> { fn as_test(&self) -> Option<&TestDispatcher> {

View file

@ -68,7 +68,7 @@ impl PlatformDispatcher for MacDispatcher {
} }
} }
fn poll(&self) -> bool { fn poll(&self, _background_only: bool) -> bool {
false false
} }
} }
@ -77,24 +77,3 @@ extern "C" fn trampoline(runnable: *mut c_void) {
let task = unsafe { Runnable::from_raw(runnable as *mut ()) }; let task = unsafe { Runnable::from_raw(runnable as *mut ()) };
task.run(); task.run();
} }
// #include <dispatch/dispatch.h>
// int main(void) {
// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// // Do some lengthy background work here...
// printf("Background Work\n");
// dispatch_async(dispatch_get_main_queue(), ^{
// // Once done, update your UI on the main queue here.
// printf("UI Updated\n");
// });
// });
// sleep(3); // prevent the program from terminating immediately
// return 0;
// }
// ```

View file

@ -96,7 +96,7 @@ impl TestDispatcher {
} }
pub fn run_until_parked(&self) { pub fn run_until_parked(&self) {
while self.poll() {} while self.poll(false) {}
} }
pub fn parking_allowed(&self) -> bool { pub fn parking_allowed(&self) -> bool {
@ -160,7 +160,7 @@ impl PlatformDispatcher for TestDispatcher {
state.delayed.insert(ix, (next_time, runnable)); state.delayed.insert(ix, (next_time, runnable));
} }
fn poll(&self) -> bool { fn poll(&self, background_only: bool) -> bool {
let mut state = self.state.lock(); let mut state = self.state.lock();
while let Some((deadline, _)) = state.delayed.first() { while let Some((deadline, _)) = state.delayed.first() {
@ -171,11 +171,15 @@ impl PlatformDispatcher for TestDispatcher {
state.background.push(runnable); state.background.push(runnable);
} }
let foreground_len: usize = state let foreground_len: usize = if background_only {
.foreground 0
.values() } else {
.map(|runnables| runnables.len()) state
.sum(); .foreground
.values()
.map(|runnables| runnables.len())
.sum()
};
let background_len = state.background.len(); let background_len = state.background.len();
if foreground_len == 0 && background_len == 0 { if foreground_len == 0 && background_len == 0 {