libc_core/
futex.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//! This module provides the `libc` types for FUTEX (fast user-space mutex).
use num_enum::TryFromPrimitive;

/// Futex 操作类型枚举
///
/// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/src/internal/futex.h#L4>
#[derive(Debug, TryFromPrimitive)]
#[repr(usize)]
pub enum FutexFlags {
    /// 等待操作,线程阻塞直到被唤醒
    Wait = 0,
    /// 唤醒等待的线程
    Wake = 1,
    /// 使用文件描述符的 Futex 操作(较少用)
    Fd = 2,
    /// 将等待队列中的线程重新排队到另一个 Futex
    Requeue = 3,
    /// 带比较操作的重新排队,只有在值匹配时才执行排队
    CmpRequeue = 4,
    /// 执行复杂的唤醒和重新排队组合操作
    WakeOp = 5,
    /// 获取 Priority Inheritance 锁
    LockPi = 6,
    /// 释放 Priority Inheritance 锁
    UnlockPi = 7,
    /// 尝试获取 Priority Inheritance 锁(非阻塞)
    TrylockPi = 8,
    /// 等待指定的位集合(bitset),类似于 Wait,但支持位掩码
    WaitBitset = 9,
}

/// 标志:表示 futex 是私有的,只在同一进程内使用(性能更好)
/// 相当于 FUTEX_PRIVATE_FLAG,避免跨进程同步开销
pub const FUTEX_PRIVATE: usize = 128;

/// 标志:使用系统实时时钟(CLOCK_REALTIME)作为超时基准
/// 默认 futex 超时使用的是 CLOCK_MONOTONIC,设置此标志改为使用实时时钟
pub const FUTEX_CLOCK_REALTIME: usize = 256;