Decrease RAM usage by status collection in microdroid_manager
Bug: 254208056
Test: Checking log from atest MicrodroidTestCase#testMicrodroidRamUsage
Change-Id: Ifee453de559b82f7640d037bf77b1fa8e3676303
diff --git a/microdroid_manager/Android.bp b/microdroid_manager/Android.bp
index 8741fb8..4b06b3e 100644
--- a/microdroid_manager/Android.bp
+++ b/microdroid_manager/Android.bp
@@ -34,7 +34,6 @@
"libonce_cell",
"libopenssl",
"libprotobuf",
- "libregex",
"librpcbinder_rs",
"librustutils",
"libscopeguard",
diff --git a/microdroid_manager/src/procutil.rs b/microdroid_manager/src/procutil.rs
index b323ca9..f9479c4 100644
--- a/microdroid_manager/src/procutil.rs
+++ b/microdroid_manager/src/procutil.rs
@@ -12,10 +12,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-use anyhow::{Context, Result};
+use anyhow::{bail, Result};
use libc::{sysconf, _SC_CLK_TCK};
-use regex::Regex;
-use std::fs::{self, File};
+use std::fs::File;
use std::io::{BufRead, BufReader};
const MILLIS_PER_SEC: i64 = 1000;
@@ -57,19 +56,20 @@
// sys: 10771070
// idle: 10480973587
pub fn get_cpu_time() -> Result<CpuTime> {
- let re = Regex::new(r"^cpu\s+([\d]+)\s([\d]+)\s([\d]+)\s([\d]+)").unwrap();
-
let mut proc_stat = BufReader::new(File::open("/proc/stat")?);
let mut line = String::new();
proc_stat.read_line(&mut line)?;
- let data_list = re.captures(&line).context("Failed to capture values")?;
+ let data_list: Vec<_> = line.split_whitespace().filter_map(|s| s.parse::<i64>().ok()).collect();
+ if data_list.len() < 4 {
+ bail!("Failed to extract numeric values in /proc/stat :\n{}", line);
+ }
let ticks_per_sec = unsafe { sysconf(_SC_CLK_TCK) } as i64;
let cpu_time = CpuTime {
- user: data_list.get(1).unwrap().as_str().parse::<i64>()? * MILLIS_PER_SEC / ticks_per_sec,
- nice: data_list.get(2).unwrap().as_str().parse::<i64>()? * MILLIS_PER_SEC / ticks_per_sec,
- sys: data_list.get(3).unwrap().as_str().parse::<i64>()? * MILLIS_PER_SEC / ticks_per_sec,
- idle: data_list.get(4).unwrap().as_str().parse::<i64>()? * MILLIS_PER_SEC / ticks_per_sec,
+ user: data_list[0] * MILLIS_PER_SEC / ticks_per_sec,
+ nice: data_list[1] * MILLIS_PER_SEC / ticks_per_sec,
+ sys: data_list[2] * MILLIS_PER_SEC / ticks_per_sec,
+ idle: data_list[3] * MILLIS_PER_SEC / ticks_per_sec,
};
Ok(cpu_time)
}
@@ -105,21 +105,23 @@
// buffer: 10231296
// cached: 189502836
pub fn get_mem_info() -> Result<MemInfo> {
- let re = Regex::new(r"^.*?:\s+([0-9]+)\skB").unwrap();
-
- let proc_mem_info = fs::read_to_string("/proc/meminfo")?;
- let data_list: Vec<_> = proc_mem_info
- .trim()
- .splitn(6, '\n')
- .map(|s| re.captures(s).context("Failed to capture values").ok()?.get(1))
- .collect();
+ let mut proc_stat = BufReader::new(File::open("/proc/meminfo")?);
+ let mut lines = String::new();
+ for _ in 0..5 {
+ proc_stat.read_line(&mut lines)?;
+ }
+ let data_list: Vec<_> =
+ lines.split_whitespace().filter_map(|s| s.parse::<i64>().ok()).collect();
+ if data_list.len() != 5 {
+ bail!("Failed to extract numeric values in /proc/meminfo :\n{}", lines);
+ }
let mem_info = MemInfo {
- total: data_list[0].unwrap().as_str().parse::<i64>()?,
- free: data_list[1].unwrap().as_str().parse::<i64>()?,
- available: data_list[2].unwrap().as_str().parse::<i64>()?,
- buffer: data_list[3].unwrap().as_str().parse::<i64>()?,
- cached: data_list[4].unwrap().as_str().parse::<i64>()?,
+ total: data_list[0],
+ free: data_list[1],
+ available: data_list[2],
+ buffer: data_list[3],
+ cached: data_list[4],
};
Ok(mem_info)
}