use crate::{entity::entity_ref, os::PageSize};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ClassPolicy {
page_size: PageSize,
sharing: ArenaSharing,
}
impl ClassPolicy {
#[inline]
pub const fn new(page_size: PageSize, sharing: ArenaSharing) -> Self {
Self { page_size, sharing }
}
#[inline]
pub const fn page_size(self) -> PageSize {
self.page_size
}
#[inline]
pub const fn sharing(self) -> ArenaSharing {
self.sharing
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct PackingPolicy {
code: ClassPolicy,
read_only_data: ClassPolicy,
writable_data: ClassPolicy,
thread_local_data: ClassPolicy,
}
impl Default for PackingPolicy {
#[inline]
fn default() -> Self {
Self::shared_huge_pages()
}
}
impl PackingPolicy {
#[inline]
pub const fn new(
code: ClassPolicy,
read_only_data: ClassPolicy,
writable_data: ClassPolicy,
thread_local_data: ClassPolicy,
) -> Self {
Self {
code,
read_only_data,
writable_data,
thread_local_data,
}
}
#[inline]
pub const fn private_base_pages() -> Self {
let base = ClassPolicy::new(PageSize::Base, ArenaSharing::Private);
Self::new(base, base, base, base)
}
#[inline]
pub const fn shared_huge_pages() -> Self {
Self::new(
ClassPolicy::new(PageSize::Huge2MiB, ArenaSharing::Shared),
ClassPolicy::new(PageSize::Huge2MiB, ArenaSharing::Shared),
ClassPolicy::new(PageSize::Base, ArenaSharing::Private),
ClassPolicy::new(PageSize::Base, ArenaSharing::Private),
)
}
#[inline]
pub const fn class_policy(self, class: MemoryClass) -> ClassPolicy {
match class {
MemoryClass::Code => self.code,
MemoryClass::ReadOnlyData => self.read_only_data,
MemoryClass::WritableData => self.writable_data,
MemoryClass::ThreadLocalData => self.thread_local_data,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ArenaUsage {
section_count: usize,
used_len: usize,
mapped_len: usize,
}
impl ArenaUsage {
#[inline]
pub(crate) const fn new(section_count: usize, used_len: usize, mapped_len: usize) -> Self {
Self {
section_count,
used_len,
mapped_len,
}
}
#[inline]
pub const fn section_count(self) -> usize {
self.section_count
}
#[inline]
pub const fn used_len(self) -> usize {
self.used_len
}
#[inline]
pub const fn mapped_len(self) -> usize {
self.mapped_len
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ArenaDescriptor {
page_size: PageSize,
memory_class: MemoryClass,
sharing: ArenaSharing,
}
impl ArenaDescriptor {
#[inline]
pub const fn new(
page_size: PageSize,
memory_class: MemoryClass,
sharing: ArenaSharing,
) -> Self {
Self {
page_size,
memory_class,
sharing,
}
}
#[inline]
pub const fn page_size(&self) -> PageSize {
self.page_size
}
#[inline]
pub const fn memory_class(&self) -> MemoryClass {
self.memory_class
}
#[inline]
pub const fn sharing(&self) -> ArenaSharing {
self.sharing
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ArenaId(usize);
entity_ref!(ArenaId);
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum ArenaSharing {
Private,
Shared,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum MemoryClass {
Code,
ReadOnlyData,
WritableData,
ThreadLocalData,
}