@@ -56,13 +56,15 @@ impl<T> Deref for FifoTask<T> {
56
56
/// It internally uses a linked list as the ready queue.
57
57
pub struct FifoScheduler < T > {
58
58
ready_queue : List < Arc < FifoTask < T > > > ,
59
+ num_tasks : usize ,
59
60
}
60
61
61
62
impl < T > FifoScheduler < T > {
62
63
/// Creates a new empty [`FifoScheduler`].
63
64
pub const fn new ( ) -> Self {
64
65
Self {
65
66
ready_queue : List :: new ( ) ,
67
+ num_tasks : 0 ,
66
68
}
67
69
}
68
70
/// get the name of scheduler
@@ -77,18 +79,30 @@ impl<T> BaseScheduler for FifoScheduler<T> {
77
79
fn init ( & mut self ) { }
78
80
79
81
fn add_task ( & mut self , task : Self :: SchedItem ) {
82
+ self . num_tasks += 1 ;
80
83
self . ready_queue . push_back ( task) ;
81
84
}
82
85
83
86
fn remove_task ( & mut self , task : & Self :: SchedItem ) -> Option < Self :: SchedItem > {
84
- unsafe { self . ready_queue . remove ( task) }
87
+ let res = unsafe { self . ready_queue . remove ( task) } ;
88
+ if res. is_some ( ) {
89
+ // Only decrement the number of tasks if the task is removed.
90
+ self . num_tasks -= 1 ;
91
+ }
92
+ res
85
93
}
86
94
87
95
fn pick_next_task ( & mut self ) -> Option < Self :: SchedItem > {
88
- self . ready_queue . pop_front ( )
96
+ let res = self . ready_queue . pop_front ( ) ;
97
+ if res. is_some ( ) {
98
+ // Only decrement the number of tasks if the task is picked.
99
+ self . num_tasks -= 1 ;
100
+ }
101
+ res
89
102
}
90
103
91
104
fn put_prev_task ( & mut self , prev : Self :: SchedItem , _preempt : bool ) {
105
+ self . num_tasks += 1 ;
92
106
self . ready_queue . push_back ( prev) ;
93
107
}
94
108
@@ -99,4 +113,8 @@ impl<T> BaseScheduler for FifoScheduler<T> {
99
113
fn set_priority ( & mut self , _task : & Self :: SchedItem , _prio : isize ) -> bool {
100
114
false
101
115
}
116
+
117
+ fn num_tasks ( & self ) -> usize {
118
+ self . num_tasks
119
+ }
102
120
}
0 commit comments