42-archive/kernel-rs/src/scheduling/sleep.rs
2019-02-02 18:46:41 +01:00

41 lines
1 KiB
Rust

//! sleeping processing are stored in a delta queue
//! separate from other scheduling structures: this
//! way the scheduling algorithms don't have to worry about
//! managing these
//!
//! https://wiki.osdev.org/Blocking_Process
use alloc::collections::vec_deque::VecDeque;
use super::*;
struct Sleeper {
process: Process,
// ms
ticks: u32,
}
/// osdev calls this a delta queue but google doesnt know
struct DeltaQueue {
queue: VecDeque<Sleeper>,
}
impl DeltaQueue {
pub fn insert(&mut self, process: Process, ticks: u32) {
let sleeper = Sleeper { process, ticks };
}
/// decreases timer on the list and returns the number
/// of finished sleepers
pub fn tick(&mut self) -> u32 {
let mut i: u32 = 0;
while let Some(link) = self.queue.get_mut(i as usize) {
// find how many links have 0 ticks left
if link.ticks > 0 {
link.ticks -= 1;
break;
}
i += 1;
}
i
}
}