mirror of
https://github.com/sgmarz/osblog.git
synced 2024-11-27 20:03:32 +04:00
42 lines
980 B
Rust
Executable File
42 lines
980 B
Rust
Executable File
// sched.rs
|
|
// Simple process scheduler
|
|
// Stephen Marz
|
|
// 27 Dec 2019
|
|
|
|
use crate::process::{ProcessState, PROCESS_LIST};
|
|
|
|
pub fn schedule() -> usize {
|
|
unsafe {
|
|
if let Some(mut pl) = PROCESS_LIST.take() {
|
|
pl.rotate_left(1);
|
|
let mut frame_addr: usize = 0;
|
|
// let mut mepc: usize = 0;
|
|
// let mut satp: usize = 0;
|
|
// let mut pid: usize = 0;
|
|
if let Some(prc) = pl.front() {
|
|
match prc.get_state() {
|
|
ProcessState::Running => {
|
|
frame_addr =
|
|
prc.get_frame_address();
|
|
// satp = prc.get_table_address();
|
|
// pid = prc.get_pid() as usize;
|
|
},
|
|
ProcessState::Sleeping => {},
|
|
_ => {},
|
|
}
|
|
}
|
|
// println!("Scheduling {}", pid);
|
|
PROCESS_LIST.replace(pl);
|
|
if frame_addr != 0 {
|
|
// MODE 8 is 39-bit virtual address MMU
|
|
// I'm using the PID as the address space
|
|
// identifier to hopefully help with (not?)
|
|
// flushing the TLB whenever we switch
|
|
// processes.
|
|
return frame_addr;
|
|
}
|
|
}
|
|
}
|
|
0
|
|
}
|