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}