use crate::CoreError;
use crate::reactor::Fd;
const WRITE_CHUNK: usize = 65536;
pub(crate) struct WriterState {
pub(crate) buf: Option<Box<[u8]>>,
off: usize,
}
impl WriterState {
pub(crate) fn new(buf: Option<Box<[u8]>>) -> Self {
Self { buf, off: 0 }
}
#[inline(always)]
pub(crate) fn write_to_fd(&mut self, fd: &Fd) -> Result<bool, CoreError> {
if let Some(buf) = &self.buf {
while self.off < buf.len() {
let remaining = buf.len() - self.off;
let chunk = remaining.min(WRITE_CHUNK);
match fd.write_slice(&buf[self.off..self.off + chunk]) {
Ok(Some(n)) if n > 0 => {
self.off += n;
}
Ok(Some(_)) => {
self.buf = None;
return Ok(true); }
Ok(None) => {
return Ok(false); }
Err(e) => {
let CoreError::Syscall { code, .. } = &e;
if *code == libc::EPIPE {
self.buf = None;
return Ok(true); } else {
self.buf = None;
return Err(e); }
}
}
}
self.buf = None;
return Ok(true);
}
Ok(true)
}
}