parent
394afa493e
commit
3a6803af9b
@ -0,0 +1,65 @@
|
|||||||
|
//! O(1) scheduler introduced in Linux 2.6
|
||||||
|
//!
|
||||||
|
//! Two queues are maintained, one is active, another is inactive.
|
||||||
|
//! Take the first task from the active queue to run. When it is empty, swap active and inactive queues.
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
pub struct O1Scheduler {
|
||||||
|
inner: Mutex<O1SchedulerInner>,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct O1SchedulerInner {
|
||||||
|
active_queue: usize,
|
||||||
|
queues: [Vec<Tid>; 2],
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Scheduler for O1Scheduler {
|
||||||
|
fn push(&self, tid: usize) {
|
||||||
|
self.inner.lock().push(tid);
|
||||||
|
}
|
||||||
|
fn pop(&self, _cpu_id: usize) -> Option<usize> {
|
||||||
|
self.inner.lock().pop()
|
||||||
|
}
|
||||||
|
fn tick(&self, current_tid: usize) -> bool {
|
||||||
|
self.inner.lock().tick(current_tid)
|
||||||
|
}
|
||||||
|
fn set_priority(&self, _tid: usize, _priority: u8) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl O1Scheduler {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
let inner = O1SchedulerInner {
|
||||||
|
active_queue: 0,
|
||||||
|
queues: [Vec::new(), Vec::new()],
|
||||||
|
};
|
||||||
|
O1Scheduler {
|
||||||
|
inner: Mutex::new(inner),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl O1SchedulerInner {
|
||||||
|
fn push(&mut self, tid: Tid) {
|
||||||
|
let inactive_queue = 1 - self.active_queue;
|
||||||
|
self.queues[inactive_queue].push(tid);
|
||||||
|
trace!("o1 push {}", tid - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn pop(&mut self) -> Option<Tid> {
|
||||||
|
let ret = match self.queues[self.active_queue].pop() {
|
||||||
|
Some(tid) => return Some(tid),
|
||||||
|
None => {
|
||||||
|
// active queue is empty, swap 'em
|
||||||
|
self.active_queue = 1 - self.active_queue;
|
||||||
|
self.queues[self.active_queue].pop()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
trace!("o1 pop {:?}", ret);
|
||||||
|
ret
|
||||||
|
}
|
||||||
|
|
||||||
|
fn tick(&mut self, _current: Tid) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue