xref: /DragonReach/src/manager/mod.rs (revision 2069cc0dc0984a2981454b00316ba607f88ac512)
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运行的项目状态,并对其分发处理
check_running_status()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进程的运行状态
check_cmd_proc()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