From f6b47c64c482271f4c33e2c4e71a739f83c5a92f Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 17 May 2021 14:47:00 +0100 Subject: [PATCH] timedfd: Refactor to prep for writing too (2) Signed-off-by: Ian Jackson --- src/timedfd.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/timedfd.rs b/src/timedfd.rs index 67869c16..c16aa136 100644 --- a/src/timedfd.rs +++ b/src/timedfd.rs @@ -85,15 +85,15 @@ impl TimedFd where RW: TimedFdReadWrite { Instant::now() + timeout })); } -} -impl Read for TimedFd { #[throws(io::Error)] - fn read(&mut self, buf: &mut [u8]) -> usize { + fn rw(&mut self, mut f: F) -> O + where F: FnMut(i32) -> Result + { 'again: loop { for event in &self.events { if event.token() == Token(0) { - match unistd::read(self.fd.as_raw_fd(), buf) { + match f(self.fd.as_raw_fd()) { Ok(got) => { break 'again got }, Err(NE::Sys(Errno::EINTR)) => { continue 'again } Err(NE::Sys(Errno::EAGAIN)) => break, @@ -121,6 +121,13 @@ impl Read for TimedFd { } } +impl Read for TimedFd { + #[throws(io::Error)] + fn read(&mut self, buf: &mut [u8]) -> usize { + self.rw(|fd| unistd::read(fd, buf))? + } +} + impl Drop for Fd { fn drop(&mut self) { let fd = self.extract_raw_fd(); -- 2.30.2