File tree Expand file tree Collapse file tree 3 files changed +12
-6
lines changed Expand file tree Collapse file tree 3 files changed +12
-6
lines changed Original file line number Diff line number Diff line change @@ -25,6 +25,7 @@ use alloc::sync::Arc;
2525use hashbrown:: HashMap ;
2626
2727use crate :: userland:: scheduler;
28+ use crate :: userland:: task:: TaskState ;
2829use crate :: utils:: sync:: Mutex ;
2930
3031use 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
Original file line number Diff line number Diff 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 ( ) ) }
Original file line number Diff line number Diff line change @@ -73,6 +73,7 @@ pub enum TaskState {
7373 Runnable ,
7474 Zombie ,
7575 AwaitingIo ,
76+ AwaitingIoDeadline ,
7677}
7778
7879impl 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 }
You can’t perform that action at this time.
0 commit comments