1
0
mirror of https://github.com/rcore-os/rCore.git synced 2024-11-27 02:03:29 +04:00
rCore/kernel/src/process/mod.rs

65 lines
1.7 KiB
Rust
Raw Normal View History

2018-11-03 17:45:03 +04:00
use spin::Mutex;
pub use self::context::ContextImpl;
pub use ucore_process::*;
use consts::{MAX_CPU_NUM, MAX_PROCESS_NUM};
use arch::cpu;
use alloc::{boxed::Box, sync::Arc, vec::Vec};
use sync::Condvar;
use core::sync::atomic::*;
pub mod context;
2018-07-12 08:13:39 +04:00
pub fn init() {
2018-11-03 17:45:03 +04:00
// NOTE: max_time_slice <= 5 to ensure 'priority' test pass
let scheduler = Box::new(scheduler::RRScheduler::new(5));
let manager = Arc::new(ProcessManager::new(scheduler, MAX_PROCESS_NUM, Process::proc_exit));
2018-11-03 17:45:03 +04:00
extern fn idle(_arg: usize) -> ! {
loop { cpu::halt(); }
}
for i in 0..4 {
manager.add(ContextImpl::new_kernel(idle, i));
}
unsafe {
for cpu_id in 0..MAX_CPU_NUM {
PROCESSORS[cpu_id].init(cpu_id, ContextImpl::new_init(), manager.clone());
}
}
info!("process init end");
}
2018-11-03 17:45:03 +04:00
static PROCESSORS: [Processor; MAX_CPU_NUM] = [Processor::new(), Processor::new(), Processor::new(), Processor::new(), Processor::new(), Processor::new(), Processor::new(), Processor::new()];
#[derive(Default)]
pub struct Process {
parent: AtomicUsize,
children: Mutex<Vec<usize>>,
}
2018-11-03 17:45:03 +04:00
impl Process {
pub fn proc_exit(pid: usize) {
2018-11-13 18:52:11 +04:00
info!("proc_exit");
2018-11-03 17:45:03 +04:00
}
}
2018-07-17 15:06:30 +04:00
2018-11-03 17:45:03 +04:00
/// Get current thread struct
pub fn process() -> &'static mut ContextImpl {
use core::mem::transmute;
let (process, _): (&mut ContextImpl, *const ()) = unsafe {
transmute(processor().context())
};
process
2018-07-17 15:06:30 +04:00
}
2018-11-03 17:45:03 +04:00
// Implement dependencies for std::thread
2018-07-17 15:06:30 +04:00
2018-11-03 17:45:03 +04:00
#[no_mangle]
pub fn processor() -> &'static Processor {
&PROCESSORS[cpu::id()]
}
#[no_mangle]
pub fn new_kernel_context(entry: extern fn(usize) -> !, arg: usize) -> Box<Context> {
ContextImpl::new_kernel(entry, arg)
}