diff --git a/src/task/mod.rs b/src/task/mod.rs index ac01b51a..651251ff 100644 --- a/src/task/mod.rs +++ b/src/task/mod.rs @@ -5,6 +5,8 @@ use core::{ task::{Context, Poll}, }; +pub mod simple_executor; + pub struct Task { future: Pin>>, } diff --git a/src/task/simple_executor.rs b/src/task/simple_executor.rs new file mode 100644 index 00000000..63781d5a --- /dev/null +++ b/src/task/simple_executor.rs @@ -0,0 +1,44 @@ +use super::Task; +use alloc::collections::VecDeque; +use core::task::{Context, Poll, RawWaker, RawWakerVTable, Waker}; + +pub struct SimpleExecutor { + task_queue: VecDeque, +} + +impl SimpleExecutor { + pub fn new() -> SimpleExecutor { + SimpleExecutor { + task_queue: VecDeque::new(), + } + } + + pub fn spawn(&mut self, task: Task) { + self.task_queue.push_back(task) + } + + pub fn run(&mut self) { + while let Some(mut task) = self.task_queue.pop_front() { + let waker = dummy_waker(); + let mut context = Context::from_waker(&waker); + match task.poll(&mut context) { + Poll::Ready(()) => {} // task done + Poll::Pending => self.task_queue.push_back(task), + } + } + } +} + +fn dummy_raw_waker() -> RawWaker { + fn no_op(_: *const ()) {} + fn clone(_: *const ()) -> RawWaker { + dummy_raw_waker() + } + + let vtable = &RawWakerVTable::new(clone, no_op, no_op, no_op); + RawWaker::new(0 as *const (), vtable) +} + +fn dummy_waker() -> Waker { + unsafe { Waker::from_raw(dummy_raw_waker()) } +}