use super::*;
impl RawPipeStream {
#[track_caller]
fn send(&self, buf: &[u8]) -> io::Result<usize> {
let r = c_wrappers::write_exsync(self.as_handle(), buf, None);
if r.is_ok() {
self.needs_flush.mark_dirty();
}
r
}
#[track_caller]
fn flush(&self) -> io::Result<()> {
if self.needs_flush.take() {
let r = c_wrappers::flush(self.as_handle());
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.get().flush() }
#[inline]
pub fn mark_dirty(&self) { self.raw.get().needs_flush.mark_dirty(); }
#[inline]
pub fn assume_flushed(&self) { self.raw.get().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.get().send(buf) }
}
impl<Rm: PipeModeTag> Write for &PipeStream<Rm, pipe_mode::Bytes> {
#[inline]
fn write(&mut self, buf: &[u8]) -> io::Result<usize> { self.raw.get().send(buf) }
#[inline]
fn flush(&mut self) -> io::Result<()> { self.raw.get().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() }
}