use super::*;
impl RawPipeStream {
#[track_caller]
fn send(&self, buf: &[u8]) -> io::Result<usize> {
let r = {
let _guard = self.concurrency_detector.lock();
self.file_handle().write(buf)
};
if r.is_ok() {
self.needs_flush.mark_dirty();
}
r
}
#[track_caller]
fn flush(&self) -> io::Result<()> {
if self.needs_flush.take() {
let r = self.file_handle().flush();
if r.is_err() {
self.needs_flush.mark_dirty();
}
r
} else {
Ok(())
}
}
}
impl<Rm: PipeModeTag, Sm: PipeModeTag + PmtNotNone> PipeStream<Rm, Sm> {
#[inline]
pub fn flush(&self) -> io::Result<()> {
self.raw.flush()
}
#[inline]
pub fn mark_dirty(&self) {
self.raw.needs_flush.mark_dirty();
}
#[inline]
pub fn assume_flushed(&self) {
self.raw.needs_flush.take();
}
#[inline]
pub fn evade_limbo(self) {
self.assume_flushed();
}
}
impl<Rm: PipeModeTag> PipeStream<Rm, pipe_mode::Messages> {
#[inline]
pub fn send(&self, buf: &[u8]) -> io::Result<usize> {
self.raw.send(buf)
}
}
impl<Rm: PipeModeTag> Write for &PipeStream<Rm, pipe_mode::Bytes> {
#[inline]
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.raw.send(buf)
}
#[inline]
fn flush(&mut self) -> io::Result<()> {
self.raw.flush()
}
}
impl<Rm: PipeModeTag> Write for PipeStream<Rm, pipe_mode::Bytes> {
#[inline(always)]
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
(&*self).write(buf)
}
#[inline(always)]
fn flush(&mut self) -> io::Result<()> {
(&mut &*self).flush()
}
}