use std::fmt::Debug;
use byteorder::ByteOrder;
use linux_perf_data::{linux_perf_event_reader, Endianness};
use linux_perf_event_reader::RawData;
#[allow(unused)]
pub const MM_FILEPAGES: i32 = 0;
#[allow(unused)]
pub const MM_ANONPAGES: i32 = 1;
#[allow(unused)]
pub const MM_SWAPENTS: i32 = 2;
#[allow(unused)]
pub const MM_SHMEMPAGES: i32 = 3;
#[repr(C)]
#[derive(Debug)]
pub struct RssStat {
pub common_type: u16,
pub common_flags: u8,
pub common_preempt_count: u8,
pub common_pid: i32,
pub mm_id: u32,
pub curr: u32,
pub member: i32,
pub size: i64,
}
impl RssStat {
pub fn parse(data: RawData, endian: Endianness) -> Result<Self, std::io::Error> {
match endian {
Endianness::LittleEndian => Self::parse_impl::<byteorder::LittleEndian>(data),
Endianness::BigEndian => Self::parse_impl::<byteorder::BigEndian>(data),
}
}
pub fn parse_impl<O: ByteOrder>(mut data: RawData) -> Result<Self, std::io::Error> {
let common_type = data.read_u16::<O>()?;
let common_flags = data.read_u8()?;
let common_preempt_count = data.read_u8()?;
let common_pid = data.read_i32::<O>()?;
let mm_id = data.read_u32::<O>()?;
let curr = data.read_u32::<O>()?;
let member = data.read_i32::<O>()?;
let _padding = data.read_u32::<O>()?;
let size = data.read_u64::<O>()? as i64;
Ok(RssStat {
common_type,
common_flags,
common_preempt_count,
common_pid,
mm_id,
curr,
member,
size,
})
}
}