use std::io;
use std::os::windows::prelude::*;
use std::sync::Mutex;
use crate::mio_uds_windows::poll;
use mio::windows::Binding;
use mio::{Evented, Poll, PollOpt, Ready, Registration, SetReadiness, Token};
use tracing::trace;
pub struct ReadyBinding {
binding: Binding,
readiness: Option<SetReadiness>,
}
impl ReadyBinding {
pub fn new() -> ReadyBinding {
ReadyBinding {
binding: Binding::new(),
readiness: None,
}
}
pub fn registered(&self) -> bool {
self.readiness.is_some()
}
pub fn get_buffer(&self, size: usize) -> Vec<u8> {
poll::skinny::get_buffer(&self.binding, size)
}
pub fn put_buffer(&self, buf: Vec<u8>) {
poll::skinny::put_buffer(&self.binding, buf)
}
pub fn set_readiness(&self, set: Ready) {
if let Some(ref i) = self.readiness {
trace!("set readiness to {:?}", set);
i.set_readiness(set).expect("event loop disappeared?");
}
}
pub fn readiness(&self) -> Ready {
match self.readiness {
Some(ref i) => i.readiness(),
None => Ready::empty(),
}
}
pub fn register_socket(
&mut self,
socket: &dyn AsRawSocket,
poll: &Poll,
token: Token,
events: Ready,
opts: PollOpt,
registration: &Mutex<Option<Registration>>,
) -> io::Result<()> {
trace!("register {:?} {:?}", token, events);
unsafe {
self.binding.register_socket(socket, token, poll)?;
}
let (r, s) = poll::new_registration(poll, token, events, opts);
self.readiness = Some(s);
*registration.lock().unwrap() = Some(r);
Ok(())
}
pub fn reregister_socket(
&mut self,
socket: &dyn AsRawSocket,
poll: &Poll,
token: Token,
events: Ready,
opts: PollOpt,
registration: &Mutex<Option<Registration>>,
) -> io::Result<()> {
trace!("reregister {:?} {:?}", token, events);
unsafe {
self.binding.reregister_socket(socket, token, poll)?;
}
registration
.lock()
.unwrap()
.as_mut()
.unwrap()
.reregister(poll, token, events, opts)
}
pub fn deregister(
&mut self,
socket: &dyn AsRawSocket,
poll: &Poll,
registration: &Mutex<Option<Registration>>,
) -> io::Result<()> {
trace!("deregistering");
unsafe {
self.binding.deregister_socket(socket, poll)?;
}
#[allow(deprecated)]
registration
.lock()
.unwrap()
.as_ref()
.unwrap()
.deregister(poll)
}
}
macro_rules! overlapped2arc {
($e:expr, $t:ty, $($field:ident).+) => ({
let offset = offset_of!($t, $($field).+);
debug_assert!(offset < mem::size_of::<$t>());
FromRawArc::from_raw(($e as usize - offset) as *mut $t)
})
}
macro_rules! offset_of {
($t:ty, $($field:ident).+) => (
&(*(0 as *const $t)).$($field).+ as *const _ as usize
)
}