#[cfg(target_os = "dragonos")] use drstd as std; use std::{ sync::{Arc, RwLock}, collections::hash_map::DefaultHasher, process::Child, }; use std::hash::{Hash,Hasher}; use crate::unit::Unit; use hashbrown::HashMap; use lazy_static::lazy_static; lazy_static! { pub static ref GLOBAL_UNIT_MANAGER: RwLock = { RwLock::new(UnitManager { id_to_unit: HashMap::new(), path_to_unit: HashMap::new(), running_table: Vec::new(), }) }; } pub struct RunnnigUnit(Child,Arc); impl RunnnigUnit { pub fn new(p:Child,unit: Arc) -> Self { RunnnigUnit(p,unit) } } pub struct UnitManager { // 通过unit_id映射unit pub id_to_unit: HashMap>, // 通过path的hash值来映射Unit pub path_to_unit: HashMap>, pub running_table: Vec } unsafe impl Sync for UnitManager {} impl UnitManager { pub fn insert_into_path_table(&mut self,path: &str,unit: Arc){ let mut hasher = DefaultHasher::new(); path.hash(&mut hasher); let hash = hasher.finish(); self.path_to_unit.insert(hash, unit); } pub fn contants_path(&self,path: &str) -> bool{ let mut hasher = DefaultHasher::new(); path.hash(&mut hasher); let hash = hasher.finish(); self.path_to_unit.contains_key(&hash) } pub fn get_unit_with_path(&self,path: &str) -> Option<&Arc> { let mut hasher = DefaultHasher::new(); path.hash(&mut hasher); let hash = hasher.finish(); self.path_to_unit.get(&hash) } }