moto_rt/
poll.rs

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}