xref: /DragonReach/src/manager/mod.rs (revision ea330323f68db57353801959d67cbd8e0031aa18)
1 use std::{eprint, eprintln, print, println, vec::Vec};
2 
3 pub mod timer_manager;
4 pub mod unit_manager;
5 
6 pub use unit_manager::*;
7 
8 use crate::executor::ExitStatus;
9 
10 use self::timer_manager::TimerManager;
11 
12 pub struct Manager;
13 
14 impl Manager {
15     /// ## 检查当前DragonReach运行的项目状态,并对其分发处理
16     pub fn check_running_status() {
17         // 检查正在运行的Unit
18         let mut running_manager = RUNNING_TABLE.write().unwrap();
19         let mut exited_unit: Vec<(usize, ExitStatus)> = Vec::new();
20         for unit in running_manager.mut_running_table() {
21             let proc = unit.1;
22             match proc.try_wait() {
23                 //进程正常退出
24                 Ok(Some(status)) => {
25                     //TODO:交付给相应类型的Unit类型去执行退出后的逻辑
26                     println!("Service exited success");
27 
28                     exited_unit.push((*unit.0, ExitStatus::from_exit_code(status.code().unwrap())));
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