rustix/backend/linux_raw/thread/
types.rs

1use linux_raw_sys::general::membarrier_cmd;
2
3/// A command for use with [`membarrier`] and [`membarrier_cpu`].
4///
5/// For `MEMBARRIER_CMD_QUERY`, see [`membarrier_query`].
6///
7/// [`membarrier`]: crate::thread::membarrier
8/// [`membarrier_cpu`]: crate::thread::membarrier_cpu
9/// [`membarrier_query`]: crate::thread::membarrier_query
10#[derive(Copy, Clone, Eq, PartialEq, Debug)]
11#[repr(u32)]
12#[non_exhaustive]
13pub enum MembarrierCommand {
14    /// `MEMBARRIER_CMD_GLOBAL`
15    #[doc(alias = "Shared")]
16    #[doc(alias = "MEMBARRIER_CMD_SHARED")]
17    Global = membarrier_cmd::MEMBARRIER_CMD_GLOBAL as _,
18    /// `MEMBARRIER_CMD_GLOBAL_EXPEDITED`
19    GlobalExpedited = membarrier_cmd::MEMBARRIER_CMD_GLOBAL_EXPEDITED as _,
20    /// `MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED`
21    RegisterGlobalExpedited = membarrier_cmd::MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED as _,
22    /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED`
23    PrivateExpedited = membarrier_cmd::MEMBARRIER_CMD_PRIVATE_EXPEDITED as _,
24    /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED`
25    RegisterPrivateExpedited = membarrier_cmd::MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED as _,
26    /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE`
27    PrivateExpeditedSyncCore = membarrier_cmd::MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE as _,
28    /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE`
29    RegisterPrivateExpeditedSyncCore =
30        membarrier_cmd::MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE as _,
31    /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ` (since Linux 5.10)
32    PrivateExpeditedRseq = membarrier_cmd::MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ as _,
33    /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ` (since Linux 5.10)
34    RegisterPrivateExpeditedRseq =
35        membarrier_cmd::MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ as _,
36}
37
38/// A CPU identifier as a raw integer.
39pub type RawCpuid = u32;
40
41#[repr(transparent)]
42#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
43pub(crate) struct RawCpuSet {
44    #[cfg(all(target_pointer_width = "32", not(target_arch = "x86_64")))]
45    pub(crate) bits: [u32; 32],
46    #[cfg(not(all(target_pointer_width = "32", not(target_arch = "x86_64"))))]
47    pub(crate) bits: [u64; 16],
48}
49
50#[inline]
51pub(crate) fn raw_cpu_set_new() -> RawCpuSet {
52    #[cfg(all(target_pointer_width = "32", not(target_arch = "x86_64")))]
53    {
54        RawCpuSet { bits: [0; 32] }
55    }
56    #[cfg(not(all(target_pointer_width = "32", not(target_arch = "x86_64"))))]
57    {
58        RawCpuSet { bits: [0; 16] }
59    }
60}
61
62pub(crate) const CPU_SETSIZE: usize = 8 * core::mem::size_of::<RawCpuSet>();