diff --git a/src/bin/izoli.rs b/src/bin/izoli.rs index 44c9839..5e2efff 100644 --- a/src/bin/izoli.rs +++ b/src/bin/izoli.rs @@ -7,4 +7,5 @@ fn main() { println!("{:?}", cgroup.read("cgroup.type")); println!("{:?}", cgroup.get_controllers()); println!("{:?}", cgroup.get_procs()); + println!("{:?}", cgroup.get_stat()); } diff --git a/src/cgroup/cgroup.rs b/src/cgroup/cgroup.rs index 96d1fd8..d1e2ca7 100644 --- a/src/cgroup/cgroup.rs +++ b/src/cgroup/cgroup.rs @@ -5,7 +5,7 @@ use std::{ str::FromStr, }; -use super::controller::Controller; +use super::{cgroup_stat::CGroupStat, controller::Controller}; pub struct CGroup { pub path: PathBuf, @@ -76,4 +76,10 @@ impl CGroup { Ok(procs) } + + pub fn get_stat(&self) -> Result { + let stat = self.read("cgroup.stat")?; + + Ok(CGroupStat::from_str(&stat).unwrap()) + } } diff --git a/src/cgroup/cgroup_stat.rs b/src/cgroup/cgroup_stat.rs new file mode 100644 index 0000000..c6ece8f --- /dev/null +++ b/src/cgroup/cgroup_stat.rs @@ -0,0 +1,31 @@ +use std::str::FromStr; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct CGroupStat { + pub nr_descendants: u64, + pub nr_dying_descendants: u64, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct ParseCGroupStatError; + +impl FromStr for CGroupStat { + type Err = ParseCGroupStatError; + + fn from_str(s: &str) -> Result { + let mut stat = Self { + nr_descendants: 0, + nr_dying_descendants: 0, + }; + + s.lines() + .map(|l| l.trim().split(" ").collect()) + .for_each(|s: Vec<&str>| match &*s[0] { + "nr_descendants" => stat.nr_descendants = u64::from_str(s[1]).unwrap(), + "nr_dying_descendants" => stat.nr_dying_descendants = u64::from_str(s[1]).unwrap(), + _ => (), + }); + + Ok(stat) + } +} diff --git a/src/cgroup/controller.rs b/src/cgroup/controller.rs new file mode 100644 index 0000000..ac56bfb --- /dev/null +++ b/src/cgroup/controller.rs @@ -0,0 +1,35 @@ +use std::str::FromStr; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Controller { + Cpu, + Cpuset, + Memory, + Io, + Hugetlb, + Misc, + Pids, + Rdma, + Unknown, +} + +#[derive(Debug, PartialEq, Eq)] +pub struct ParseControllerError; + +impl FromStr for Controller { + type Err = ParseControllerError; + + fn from_str(s: &str) -> Result { + match &*s { + "cpu" => Ok(Self::Cpu), + "cpuset" => Ok(Self::Cpuset), + "memory" => Ok(Self::Memory), + "io" => Ok(Self::Io), + "hugetlb" => Ok(Self::Hugetlb), + "misc" => Ok(Self::Misc), + "pids" => Ok(Self::Pids), + "rdma" => Ok(Self::Rdma), + _ => Err(ParseControllerError), + } + } +} diff --git a/src/cgroup/mod.rs b/src/cgroup/mod.rs index bcb5b67..d3a6bdd 100644 --- a/src/cgroup/mod.rs +++ b/src/cgroup/mod.rs @@ -1,2 +1,3 @@ pub mod cgroup; +pub mod cgroup_stat; pub mod controller;