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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use core::sync::atomic::{AtomicU64, Ordering};
crate::cfg_select! {
target_pointer_width = "64" => {
#[inline]
pub fn wait(atom: &AtomicU64) {
loop {
match atom.load(Ordering::Acquire) {
0 => break,
v => unsafe {
let _ = syscall::syscall5(
syscall::SYS_FUTEX,
atom as *const AtomicU64 as usize,
syscall::FUTEX_WAIT64,
v as usize,
0,
0,
);
},
}
}
}
#[inline]
pub fn wake(ptr: *const u64, old: u64) {
if old == 1 {
unsafe {
let _ = syscall::syscall5(
syscall::SYS_FUTEX,
ptr as usize,
syscall::FUTEX_WAKE,
1,
0,
0,
);
}
}
}
}
target_pointer_width = "32" => {
#[inline]
fn wait32(ptr: *const u32, expected: u32) {
unsafe {
let _ = syscall::futex(
ptr as *mut i32,
syscall::FUTEX_WAIT,
expected as i32,
0,
core::ptr::null_mut(),
);
}
}
#[inline]
fn wake32(ptr: *const u32) {
unsafe {
let _ = syscall::futex(
ptr as *mut i32,
syscall::FUTEX_WAKE,
1,
0,
core::ptr::null_mut(),
);
}
}
#[inline]
pub fn wait(atom: &AtomicU64) { super::wait_hi_lo(atom, wait32) }
#[inline]
pub fn wake(ptr: *const u64, old: u64) { super::wake_hi_lo(ptr, old, wake32) }
}
}