Skip to content

Commit e045934

Browse files
fix(epoll)
TODO: Cleanup the task state enum. Signed-off-by: Anhad Singh <[email protected]>
1 parent 2c46ee9 commit e045934

File tree

3 files changed

+12
-6
lines changed

3 files changed

+12
-6
lines changed

src/aero_kernel/src/fs/epoll.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use alloc::sync::Arc;
2525
use hashbrown::HashMap;
2626

2727
use crate::userland::scheduler;
28+
use crate::userland::task::TaskState;
2829
use crate::utils::sync::Mutex;
2930

3031
use super::inode::{INodeInterface, PollTable};
@@ -193,9 +194,10 @@ impl EPoll {
193194
}
194195

195196
'search: loop {
196-
scheduler::get_scheduler().inner.await_io()?;
197-
198-
if current_task.load_sleep_duration() == 0 && timeout > 0 {
197+
if current_task.state() == TaskState::AwaitingIoDeadline
198+
&& current_task.load_sleep_duration() == 0
199+
&& timeout > 0
200+
{
199201
// Timeout has expired.
200202
return Ok(0);
201203
}
@@ -224,6 +226,8 @@ impl EPoll {
224226
n = 1;
225227
break 'search;
226228
}
229+
230+
scheduler::get_scheduler().inner.await_io()?;
227231
}
228232
}
229233

src/aero_kernel/src/userland/scheduler/round_robin.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ impl TaskQueue {
8080
fn push_deadline_awaiting(&mut self, task: Arc<Task>, duration: usize) {
8181
debug_assert!(!task.link.is_linked()); // Make sure the task is not already linked
8282

83-
task.update_state(TaskState::AwaitingIo);
83+
task.update_state(TaskState::AwaitingIoDeadline);
8484
task.set_sleep_duration(crate::arch::time::get_uptime_ticks() + duration);
8585

8686
self.deadline_awaiting.push_back(task);
@@ -214,8 +214,8 @@ impl SchedulerInterface for RoundRobin {
214214
let _guard = IrqGuard::new();
215215
let queue = self.queue.get_mut();
216216

217-
if task.state() == TaskState::AwaitingIo {
218-
let mut cursor = if task.load_sleep_duration() > 0 {
217+
if task.state() == TaskState::AwaitingIo || task.state() == TaskState::AwaitingIoDeadline {
218+
let mut cursor = if task.state() == TaskState::AwaitingIoDeadline {
219219
unsafe { queue.deadline_awaiting.cursor_mut_from_ptr(task.as_ref()) }
220220
} else {
221221
unsafe { queue.awaiting.cursor_mut_from_ptr(task.as_ref()) }

src/aero_kernel/src/userland/task/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ pub enum TaskState {
7373
Runnable,
7474
Zombie,
7575
AwaitingIo,
76+
AwaitingIoDeadline,
7677
}
7778

7879
impl From<u8> for TaskState {
@@ -81,6 +82,7 @@ impl From<u8> for TaskState {
8182
0 => TaskState::Runnable,
8283
1 => TaskState::Zombie,
8384
2 => TaskState::AwaitingIo,
85+
3 => TaskState::AwaitingIoDeadline,
8486
_ => panic!("invalid task state"),
8587
}
8688
}

0 commit comments

Comments
 (0)