rustix/backend/linux_raw/process/
cpu_set.rs

1//! Rust implementation of the `CPU_*` macro API.
2
3#![allow(non_snake_case)]
4
5use super::types::RawCpuSet;
6use core::mem::size_of_val;
7
8#[inline]
9pub(crate) fn CPU_SET(cpu: usize, cpuset: &mut RawCpuSet) {
10    let size_in_bits = 8 * size_of_val(&cpuset.bits[0]); // 32, 64 etc
11    let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits);
12    cpuset.bits[idx] |= 1 << offset
13}
14
15#[inline]
16pub(crate) fn CPU_ZERO(cpuset: &mut RawCpuSet) {
17    cpuset.bits.fill(0)
18}
19
20#[inline]
21pub(crate) fn CPU_CLR(cpu: usize, cpuset: &mut RawCpuSet) {
22    let size_in_bits = 8 * size_of_val(&cpuset.bits[0]); // 32, 64 etc
23    let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits);
24    cpuset.bits[idx] &= !(1 << offset)
25}
26
27#[inline]
28pub(crate) fn CPU_ISSET(cpu: usize, cpuset: &RawCpuSet) -> bool {
29    let size_in_bits = 8 * size_of_val(&cpuset.bits[0]);
30    let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits);
31    (cpuset.bits[idx] & (1 << offset)) != 0
32}
33
34#[inline]
35pub(crate) fn CPU_COUNT_S(size_in_bytes: usize, cpuset: &RawCpuSet) -> u32 {
36    let size_of_mask = size_of_val(&cpuset.bits[0]);
37    let idx = size_in_bytes / size_of_mask;
38    cpuset.bits[..idx]
39        .iter()
40        .fold(0, |acc, i| acc + i.count_ones())
41}
42
43#[inline]
44pub(crate) fn CPU_COUNT(cpuset: &RawCpuSet) -> u32 {
45    CPU_COUNT_S(core::mem::size_of::<RawCpuSet>(), cpuset)
46}
47
48#[inline]
49pub(crate) fn CPU_EQUAL(this: &RawCpuSet, that: &RawCpuSet) -> bool {
50    this.bits == that.bits
51}