1 #[cfg(target_os = "dragonos")] 2 use drstd as std; 3 4 use std::{eprint, eprintln, print, println, vec::Vec}; 5 6 pub mod timer_manager; 7 pub mod unit_manager; 8 9 pub use unit_manager::*; 10 11 use crate::executor::ExitStatus; 12 13 use self::timer_manager::TimerManager; 14 15 pub struct Manager; 16 17 impl Manager { 18 /// ## 检查当前DragonReach运行的项目状态,并对其分发处理 19 pub fn check_running_status() { 20 // 检查正在运行的Unit 21 let mut running_manager = RUNNING_TABLE.write().unwrap(); 22 let mut exited_unit: Vec<(usize, ExitStatus)> = Vec::new(); 23 for unit in running_manager.mut_running_table() { 24 let proc = unit.1; 25 match proc.try_wait() { 26 //进程正常退出 27 Ok(Some(status)) => { 28 //TODO:交付给相应类型的Unit类型去执行退出后的逻辑 29 println!("Service exited success"); 30 31 exited_unit.push((*unit.0, ExitStatus::from_exit_code(status.code().unwrap()))); 32 } 33 //进程错误退出(或启动失败) 34 Err(e) => { 35 eprintln!("unit error: {}", e); 36 37 //test 38 exited_unit.push((*unit.0, ExitStatus::from_exit_code(!0))); 39 } 40 //进程处于正常运行状态 41 _ => {} 42 } 43 } 44 //释放锁,以便后续删除操作能拿到锁 45 drop(running_manager); 46 47 // 处理退出的Unit 48 for tmp in exited_unit { 49 // 从运行表中擦除该unit 50 UnitManager::remove_running(tmp.0); 51 52 // 取消该任务的定时器任务 53 TimerManager::cancel_timer(tmp.0); 54 55 // 交付处理子进程退出逻辑 56 let unit = UnitManager::get_unit_with_id(&tmp.0).unwrap(); 57 unit.lock().unwrap().after_exit(tmp.1); 58 } 59 60 // 若无运行中任务,则取出IDLE任务运行 61 if UnitManager::running_count() == 0 { 62 let unit = UnitManager::pop_a_idle_service(); 63 match unit { 64 Some(unit) => { 65 let _ = unit.lock().unwrap().run(); 66 } 67 None => {} 68 } 69 } 70 } 71 72 /// ## 检查当前所有cmd进程的运行状态 73 pub fn check_cmd_proc() { 74 let mut exited = Vec::new(); 75 let mut table = CMD_PROCESS_TABLE.write().unwrap(); 76 for tuple in table.iter_mut() { 77 let mut proc = tuple.1.lock().unwrap(); 78 match proc.try_wait() { 79 // 正常运行 80 Ok(None) => {} 81 // 停止运行,从表中删除数据 82 _ => { 83 // TODO: 应该添加错误处理,有一些命令执行失败会影响服务正常运行 84 // 后续应该添加机制来执行服务相关命令启动失败的回调 85 exited.push(*tuple.0); 86 } 87 } 88 } 89 90 for id in exited { 91 table.remove(&id); 92 } 93 } 94 } 95