xref: /DragonReach/src/manager/mod.rs (revision dfd3fd9812f3584f9392934d1254e24d17661b2d)
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                     //TODO:交付给相应类型的Unit类型去执行退出后的逻辑
25                     exited_unit.push((
26                         *unit.0,
27                         ExitStatus::from_exit_code(status.code().unwrap_or(0)),
28                     ));
29                 }
30                 //进程错误退出(或启动失败)
31                 Err(e) => {
32                     eprintln!("unit error: {}", e);
33 
34                     //test
35                     exited_unit.push((*unit.0, ExitStatus::from_exit_code(!0)));
36                 }
37                 //进程处于正常运行状态
38                 _ => {}
39             }
40         }
41         //释放锁,以便后续删除操作能拿到锁
42         drop(running_manager);
43 
44         // 处理退出的Unit
45         for tmp in exited_unit {
46             // 从运行表中擦除该unit
47             UnitManager::remove_running(tmp.0);
48 
49             // 取消该任务的定时器任务
50             TimerManager::cancel_timer(tmp.0);
51 
52             // 交付处理子进程退出逻辑
53             let unit = UnitManager::get_unit_with_id(&tmp.0).unwrap();
54             unit.lock().unwrap().after_exit(tmp.1);
55         }
56 
57         // 若无运行中任务,则取出IDLE任务运行
58         if UnitManager::running_count() == 0 {
59             let unit = UnitManager::pop_a_idle_service();
60             match unit {
61                 Some(unit) => {
62                     let _ = unit.lock().unwrap().run();
63                 }
64                 None => {}
65             }
66         }
67     }
68 
69     /// ## 检查当前所有cmd进程的运行状态
70     pub fn check_cmd_proc() {
71         let mut exited = Vec::new();
72         let mut table = CMD_PROCESS_TABLE.write().unwrap();
73         for tuple in table.iter_mut() {
74             let mut proc = tuple.1.lock().unwrap();
75             match proc.try_wait() {
76                 // 正常运行
77                 Ok(None) => {}
78                 // 停止运行,从表中删除数据
79                 _ => {
80                     // TODO: 应该添加错误处理,有一些命令执行失败会影响服务正常运行
81                     // 后续应该添加机制来执行服务相关命令启动失败的回调
82                     exited.push(*tuple.0);
83                 }
84             }
85         }
86 
87         for id in exited {
88             table.remove(&id);
89         }
90     }
91 }
92