use crate::{
libproc::region_info::{RegionInfo, RegionWithPathInfo},
monitor::vnode::VnodeWithPath,
};
use ref_cast::RefCast;
use std::fmt::Debug;
#[repr(transparent)]
#[derive(RefCast, Clone, Copy)]
pub struct Region {
raw: RegionInfo,
}
impl Region {
pub fn from_raw(raw: RegionInfo) -> Self {
Self { raw }
}
pub fn as_raw(&self) -> &RegionInfo {
&self.raw
}
pub fn protection(&self) -> u32 {
self.raw.pri_protection
}
pub fn max_protection(&self) -> u32 {
self.raw.pri_max_protection
}
pub fn inheritance(&self) -> u32 {
self.raw.pri_inheritance
}
pub fn flags(&self) -> u32 {
self.raw.pri_flags
}
pub fn offset(&self) -> u64 {
self.raw.pri_offset
}
pub fn behavior(&self) -> u32 {
self.raw.pri_behavior
}
pub fn user_wired_count(&self) -> u32 {
self.raw.pri_user_wired_count
}
pub fn user_tag(&self) -> u32 {
self.raw.pri_user_tag
}
pub fn pages_resident(&self) -> u32 {
self.raw.pri_pages_resident
}
pub fn pages_shared_now_private(&self) -> u32 {
self.raw.pri_pages_shared_now_private
}
pub fn pages_swapped_out(&self) -> u32 {
self.raw.pri_pages_swapped_out
}
pub fn pages_dirtied(&self) -> u32 {
self.raw.pri_pages_dirtied
}
pub fn ref_count(&self) -> u32 {
self.raw.pri_ref_count
}
pub fn shadow_depth(&self) -> u32 {
self.raw.pri_shadow_depth
}
pub fn share_mode(&self) -> u32 {
self.raw.pri_share_mode
}
pub fn private_pages_resident(&self) -> u32 {
self.raw.pri_private_pages_resident
}
pub fn shared_pages_resident(&self) -> u32 {
self.raw.pri_shared_pages_resident
}
pub fn obj_id(&self) -> u32 {
self.raw.pri_obj_id
}
pub fn depth(&self) -> u32 {
self.raw.pri_depth
}
pub fn address(&self) -> u64 {
self.raw.pri_address
}
pub fn size(&self) -> u64 {
self.raw.pri_size
}
}
impl From<RegionInfo> for Region {
fn from(raw: RegionInfo) -> Self {
Self { raw }
}
}
impl Debug for Region {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Region")
.field("protection", &self.protection())
.field("max_protection", &self.max_protection())
.field("inheritance", &self.inheritance())
.field("flags", &self.flags())
.field("offset", &self.offset())
.field("behavior", &self.behavior())
.field("user_wired_count", &self.user_wired_count())
.field("user_tag", &self.user_tag())
.field("pages_resident", &self.pages_resident())
.field("pages_shared_now_private", &self.pages_shared_now_private())
.field("pages_swapped_out", &self.pages_swapped_out())
.field("pages_dirtied", &self.pages_dirtied())
.field("ref_count", &self.ref_count())
.field("shadow_depth", &self.shadow_depth())
.field("share_mode", &self.share_mode())
.field("private_pages_resident", &self.private_pages_resident())
.field("shared_pages_resident", &self.shared_pages_resident())
.field("obj_id", &self.obj_id())
.field("depth", &self.depth())
.field("address", &self.address())
.field("size", &self.size())
.finish()
}
}
#[repr(transparent)]
#[derive(RefCast, Clone, Copy)]
pub struct RegionWithPath {
raw: RegionWithPathInfo,
}
impl RegionWithPath {
pub fn from_raw(raw: RegionWithPathInfo) -> Self {
Self { raw }
}
pub fn as_raw(&self) -> &RegionWithPathInfo {
&self.raw
}
#[inline]
pub fn region(&self) -> &Region {
Region::ref_cast(&self.raw.prp_prinfo)
}
#[inline]
pub fn vnode(&self) -> &VnodeWithPath {
VnodeWithPath::ref_cast(&self.raw.prp_vip)
}
}
impl Debug for RegionWithPath {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("RegionWithPath")
.field("region", &self.region())
.field("vnode", &self.vnode())
.finish()
}
}