Skip to content

Commit e465c5b

Browse files
committed
Put the CPU to sleep when no task is ready
1 parent 50b4b89 commit e465c5b

File tree

1 file changed

+17
-0
lines changed

1 file changed

+17
-0
lines changed

src/task/executor.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ impl Executor {
3232
loop {
3333
self.wake_tasks();
3434
self.run_ready_tasks();
35+
self.sleep_if_idle();
3536
}
3637
}
3738

@@ -65,6 +66,22 @@ impl Executor {
6566
}
6667
}
6768

69+
fn sleep_if_idle(&self) {
70+
use x86_64::instructions::interrupts::{self, enable_interrupts_and_hlt};
71+
72+
// fast path
73+
if !self.wake_queue.is_empty() {
74+
return;
75+
}
76+
77+
interrupts::disable();
78+
if self.wake_queue.is_empty() {
79+
enable_interrupts_and_hlt();
80+
} else {
81+
interrupts::enable();
82+
}
83+
}
84+
6885
fn create_waker(&self, task_id: TaskId) -> Waker {
6986
Waker::from(Arc::new(TaskWaker {
7087
task_id,

0 commit comments

Comments
 (0)