use std::collections::HashMap;
pub struct SimplePerfEventType {
pub name: String,
pub type_: u64,
pub config: u64,
}
impl SimplePerfEventType {
pub fn new(name: String, type_: u64, config: u64) -> Self {
Self {
name,
type_,
config,
}
}
}
pub fn parse_meta_info_map(bytes: &[u8]) -> Result<HashMap<&str, &str>, std::str::Utf8Error> {
let iter = bytes.split(|c| *c == b'\0');
let keys = iter.clone().step_by(2);
let values = iter.skip(1).step_by(2);
let mut map = HashMap::new();
for (key, value) in keys.zip(values) {
let key = std::str::from_utf8(key)?;
let value = std::str::from_utf8(value)?;
map.insert(key, value);
}
Ok(map)
}
pub fn get_event_types(meta_info_map: &HashMap<&str, &str>) -> Option<Vec<SimplePerfEventType>> {
let event_type_info = meta_info_map.get("event_type_info")?;
let mut event_types = Vec::new();
for line in event_type_info.split('\n') {
let mut parts = line.split(',');
let name = parts.next()?.to_string();
let type_ = parts.next()?.parse().ok()?;
let config = parts.next()?.parse().ok()?;
event_types.push(SimplePerfEventType::new(name, type_, config));
}
Some(event_types)
}