1mod sys;
9
10use sys::FdSet;
11pub use sys::AsRawFd;
12
13use std::io;
14use core::time;
15
16pub use sys::FD_LIMIT;
17
18pub struct SelectResult {
23 count: usize,
24 read: FdSet,
25 write: FdSet,
26 except: FdSet,
27}
28
29impl SelectResult {
30 #[inline]
31 pub const fn len(&self) -> usize {
33 self.count
34 }
35
36 #[inline]
37 pub fn is_read<T: AsRawFd>(&self, source: &T) -> bool {
39 self.read.is_present(source)
40 }
41
42 #[inline]
43 pub fn is_write<T: AsRawFd>(&self, source: &T) -> bool {
45 self.write.is_present(source)
46 }
47
48 #[inline]
49 pub fn is_except<T: AsRawFd>(&self, source: &T) -> bool {
51 self.except.is_present(source)
52 }
53
54}
55
56#[derive(Clone)]
57pub struct Selector {
72 read: FdSet,
73 write: FdSet,
74 except: FdSet,
75}
76
77impl Selector {
78 #[inline]
79 pub fn new() -> Self {
81 Self {
82 read: FdSet::new(),
83 write: FdSet::new(),
84 except: FdSet::new(),
85 }
86 }
87
88 #[inline]
89 pub fn add_read<T: AsRawFd>(&mut self, source: &T) {
93 assert!(self.read.len() < sys::FD_LIMIT);
94 self.read.add(source);
95 }
96
97 #[inline]
98 pub fn add_write<T: AsRawFd>(&mut self, source: &T) {
102 assert!(self.write.len() < sys::FD_LIMIT);
103 self.write.add(source);
104 }
105
106 #[inline]
107 pub fn add_except<T: AsRawFd>(&mut self, source: &T) {
111 assert!(self.except.len() < sys::FD_LIMIT);
112 self.except.add(source);
113 }
114
115
116 #[inline]
117 pub fn clear_read(&mut self) {
119 self.read.clear();
120 }
121
122 #[inline]
123 pub fn clear_write(&mut self) {
125 self.write.clear();
126 }
127
128 #[inline]
129 pub fn clear_except(&mut self) {
131 self.except.clear();
132 }
133
134
135 #[inline]
136 pub fn select(&self) -> io::Result<SelectResult> {
138 let mut result = SelectResult {
139 count: 0,
140 read: self.read.clone(),
141 write: self.write.clone(),
142 except: self.except.clone(),
143 };
144
145 result.count = sys::select(&mut result.read, &mut result.write, &mut result.except)?;
146 Ok(result)
147 }
148
149 #[inline]
150 pub fn try_select(&self) -> io::Result<SelectResult> {
152 let mut result = SelectResult {
153 count: 0,
154 read: self.read.clone(),
155 write: self.write.clone(),
156 except: self.except.clone(),
157 };
158
159 result.count = sys::select_timeout(&mut result.read, &mut result.write, &mut result.except, time::Duration::from_secs(0))?;
160 Ok(result)
161 }
162
163 #[inline]
164 pub fn select_timeout(&self, time: time::Duration) -> io::Result<SelectResult> {
166 let mut result = SelectResult {
167 count: 0,
168 read: self.read.clone(),
169 write: self.write.clone(),
170 except: self.except.clone(),
171 };
172
173 result.count = sys::select_timeout(&mut result.read, &mut result.write, &mut result.except, time)?;
174 Ok(result)
175 }
176}