chiark / gitweb /
timedfd: Refactor to prep for writing too (2)
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 17 May 2021 13:47:00 +0000 (14:47 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 17 May 2021 13:57:04 +0000 (14:57 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/timedfd.rs

index 67869c16f26a40a89d4eeeab3236d3271416afd5..c16aa13662f56371fff2409bce1558b04e4e3f68 100644 (file)
@@ -85,15 +85,15 @@ impl<RW> TimedFd<RW> where RW: TimedFdReadWrite {
       Instant::now() + timeout
     }));
   }
-}
 
-impl Read for TimedFd<TimedFdRead> {
   #[throws(io::Error)]
-  fn read(&mut self, buf: &mut [u8]) -> usize {
+  fn rw<F,O>(&mut self, mut f: F) -> O
+  where F: FnMut(i32) -> Result<O, nix::Error>
+  {
     '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<TimedFdRead> {
   }
 }
 
+impl Read for TimedFd<TimedFdRead> {
+  #[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();