1use crate::ProcResult;
2#[cfg(feature = "serde1")]
3use serde::{Deserialize, Serialize};
4use std::io::BufRead;
5
6#[derive(Debug, Clone)]
7#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
8pub struct CGroupController {
10 pub name: String,
12 pub hierarchy: u32,
21 pub num_cgroups: u32,
23 pub enabled: bool,
25}
26
27#[derive(Debug, Clone)]
28#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
29pub struct CGroupControllers(pub Vec<CGroupController>);
33
34impl crate::FromBufRead for CGroupControllers {
35 fn from_buf_read<R: BufRead>(reader: R) -> ProcResult<Self> {
36 let mut vec = Vec::new();
37
38 for line in reader.lines() {
39 let line = line?;
40 if line.starts_with('#') {
41 continue;
42 }
43
44 let mut s = line.split_whitespace();
45 let name = expect!(s.next(), "name").to_owned();
46 let hierarchy = from_str!(u32, expect!(s.next(), "hierarchy"));
47 let num_cgroups = from_str!(u32, expect!(s.next(), "num_cgroups"));
48 let enabled = expect!(s.next(), "enabled") == "1";
49
50 vec.push(CGroupController {
51 name,
52 hierarchy,
53 num_cgroups,
54 enabled,
55 });
56 }
57
58 Ok(CGroupControllers(vec))
59 }
60}
61
62#[derive(Debug, Clone)]
64#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
65pub struct ProcessCGroup {
66 pub hierarchy: u32,
70 pub controllers: Vec<String>,
75
76 pub pathname: String,
81}
82
83#[derive(Debug, Clone)]
85#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
86pub struct ProcessCGroups(pub Vec<ProcessCGroup>);
87
88impl crate::FromBufRead for ProcessCGroups {
89 fn from_buf_read<R: BufRead>(reader: R) -> ProcResult<Self> {
90 let mut vec = Vec::new();
91
92 for line in reader.lines() {
93 let line = line?;
94 if line.starts_with('#') {
95 continue;
96 }
97
98 let mut s = line.splitn(3, ':');
99 let hierarchy = from_str!(u32, expect!(s.next(), "hierarchy"));
100 let controllers = expect!(s.next(), "controllers")
101 .split(',')
102 .filter(|s| !s.is_empty())
103 .map(|s| s.to_owned())
104 .collect();
105 let pathname = expect!(s.next(), "path").to_owned();
106
107 vec.push(ProcessCGroup {
108 hierarchy,
109 controllers,
110 pathname,
111 });
112 }
113
114 Ok(ProcessCGroups(vec))
115 }
116}
117
118impl IntoIterator for ProcessCGroups {
119 type IntoIter = std::vec::IntoIter<ProcessCGroup>;
120 type Item = ProcessCGroup;
121
122 fn into_iter(self) -> Self::IntoIter {
123 self.0.into_iter()
124 }
125}
126
127impl<'a> IntoIterator for &'a ProcessCGroups {
128 type IntoIter = std::slice::Iter<'a, ProcessCGroup>;
129 type Item = &'a ProcessCGroup;
130
131 fn into_iter(self) -> Self::IntoIter {
132 self.0.iter()
133 }
134}