|
|
@ -6,6 +6,13 @@ use std::path::{
|
|
|
|
Path, PathBuf
|
|
|
|
Path, PathBuf
|
|
|
|
};
|
|
|
|
};
|
|
|
|
use std::{fmt, error};
|
|
|
|
use std::{fmt, error};
|
|
|
|
|
|
|
|
use std::{
|
|
|
|
|
|
|
|
task::{Context, Poll},
|
|
|
|
|
|
|
|
pin::Pin,
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
use tokio::io::{
|
|
|
|
|
|
|
|
AsyncWrite, AsyncRead,
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
|
|
|
|
pub struct SocketAddrUnix
|
|
|
|
pub struct SocketAddrUnix
|
|
|
@ -186,11 +193,80 @@ impl Listener
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: Add `poll_accept` for unpinned `&self` polling
|
|
|
|
/// Poll to accept a new incoming connection to this listener
|
|
|
|
|
|
|
|
pub fn poll_accept(&self, cx: &mut Context<'_>) -> Poll<io::Result<Stream>>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
match self.0.as_ref()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
ListenerInner::Unix(un) => un.poll_accept(cx).map_ok(Into::into),
|
|
|
|
|
|
|
|
ListenerInner::Tcp(tcp) => tcp.poll_accept(cx).map_ok(Into::into)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//TODO: impl Stream
|
|
|
|
//TODO: impl Stream
|
|
|
|
impl Stream
|
|
|
|
impl Stream
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
#[inline(always)] pub fn reader_ref(&self) -> &(dyn AsyncRead + Unpin + Send + Sync + '_)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
match self.0.as_ref()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
StreamInner::Unix(un) => un,
|
|
|
|
|
|
|
|
StreamInner::Tcp(tc) => tc,
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline(always)] pub fn writer_ref(&self) -> &(dyn AsyncWrite + Unpin + Send + Sync + '_)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
match self.0.as_ref()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
StreamInner::Unix(un) => un,
|
|
|
|
|
|
|
|
StreamInner::Tcp(tc) => tc,
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[inline(always)] pub fn reader_mut(&mut self) -> &mut (dyn AsyncRead + Unpin + Send + Sync + '_)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
match self.0.as_mut()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
StreamInner::Unix(un) => un,
|
|
|
|
|
|
|
|
StreamInner::Tcp(tc) => tc,
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline(always)] pub fn writer_mut(&mut self) -> &mut (dyn AsyncWrite + Unpin + Send + Sync + '_)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
match self.0.as_mut()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
StreamInner::Unix(un) => un,
|
|
|
|
|
|
|
|
StreamInner::Tcp(tc) => tc,
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[inline(always)] fn reader_pinned_mut(self: Pin<&mut Self>) -> Pin<&mut (dyn AsyncRead + Unpin + Send + Sync + '_)>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Pin::new(self.get_mut().reader_mut())
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline(always)] fn writer_pinned_mut(self: Pin<&mut Self>) -> Pin<&mut (dyn AsyncWrite + Unpin + Send + Sync + '_)>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Pin::new(self.get_mut().writer_mut())
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
impl AsyncWrite for Stream
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
#[inline] fn poll_write(self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &[u8]) -> Poll<Result<usize, io::Error>> {
|
|
|
|
|
|
|
|
self.writer_pinned_mut().poll_write(cx, buf)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline] fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), io::Error>> {
|
|
|
|
|
|
|
|
self.writer_pinned_mut().poll_flush(cx)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline] fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), io::Error>> {
|
|
|
|
|
|
|
|
self.writer_pinned_mut().poll_shutdown(cx)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
impl AsyncRead for Stream
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
#[inline] fn poll_read(self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &mut tokio::io::ReadBuf<'_>) -> Poll<io::Result<()>> {
|
|
|
|
|
|
|
|
self.reader_pinned_mut().poll_read(cx, buf)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|