diff --git a/Cargo.toml b/Cargo.toml index fa23667f..fbf839ab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ name = "stack_overflow" harness = false [dependencies] -bootloader = { version = "0.8.0", features = ["map_physical_memory"]} +bootloader = { version = "0.9.0", features = ["map_physical_memory"], path = "../../../bootloader/master"} volatile = "0.2.6" spin = "0.5.2" x86_64 = "0.9.6" diff --git a/src/task/simple_executor.rs b/src/task/simple_executor.rs index d20699e0..346df3c7 100644 --- a/src/task/simple_executor.rs +++ b/src/task/simple_executor.rs @@ -1,6 +1,9 @@ use super::Task; -use alloc::{collections::VecDeque, sync::Arc, task::Wake}; -use core::task::{Context, Poll, Waker}; +use alloc::collections::VecDeque; +use core::{ + ptr, + task::{Context, Poll, RawWaker, RawWakerVTable, Waker}, +}; pub struct SimpleExecutor { task_queue: VecDeque, @@ -19,7 +22,7 @@ impl SimpleExecutor { pub fn run(&mut self) { while let Some(mut task) = self.task_queue.pop_front() { - let waker = DummyWaker.to_waker(); + let waker = waker(); let mut context = Context::from_waker(&waker); match task.poll(&mut context) { Poll::Ready(()) => {} // task done @@ -29,16 +32,18 @@ impl SimpleExecutor { } } -struct DummyWaker; - -impl Wake for DummyWaker { - fn wake(self: Arc) { - // do nothing +fn raw_waker() -> RawWaker { + fn no_op(_: *const ()) {} + fn clone(_: *const ()) -> RawWaker { + raw_waker() } + + RawWaker::new( + ptr::null(), + &RawWakerVTable::new(clone, no_op, no_op, no_op), + ) } -impl DummyWaker { - fn to_waker(self) -> Waker { - Waker::from(Arc::new(self)) - } +fn waker() -> Waker { + unsafe { Waker::from_raw(raw_waker()) } }