blob: cd6e521d2cbc1ce89b186099cfbae57e6e90f3b5 [file] [log] [blame]
use super::super::c;
use bitflags::bitflags;
bitflags! {
/// `PROT_*` flags for use with [`mmap`].
///
/// For `PROT_NONE`, use `ProtFlags::empty()`.
///
/// [`mmap`]: crate::io::mmap
pub struct ProtFlags: c::c_int {
/// `PROT_READ`
const READ = c::PROT_READ;
/// `PROT_WRITE`
const WRITE = c::PROT_WRITE;
/// `PROT_EXEC`
const EXEC = c::PROT_EXEC;
}
}
bitflags! {
/// `PROT_*` flags for use with [`mprotect`].
///
/// For `PROT_NONE`, use `MprotectFlags::empty()`.
///
/// [`mprotect`]: crate::io::mprotect
pub struct MprotectFlags: c::c_int {
/// `PROT_READ`
const READ = c::PROT_READ;
/// `PROT_WRITE`
const WRITE = c::PROT_WRITE;
/// `PROT_EXEC`
const EXEC = c::PROT_EXEC;
/// `PROT_GROWSUP`
#[cfg(any(target_os = "android", target_os = "linux"))]
const GROWSUP = c::PROT_GROWSUP;
/// `PROT_GROWSDOWN`
#[cfg(any(target_os = "android", target_os = "linux"))]
const GROWSDOWN = c::PROT_GROWSDOWN;
}
}
bitflags! {
/// `MAP_*` flags for use with [`mmap`].
///
/// For `MAP_ANONYMOUS` (aka `MAP_ANON`), see [`mmap_anonymous`].
///
/// [`mmap`]: crate::io::mmap
/// [`mmap_anonymous`]: crates::io::mmap_anonymous
pub struct MapFlags: c::c_int {
/// `MAP_SHARED`
const SHARED = c::MAP_SHARED;
/// `MAP_SHARED_VALIDATE`
#[cfg(not(any(
bsd,
solarish,
target_os = "android",
target_os = "emscripten",
target_os = "fuchsia",
target_os = "haiku",
target_os = "redox",
)))]
const SHARED_VALIDATE = c::MAP_SHARED_VALIDATE;
/// `MAP_PRIVATE`
const PRIVATE = c::MAP_PRIVATE;
/// `MAP_DENYWRITE`
#[cfg(not(any(
bsd,
solarish,
target_os = "haiku",
target_os = "redox",
)))]
const DENYWRITE = c::MAP_DENYWRITE;
/// `MAP_FIXED`
const FIXED = c::MAP_FIXED;
/// `MAP_FIXED_NOREPLACE`
#[cfg(not(any(
bsd,
solarish,
target_os = "android",
target_os = "emscripten",
target_os = "fuchsia",
target_os = "haiku",
target_os = "redox",
)))]
const FIXED_NOREPLACE = c::MAP_FIXED_NOREPLACE;
/// `MAP_GROWSDOWN`
#[cfg(not(any(
bsd,
solarish,
target_os = "haiku",
target_os = "redox",
)))]
const GROWSDOWN = c::MAP_GROWSDOWN;
/// `MAP_HUGETLB`
#[cfg(not(any(
bsd,
solarish,
target_os = "haiku",
target_os = "redox",
)))]
const HUGETLB = c::MAP_HUGETLB;
/// `MAP_HUGE_2MB`
#[cfg(not(any(
bsd,
solarish,
target_os = "android",
target_os = "emscripten",
target_os = "fuchsia",
target_os = "haiku",
target_os = "redox",
)))]
const HUGE_2MB = c::MAP_HUGE_2MB;
/// `MAP_HUGE_1GB`
#[cfg(not(any(
bsd,
solarish,
target_os = "android",
target_os = "emscripten",
target_os = "fuchsia",
target_os = "haiku",
target_os = "redox",
)))]
const HUGE_1GB = c::MAP_HUGE_1GB;
/// `MAP_LOCKED`
#[cfg(not(any(
bsd,
solarish,
target_os = "haiku",
target_os = "redox",
)))]
const LOCKED = c::MAP_LOCKED;
/// `MAP_NOCORE`
#[cfg(freebsdlike)]
const NOCORE = c::MAP_NOCORE;
/// `MAP_NORESERVE`
#[cfg(not(any(freebsdlike, target_os = "redox")))]
const NORESERVE = c::MAP_NORESERVE;
/// `MAP_NOSYNC`
#[cfg(freebsdlike)]
const NOSYNC = c::MAP_NOSYNC;
/// `MAP_POPULATE`
#[cfg(not(any(
bsd,
solarish,
target_os = "haiku",
target_os = "redox",
)))]
const POPULATE = c::MAP_POPULATE;
/// `MAP_STACK`
#[cfg(not(any(
apple,
solarish,
target_os = "dragonfly",
target_os = "haiku",
target_os = "netbsd",
target_os = "redox",
)))]
const STACK = c::MAP_STACK;
/// `MAP_PREFAULT_READ`
#[cfg(target_os = "freebsd")]
const PREFAULT_READ = c::MAP_PREFAULT_READ;
/// `MAP_SYNC`
#[cfg(not(any(
bsd,
solarish,
target_os = "android",
target_os = "emscripten",
target_os = "fuchsia",
target_os = "haiku",
target_os = "redox",
all(
any(target_os = "android", target_os = "linux"),
any(target_arch = "mips", target_arch = "mips64"),
)
)))]
const SYNC = c::MAP_SYNC;
/// `MAP_UNINITIALIZED`
#[cfg(any())]
const UNINITIALIZED = c::MAP_UNINITIALIZED;
}
}
#[cfg(any(target_os = "emscripten", target_os = "linux"))]
bitflags! {
/// `MREMAP_*` flags for use with [`mremap`].
///
/// For `MREMAP_FIXED`, see [`mremap_fixed`].
///
/// [`mremap`]: crate::io::mremap
/// [`mremap_fixed`]: crate::io::mremap_fixed
pub struct MremapFlags: i32 {
/// `MREMAP_MAYMOVE`
const MAYMOVE = c::MREMAP_MAYMOVE;
}
}
bitflags! {
/// `MS_*` flags for use with [`msync`].
///
/// [`msync`]: crate::io::msync
pub struct MsyncFlags: i32 {
/// `MS_SYNC`—Requests an update and waits for it to complete.
const SYNC = c::MS_SYNC;
/// `MS_ASYNC`—Specifies that an update be scheduled, but the call
/// returns immediately.
const ASYNC = c::MS_ASYNC;
/// `MS_INVALIDATE`—Asks to invalidate other mappings of the same
/// file (so that they can be updated with the fresh values just
/// written).
const INVALIDATE = c::MS_INVALIDATE;
}
}
#[cfg(any(target_os = "android", target_os = "linux"))]
bitflags! {
/// `MLOCK_*` flags for use with [`mlock_with`].
///
/// [`mlock_with`]: crate::io::mlock_with
pub struct MlockFlags: i32 {
/// `MLOCK_ONFAULT`
const ONFAULT = c::MLOCK_ONFAULT as _;
}
}
/// `POSIX_MADV_*` constants for use with [`madvise`].
///
/// [`madvise`]: crate::mm::madvise
#[cfg(not(target_os = "redox"))]
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
#[repr(i32)]
#[non_exhaustive]
pub enum Advice {
/// `POSIX_MADV_NORMAL`
#[cfg(not(any(target_os = "android", target_os = "haiku")))]
Normal = c::POSIX_MADV_NORMAL,
/// `POSIX_MADV_NORMAL`
#[cfg(any(target_os = "android", target_os = "haiku"))]
Normal = c::MADV_NORMAL,
/// `POSIX_MADV_SEQUENTIAL`
#[cfg(not(any(target_os = "android", target_os = "haiku")))]
Sequential = c::POSIX_MADV_SEQUENTIAL,
/// `POSIX_MADV_SEQUENTIAL`
#[cfg(any(target_os = "android", target_os = "haiku"))]
Sequential = c::MADV_SEQUENTIAL,
/// `POSIX_MADV_RANDOM`
#[cfg(not(any(target_os = "android", target_os = "haiku")))]
Random = c::POSIX_MADV_RANDOM,
/// `POSIX_MADV_RANDOM`
#[cfg(any(target_os = "android", target_os = "haiku"))]
Random = c::MADV_RANDOM,
/// `POSIX_MADV_WILLNEED`
#[cfg(not(any(target_os = "android", target_os = "haiku")))]
WillNeed = c::POSIX_MADV_WILLNEED,
/// `POSIX_MADV_WILLNEED`
#[cfg(any(target_os = "android", target_os = "haiku"))]
WillNeed = c::MADV_WILLNEED,
/// `POSIX_MADV_DONTNEED`
#[cfg(not(any(target_os = "android", target_os = "emscripten", target_os = "haiku")))]
DontNeed = c::POSIX_MADV_DONTNEED,
/// `POSIX_MADV_DONTNEED`
#[cfg(any(target_os = "android", target_os = "haiku"))]
DontNeed = i32::MAX - 1,
/// `MADV_DONTNEED`
// `MADV_DONTNEED` has the same value as `POSIX_MADV_DONTNEED`. We don't
// have a separate `posix_madvise` from `madvise`, so we expose a special
// value which we special-case.
#[cfg(target_os = "linux")]
LinuxDontNeed = i32::MAX,
/// `MADV_DONTNEED`
#[cfg(target_os = "android")]
LinuxDontNeed = c::MADV_DONTNEED,
/// `MADV_FREE`
#[cfg(any(target_os = "android", target_os = "linux"))]
LinuxFree = c::MADV_FREE,
/// `MADV_REMOVE`
#[cfg(any(target_os = "android", target_os = "linux"))]
LinuxRemove = c::MADV_REMOVE,
/// `MADV_DONTFORK`
#[cfg(any(target_os = "android", target_os = "linux"))]
LinuxDontFork = c::MADV_DONTFORK,
/// `MADV_DOFORK`
#[cfg(any(target_os = "android", target_os = "linux"))]
LinuxDoFork = c::MADV_DOFORK,
/// `MADV_HWPOISON`
#[cfg(any(target_os = "android", target_os = "linux"))]
LinuxHwPoison = c::MADV_HWPOISON,
/// `MADV_SOFT_OFFLINE`
#[cfg(all(
any(target_os = "android", target_os = "linux"),
not(any(target_arch = "mips", target_arch = "mips64")),
))]
LinuxSoftOffline = c::MADV_SOFT_OFFLINE,
/// `MADV_MERGEABLE`
#[cfg(any(target_os = "android", target_os = "linux"))]
LinuxMergeable = c::MADV_MERGEABLE,
/// `MADV_UNMERGEABLE`
#[cfg(any(target_os = "android", target_os = "linux"))]
LinuxUnmergeable = c::MADV_UNMERGEABLE,
/// `MADV_HUGEPAGE` (since Linux 2.6.38)
#[cfg(any(target_os = "android", target_os = "linux"))]
LinuxHugepage = c::MADV_HUGEPAGE,
/// `MADV_NOHUGEPAGE` (since Linux 2.6.38)
#[cfg(any(target_os = "android", target_os = "linux"))]
LinuxNoHugepage = c::MADV_NOHUGEPAGE,
/// `MADV_DONTDUMP` (since Linux 3.4)
#[cfg(any(target_os = "android", target_os = "linux"))]
LinuxDontDump = c::MADV_DONTDUMP,
/// `MADV_DODUMP` (since Linux 3.4)
#[cfg(any(target_os = "android", target_os = "linux"))]
LinuxDoDump = c::MADV_DODUMP,
/// `MADV_WIPEONFORK` (since Linux 4.14)
#[cfg(any(target_os = "android", target_os = "linux"))]
#[cfg(feature = "mm")]
LinuxWipeOnFork = linux_raw_sys::general::MADV_WIPEONFORK as i32,
/// `MADV_KEEPONFORK` (since Linux 4.14)
#[cfg(any(target_os = "android", target_os = "linux"))]
#[cfg(feature = "mm")]
LinuxKeepOnFork = linux_raw_sys::general::MADV_KEEPONFORK as i32,
/// `MADV_COLD` (since Linux 5.4)
#[cfg(any(target_os = "android", target_os = "linux"))]
#[cfg(feature = "mm")]
LinuxCold = linux_raw_sys::general::MADV_COLD as i32,
/// `MADV_PAGEOUT` (since Linux 5.4)
#[cfg(any(target_os = "android", target_os = "linux"))]
#[cfg(feature = "mm")]
LinuxPageOut = linux_raw_sys::general::MADV_PAGEOUT as i32,
/// `MADV_POPULATE_READ` (since Linux 5.14)
#[cfg(any(target_os = "android", target_os = "linux"))]
#[cfg(feature = "mm")]
LinuxPopulateRead = linux_raw_sys::general::MADV_POPULATE_READ as i32,
/// `MADV_POPULATE_WRITE` (since Linux 5.14)
#[cfg(any(target_os = "android", target_os = "linux"))]
#[cfg(feature = "mm")]
LinuxPopulateWrite = linux_raw_sys::general::MADV_POPULATE_WRITE as i32,
}
#[cfg(target_os = "emscripten")]
impl Advice {
/// `POSIX_MADV_DONTNEED`
#[allow(non_upper_case_globals)]
pub const DontNeed: Self = Self::Normal;
}
#[cfg(any(target_os = "android", target_os = "linux"))]
bitflags! {
/// `O_*` flags for use with [`userfaultfd`].
///
/// [`userfaultfd`]: crate::io::userfaultfd
pub struct UserfaultfdFlags: c::c_int {
/// `O_CLOEXEC`
const CLOEXEC = c::O_CLOEXEC;
/// `O_NONBLOCK`
const NONBLOCK = c::O_NONBLOCK;
}
}