use std::ffi::CStr;
use std::os::fd::AsRawFd;
use std::os::fd::IntoRawFd;
use std::os::unix::io::OwnedFd;
use rustix::fs::ftruncate;
use rustix::fs::memfd_create;
use rustix::fs::MemfdFlags;
use crate::descriptor::AsRawDescriptor;
use crate::descriptor::IntoRawDescriptor;
use crate::MesaResult;
use crate::RawDescriptor;
pub struct SharedMemory {
fd: OwnedFd,
size: u64,
}
impl SharedMemory {
pub fn new(debug_name: &CStr, size: u64) -> MesaResult<SharedMemory> {
let fd = memfd_create(debug_name, MemfdFlags::CLOEXEC | MemfdFlags::ALLOW_SEALING)?;
ftruncate(&fd, size)?;
Ok(SharedMemory { fd, size })
}
pub fn size(&self) -> u64 {
self.size
}
}
impl AsRawDescriptor for SharedMemory {
fn as_raw_descriptor(&self) -> RawDescriptor {
self.fd.as_raw_fd()
}
}
impl IntoRawDescriptor for SharedMemory {
fn into_raw_descriptor(self) -> RawDescriptor {
self.fd.into_raw_fd()
}
}
pub fn page_size() -> MesaResult<u64> {
Ok(rustix::param::page_size() as _)
}