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