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