use crate as orengine;
use crate::io::io_request_data::IoRequestData;
use crate::io::sys::{AsRawFd, RawFd};
use crate::io::worker::{local_worker, IoWorker};
use orengine_macros::poll_for_io_request;
use std::future::Future;
use std::io::Result;
use std::net::Shutdown as ShutdownHow;
use std::pin::Pin;
use std::task::{Context, Poll};
pub struct Shutdown {
fd: RawFd,
how: ShutdownHow,
io_request_data: Option<IoRequestData>,
}
impl Shutdown {
pub fn new(fd: RawFd, how: ShutdownHow) -> Self {
Self {
fd,
how,
io_request_data: None,
}
}
}
impl Future for Shutdown {
type Output = Result<()>;
fn poll(self: Pin<&mut Self>, cx: &mut Context) -> Poll<Self::Output> {
let this = unsafe { self.get_unchecked_mut() };
#[allow(unused, reason = "Cannot write proc_macro else to make it readable.")]
let ret;
poll_for_io_request!((
local_worker().shutdown(this.fd, this.how, unsafe {
this.io_request_data.as_mut().unwrap_unchecked()
}),
()
));
}
}
unsafe impl Send for Shutdown {}
pub trait AsyncShutdown: AsRawFd {
fn shutdown(&mut self, how: ShutdownHow) -> Shutdown {
Shutdown::new(self.as_raw_fd(), how)
}
}