mod error;
pub use error::*;
mod r#impl;
use {
crate::os::windows::{
named_pipe::stream::{pipe_mode, PipeModeTag},
winprelude::*,
MaybeArc, NeedsFlush,
},
std::{io, marker::PhantomData, mem::ManuallyDrop},
tokio::net::windows::named_pipe::{
NamedPipeClient as TokioNPClient, NamedPipeServer as TokioNPServer,
},
};
#[cfg_attr(doc, doc = doctest_file::include_doctest!("examples/named_pipe/sync/stream/bytes.rs"))]
pub struct PipeStream<Rm: PipeModeTag, Sm: PipeModeTag> {
raw: Sm::OptArc<RawPipeStream>,
flusher: Sm::TokioFlusher,
_phantom: PhantomData<(Rm, Sm)>,
}
pub type DuplexPipeStream<M> = PipeStream<M, M>;
pub type RecvPipeStream<M> = PipeStream<M, pipe_mode::None>;
pub type SendPipeStream<M> = PipeStream<pipe_mode::None, M>;
pub(crate) struct RawPipeStream {
inner: ManuallyDrop<InnerTokio>,
needs_flush: NeedsFlush,
}
enum InnerTokio {
Server(TokioNPServer),
Client(TokioNPClient),
}
impl Drop for RawPipeStream {
fn drop(&mut self) {
let i = unsafe { ManuallyDrop::take(&mut self.inner) };
if self.needs_flush.get_mut() {
match i {
InnerTokio::Server(p) => linger_pool::linger_boxed(p),
InnerTokio::Client(p) => linger_pool::linger_boxed(p),
}
}
}
}