glycin_common/
shared_memory.rs

1use std::ops::{Deref, DerefMut};
2use std::os::fd::{AsRawFd, OwnedFd};
3
4use crate::{BinaryData, Error};
5
6#[derive(Debug)]
7pub struct SharedMemory {
8    memfd: OwnedFd,
9    pub mmap: memmap::MmapMut,
10}
11
12impl SharedMemory {
13    pub fn new(size: u64) -> Result<Self, Error> {
14        let memfd = nix::sys::memfd::memfd_create(
15            c"glycin-frame",
16            nix::sys::memfd::MFdFlags::MFD_CLOEXEC | nix::sys::memfd::MFdFlags::MFD_ALLOW_SEALING,
17        )
18        .expect("Failed to create memfd");
19
20        nix::unistd::ftruncate(&memfd, size.try_into().expect("Required memory too large"))
21            .expect("Failed to set memfd size");
22
23        let raw_fd = memfd.as_raw_fd();
24        let mmap = unsafe { memmap::MmapMut::map_mut(raw_fd) }?;
25
26        Ok(Self { mmap, memfd })
27    }
28
29    pub fn into_binary_data(self) -> BinaryData {
30        BinaryData::from(self.memfd)
31    }
32}
33
34impl SharedMemory {
35    fn from_data(value: impl AsRef<[u8]>) -> Result<Self, Error> {
36        let mut shared_memory = SharedMemory::new(u64::try_from(value.as_ref().len())?)?;
37
38        shared_memory.copy_from_slice(value.as_ref());
39
40        Ok(shared_memory)
41    }
42}
43
44impl BinaryData {
45    pub fn from_data(value: impl AsRef<[u8]>) -> Result<Self, Error> {
46        Ok(SharedMemory::from_data(value)?.into_binary_data())
47    }
48}
49
50impl Deref for SharedMemory {
51    type Target = [u8];
52
53    fn deref(&self) -> &[u8] {
54        self.mmap.deref()
55    }
56}
57
58impl DerefMut for SharedMemory {
59    fn deref_mut(&mut self) -> &mut [u8] {
60        self.mmap.deref_mut()
61    }
62}