twizzler_futures/
lib.rs

1use std::os::fd::AsRawFd;
2
3use twizzler_abi::syscall::{ThreadSyncFlags, ThreadSyncReference, ThreadSyncSleep};
4use twizzler_rt_abi::{
5    bindings::{WAIT_READ, WAIT_WRITE},
6    io::twz_rt_fd_waitpoint,
7};
8
9pub trait TwizzlerWaitable {
10    fn wait_item_read(&self) -> (twizzler_abi::syscall::ThreadSyncSleep, bool);
11    fn wait_item_write(&self) -> (twizzler_abi::syscall::ThreadSyncSleep, bool);
12}
13
14impl<T: AsRawFd> TwizzlerWaitable for T {
15    fn wait_item_read(&self) -> (twizzler_abi::syscall::ThreadSyncSleep, bool) {
16        let (pt, val, ready) = twz_rt_fd_waitpoint(self.as_raw_fd(), WAIT_READ).unwrap();
17        (
18            ThreadSyncSleep::new(
19                ThreadSyncReference::Virtual(pt),
20                val,
21                twizzler_abi::syscall::ThreadSyncOp::Equal,
22                ThreadSyncFlags::empty(),
23            ),
24            ready,
25        )
26    }
27
28    fn wait_item_write(&self) -> (twizzler_abi::syscall::ThreadSyncSleep, bool) {
29        let (pt, val, ready) = twz_rt_fd_waitpoint(self.as_raw_fd(), WAIT_WRITE).unwrap();
30        (
31            ThreadSyncSleep::new(
32                ThreadSyncReference::Virtual(pt),
33                val,
34                twizzler_abi::syscall::ThreadSyncOp::Equal,
35                ThreadSyncFlags::empty(),
36            ),
37            ready,
38        )
39    }
40}