diff options
Diffstat (limited to 'vendor/rustix/src/shm.rs')
| -rw-r--r-- | vendor/rustix/src/shm.rs | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/vendor/rustix/src/shm.rs b/vendor/rustix/src/shm.rs new file mode 100644 index 00000000..f279250d --- /dev/null +++ b/vendor/rustix/src/shm.rs @@ -0,0 +1,96 @@ +//! POSIX shared memory +//! +//! # Examples +//! +//! ``` +//! use rustix::fs::{ftruncate, Mode}; +//! use rustix::mm::{mmap, MapFlags, ProtFlags}; +//! use rustix::{io, shm}; +//! use std::mem::size_of; +//! use std::ptr::null_mut; +//! +//! # fn example() -> io::Result<()> { +//! // A type describing the data to be shared. +//! #[repr(C)] +//! struct MyBufferType { +//! // … +//! } +//! +//! // Create the shared memory object. +//! let shm_path = "/rustix-shm-example"; +//! let fd = shm::open( +//! shm_path, +//! shm::OFlags::CREATE | shm::OFlags::EXCL | shm::OFlags::RDWR, +//! Mode::RUSR | Mode::WUSR, +//! )?; +//! +//! // Resize the shared memory object to the size of our data. +//! ftruncate(&fd, size_of::<MyBufferType>() as u64)?; +//! +//! // Map the shared memory object into our address space. +//! // +//! // SAFETY: We're creating a new mapping that's independent of any existing +//! // memory allocations. There are interesting things to say about *using* +//! // `ptr`, but that's for another safety comment. +//! let ptr = unsafe { +//! mmap( +//! null_mut(), +//! size_of::<MyBufferType>(), +//! ProtFlags::READ | ProtFlags::WRITE, +//! MapFlags::SHARED, +//! &fd, +//! 0, +//! )? +//! }; +//! +//! // Use `ptr`… +//! +//! // Remove the shared memory object name. +//! shm::unlink(shm_path)?; +//! # Ok(()) +//! # } +//! ``` + +#![allow(unused_qualifications)] + +use crate::fd::OwnedFd; +use crate::{backend, io, path}; + +use super::shm; +pub use crate::backend::fs::types::Mode; +pub use crate::backend::shm::types::ShmOFlags as OFlags; + +/// `shm_open(name, oflags, mode)`—Opens a shared memory object. +/// +/// For portability, `name` should begin with a slash, contain no other +/// slashes, and be no longer than an implementation-defined limit (255 on +/// Linux). +/// +/// Exactly one of [`shm::OFlags::RDONLY`] and [`shm::OFlags::RDWR`] should be +/// passed. The file descriptor will be opened with `FD_CLOEXEC` set. +/// +/// # References +/// - [POSIX] +/// - [Linux] +/// +/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/shm_open.html +/// [Linux]: https://man7.org/linux/man-pages/man3/shm_open.3.html +#[doc(alias = "shm_open")] +#[inline] +pub fn open<P: path::Arg>(name: P, flags: shm::OFlags, mode: Mode) -> io::Result<OwnedFd> { + name.into_with_c_str(|name| backend::shm::syscalls::shm_open(name, flags, mode)) +} + +/// `shm_unlink(name)`—Unlinks a shared memory object. +/// +/// # References +/// - [POSIX] +/// - [Linux] +/// +/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/shm_unlink.html +/// [Linux]: https://man7.org/linux/man-pages/man3/shm_unlink.3.html +#[doc(alias = "shm_unlink")] +#[inline] +pub fn unlink<P: path::Arg>(name: P) -> io::Result<()> { + name.into_with_c_str(backend::shm::syscalls::shm_unlink) +} |
