mod sys;
use sys::FdSet;
pub use sys::AsRawFd;
use std::io;
use core::time;
pub use sys::FD_LIMIT;
pub struct SelectResult {
count: usize,
read: FdSet,
write: FdSet,
except: FdSet,
}
impl SelectResult {
#[inline]
pub const fn len(&self) -> usize {
self.count
}
#[inline]
pub fn is_read<T: AsRawFd>(&self, source: &T) -> bool {
self.read.is_present(source)
}
#[inline]
pub fn is_write<T: AsRawFd>(&self, source: &T) -> bool {
self.write.is_present(source)
}
#[inline]
pub fn is_except<T: AsRawFd>(&self, source: &T) -> bool {
self.except.is_present(source)
}
}
#[derive(Clone)]
pub struct Selector {
read: FdSet,
write: FdSet,
except: FdSet,
}
impl Selector {
#[inline]
pub fn new() -> Self {
Self {
read: FdSet::new(),
write: FdSet::new(),
except: FdSet::new(),
}
}
#[inline]
pub fn add_read<T: AsRawFd>(&mut self, source: &T) {
assert!(self.read.len() < sys::FD_LIMIT);
self.read.add(source);
}
#[inline]
pub fn add_write<T: AsRawFd>(&mut self, source: &T) {
assert!(self.write.len() < sys::FD_LIMIT);
self.write.add(source);
}
#[inline]
pub fn add_except<T: AsRawFd>(&mut self, source: &T) {
assert!(self.except.len() < sys::FD_LIMIT);
self.except.add(source);
}
#[inline]
pub fn clear_read(&mut self) {
self.read.clear();
}
#[inline]
pub fn clear_write(&mut self) {
self.write.clear();
}
#[inline]
pub fn clear_except(&mut self) {
self.except.clear();
}
#[inline]
pub fn select(&self) -> io::Result<SelectResult> {
let mut result = SelectResult {
count: 0,
read: self.read.clone(),
write: self.write.clone(),
except: self.except.clone(),
};
result.count = sys::select(&mut result.read, &mut result.write, &mut result.except)?;
Ok(result)
}
#[inline]
pub fn try_select(&self) -> io::Result<SelectResult> {
let mut result = SelectResult {
count: 0,
read: self.read.clone(),
write: self.write.clone(),
except: self.except.clone(),
};
result.count = sys::select_timeout(&mut result.read, &mut result.write, &mut result.except, time::Duration::from_secs(0))?;
Ok(result)
}
#[inline]
pub fn select_timeout(&self, time: time::Duration) -> io::Result<SelectResult> {
let mut result = SelectResult {
count: 0,
read: self.read.clone(),
write: self.write.clone(),
except: self.except.clone(),
};
result.count = sys::select_timeout(&mut result.read, &mut result.write, &mut result.except, time)?;
Ok(result)
}
}