1
0
mirror of https://github.com/rcore-os/rCore.git synced 2024-11-27 10:13:28 +04:00
rCore/src/process/mod.rs

133 lines
3.5 KiB
Rust
Raw Normal View History

use memory::MemoryController;
use spin::{Once, Mutex};
2018-05-13 11:06:44 +04:00
use core::slice;
use alloc::String;
use self::process::*;
use self::processor::*;
mod process;
mod processor;
/// 平台相关依赖struct TrapFrame
///
/// ## 必须实现的特性
///
/// * Debug: 用于Debug输出
use arch::interrupt::TrapFrame;
pub fn init(mut mc: MemoryController) {
PROCESSOR.call_once(|| {Mutex::new({
let initproc = Process::new_init(&mut mc);
let idleproc = Process::new("idle", idle_thread, &mut mc);
let mut processor = Processor::new();
processor.add(initproc);
processor.add(idleproc);
processor
})});
MC.call_once(|| Mutex::new(mc));
}
static PROCESSOR: Once<Mutex<Processor>> = Once::new();
static MC: Once<Mutex<MemoryController>> = Once::new();
extern fn idle_thread() {
loop {
println!("idle ...");
let mut i = 0;
2018-05-20 13:14:05 +04:00
while i < 1 << 22 {
i += 1;
}
}
2018-05-12 23:41:41 +04:00
}
2018-05-19 12:32:18 +04:00
/// Fork the current process. Return the child's PID.
2018-05-17 18:15:26 +04:00
pub fn sys_fork(tf: &TrapFrame) -> i32 {
let mut processor = PROCESSOR.try().unwrap().lock();
let mut mc = MC.try().unwrap().lock();
let new = processor.current().fork(tf, &mut mc);
2018-05-19 12:32:18 +04:00
let pid = processor.add(new);
info!("fork: {} -> {}", processor.current().pid, pid);
2018-05-19 12:32:18 +04:00
pid as i32
}
2018-05-20 13:14:05 +04:00
/// Wait the process exit.
/// Return the PID. Store exit code to `code` if it's not null.
pub fn sys_wait(rsp: &mut usize, pid: usize, code: *mut i32) -> i32 {
2018-05-19 12:32:18 +04:00
let mut processor = PROCESSOR.try().unwrap().lock();
let target = match pid {
0 => WaitTarget::AnyChild,
_ => WaitTarget::Proc(pid),
};
match processor.current_wait_for(target) {
2018-05-20 13:14:05 +04:00
WaitResult::Ok(pid, error_code) => {
if !code.is_null() {
unsafe { *code = error_code as i32 };
}
0 // pid as i32
},
2018-05-19 12:32:18 +04:00
WaitResult::Blocked => {
processor.schedule(rsp);
0 /* unused */
},
2018-05-20 13:14:05 +04:00
WaitResult::NotExist => -1,
2018-05-19 12:32:18 +04:00
}
2018-05-17 18:15:26 +04:00
}
2018-05-20 13:14:05 +04:00
pub fn sys_yield(rsp: &mut usize) -> i32 {
info!("yield:");
let mut processor = PROCESSOR.try().unwrap().lock();
processor.schedule(rsp);
0
}
2018-05-17 18:15:26 +04:00
/// Kill the process
pub fn sys_kill(pid: usize) -> i32 {
PROCESSOR.try().unwrap().lock().kill(pid);
0
}
/// Get the current process id
pub fn sys_getpid() -> i32 {
PROCESSOR.try().unwrap().lock().current().pid as i32
}
/// Exit the current process
2018-05-19 12:32:18 +04:00
pub fn sys_exit(rsp: &mut usize, error_code: ErrorCode) -> i32 {
2018-05-17 18:15:26 +04:00
let mut processor = PROCESSOR.try().unwrap().lock();
let pid = processor.current().pid;
processor.schedule(rsp);
processor.exit(pid, error_code);
0
}
2018-05-19 20:22:52 +04:00
pub fn sys_sleep(rsp: &mut usize, time: usize) -> i32 {
info!("sleep: {} ticks", time);
let mut processor = PROCESSOR.try().unwrap().lock();
let pid = processor.current().pid;
processor.schedule(rsp);
processor.sleep(pid, time);
0
}
pub fn sys_get_time() -> i32 {
let processor = PROCESSOR.try().unwrap().lock();
processor.get_time() as i32
}
pub fn timer_handler(tf: &TrapFrame, rsp: &mut usize) {
let mut processor = PROCESSOR.try().unwrap().lock();
processor.tick(rsp);
2018-05-19 20:22:52 +04:00
}
2018-05-19 12:32:18 +04:00
pub fn add_user_process(name: impl AsRef<str>, data: &[u8]) {
let mut processor = PROCESSOR.try().unwrap().lock();
let mut mc = MC.try().unwrap().lock();
let mut new = Process::new_user(data, &mut mc);
2018-05-19 12:32:18 +04:00
new.name = String::from(name.as_ref());
processor.add(new);
}
pub fn print() {
debug!("{:#x?}", *PROCESSOR.try().unwrap().lock());
}