#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[derive(Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub struct HugePagePoolStatistics
{
pub number_of_static_pages_free: u64,
pub reserved: u64,
number_of_dynamic_pages_in_use: Option<u64>,
}
impl HugePagePoolStatistics
{
#[inline(always)]
pub fn number_of_dynamic_pages_in_use(&self) -> u64
{
self.number_of_dynamic_pages_in_use.unwrap_or(0)
}
#[inline(always)]
pub(crate) fn new(sys_path: &SysPath, huge_page_size: HugePageSize, base_path: impl FnOnce(&SysPath, HugePageSize) -> PathBuf) -> Option<Self>
{
let base_path = base_path(sys_path, huge_page_size);
if !base_path.exists()
{
return None
}
let base_path_ref = base_path.as_path();
#[inline(always)]
fn read(base_path: &Path, file_name: &str) -> u64
{
base_path.to_path_buf().append(file_name).read_value().unwrap()
}
const FreeHugePagesFileName: &'static str = "free_hugepages";
const SurpulusHugePagesFileName: &'static str = "surplus_hugepages";
const ReservedHugePagesFileName: &'static str = "resv_hugepages";
Some
(
Self
{
number_of_static_pages_free: read(base_path_ref, FreeHugePagesFileName),
reserved: read(base_path_ref, ReservedHugePagesFileName),
number_of_dynamic_pages_in_use: if huge_page_size.is_a_gigantic_huge_page()
{
None
}
else
{
Some(read(base_path_ref, SurpulusHugePagesFileName))
},
}
)
}
}