1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- pub mod ctl_manager;
- pub mod timer_manager;
- pub mod unit_manager;
- pub use unit_manager::*;
- use crate::executor::ExitStatus;
- use self::timer_manager::TimerManager;
- pub struct Manager;
- impl Manager {
- /// ## 检查当前DragonReach运行的项目状态,并对其分发处理
- pub fn check_running_status() {
- // 检查正在运行的Unit
- let mut running_manager = RUNNING_TABLE.write().unwrap();
- let mut exited_unit: Vec<(usize, ExitStatus)> = Vec::new();
- for unit in running_manager.mut_running_table() {
- let proc = unit.1;
- match proc.try_wait() {
- //进程正常退出
- Ok(Some(status)) => {
- exited_unit.push((
- *unit.0,
- ExitStatus::from_exit_code(status.code().unwrap_or(0)),
- ));
- }
- //进程错误退出(或启动失败)
- Err(e) => {
- eprintln!("unit error: {}", e);
- //test
- exited_unit.push((*unit.0, ExitStatus::from_exit_code(!0)));
- }
- //进程处于正常运行状态
- _ => {}
- }
- }
- //释放锁,以便后续删除操作能拿到锁
- drop(running_manager);
- // 处理退出的Unit
- for tmp in exited_unit {
- // 从运行表中擦除该unit
- UnitManager::remove_running(tmp.0);
- // 取消该任务的定时器任务
- TimerManager::cancel_timer(tmp.0);
- let _ = UnitManager::get_unit_with_id(&tmp.0)
- .unwrap()
- .lock()
- .unwrap()
- .exit(); //交付给相应类型的Unit类型去执行退出后的逻辑
- TimerManager::update_next_trigger(tmp.0, false); //更新所有归属于此unit的计时器
- // 交付处理子进程退出逻辑
- let unit = UnitManager::get_unit_with_id(&tmp.0).unwrap();
- unit.lock().unwrap().after_exit(tmp.1);
- }
- // 若无运行中任务,则取出IDLE任务运行
- if UnitManager::running_count() == 0 {
- let unit = UnitManager::pop_a_idle_service();
- match unit {
- Some(unit) => {
- let _ = unit.lock().unwrap().run();
- }
- None => {}
- }
- }
- }
- /// ## 检查当前所有cmd进程的运行状态
- pub fn check_cmd_proc() {
- let mut exited = Vec::new();
- let mut table = CMD_PROCESS_TABLE.write().unwrap();
- for tuple in table.iter_mut() {
- let mut proc = tuple.1.lock().unwrap();
- match proc.try_wait() {
- // 正常运行
- Ok(None) => {}
- // 停止运行,从表中删除数据
- _ => {
- // TODO: 应该添加错误处理,有一些命令执行失败会影响服务正常运行
- // 后续应该添加机制来执行服务相关命令启动失败的回调
- exited.push(*tuple.0);
- }
- }
- }
- for id in exited {
- table.remove(&id);
- }
- }
- }
|