1use crate::ErrorCode;
2use crate::Result;
3use crate::RtFd;
4use crate::RtVdsoVtable;
5use crate::into_result;
6use core::sync::atomic::Ordering;
7
8#[cfg(not(feature = "rustc-dep-of-std"))]
9extern crate alloc;
10
11pub const POLL_READABLE: u64 = 1;
12pub const POLL_WRITABLE: u64 = 2;
13pub const POLL_READ_CLOSED: u64 = 4;
14pub const POLL_WRITE_CLOSED: u64 = 8;
15pub const POLL_ERROR: u64 = 16;
16
17pub type Token = u64;
18pub type Interests = u64;
19pub type EventBits = u64;
20
21#[derive(Clone, Copy, Debug, Default)]
22pub struct Event {
23 pub token: Token,
24 pub events: EventBits,
25}
26
27pub fn new() -> Result<RtFd> {
28 let vdso_poll_new: extern "C" fn() -> RtFd = unsafe {
29 core::mem::transmute(
30 RtVdsoVtable::get().poll_new.load(Ordering::Relaxed) as usize as *const (),
31 )
32 };
33
34 to_result!(vdso_poll_new())
35}
36
37pub fn add(poll_fd: RtFd, source_fd: RtFd, token: Token, interests: Interests) -> Result<()> {
38 let vdso_poll_add: extern "C" fn(RtFd, RtFd, u64, u64) -> ErrorCode = unsafe {
39 core::mem::transmute(
40 RtVdsoVtable::get().poll_add.load(Ordering::Relaxed) as usize as *const (),
41 )
42 };
43
44 into_result(vdso_poll_add(poll_fd, source_fd, token, interests))
45}
46
47pub fn set(poll_fd: RtFd, source_fd: RtFd, token: Token, interests: Interests) -> Result<()> {
48 let vdso_poll_set: extern "C" fn(RtFd, RtFd, u64, u64) -> ErrorCode = unsafe {
49 core::mem::transmute(
50 RtVdsoVtable::get().poll_set.load(Ordering::Relaxed) as usize as *const (),
51 )
52 };
53
54 into_result(vdso_poll_set(poll_fd, source_fd, token, interests))
55}
56
57pub fn del(poll_fd: RtFd, source_fd: RtFd) -> Result<()> {
58 let vdso_poll_del: extern "C" fn(RtFd, RtFd) -> ErrorCode = unsafe {
59 core::mem::transmute(
60 RtVdsoVtable::get().poll_del.load(Ordering::Relaxed) as usize as *const (),
61 )
62 };
63
64 into_result(vdso_poll_del(poll_fd, source_fd))
65}
66
67pub fn wake(poll_fd: RtFd) -> Result<()> {
68 let vdso_poll_wake: extern "C" fn(RtFd) -> ErrorCode = unsafe {
69 core::mem::transmute(
70 RtVdsoVtable::get().poll_wake.load(Ordering::Relaxed) as usize as *const (),
71 )
72 };
73
74 into_result(vdso_poll_wake(poll_fd))
75}
76
77pub fn wait(
78 poll_fd: RtFd,
79 events: *mut Event,
80 events_num: usize,
81 timeout: Option<crate::time::Instant>,
82) -> Result<usize> {
83 let vdso_poll_wait: extern "C" fn(RtFd, u64, *mut Event, usize) -> i32 = unsafe {
84 core::mem::transmute(
85 RtVdsoVtable::get().poll_wait.load(Ordering::Relaxed) as usize as *const (),
86 )
87 };
88
89 let timeout = if let Some(timo) = timeout {
90 timo.as_u64()
91 } else {
92 u64::MAX
93 };
94
95 let res = vdso_poll_wait(poll_fd, timeout, events, events_num);
96 if res < 0 {
97 return Err(((-res) as ErrorCode).into());
98 }
99
100 Ok(res as usize)
101}