flatty_io/blocking/
io.rs

1use super::{ReadBuffer, WriteBuffer};
2use crate::IoBuffer;
3use std::io::{self, Read, Write};
4
5impl<P: Write> WriteBuffer for IoBuffer<P> {
6    type Error = io::Error;
7
8    fn alloc(&mut self) -> Result<(), Self::Error> {
9        let n = self.buffer.vacant_len();
10        if n > 0 {
11            self.buffer.advance(n);
12        }
13        Ok(())
14    }
15    fn write_all(&mut self, count: usize) -> Result<(), Self::Error> {
16        assert!(!self.poisoned);
17        let mut pos = 0;
18        while pos < count {
19            match self.pipe.write(&self.buffer.occupied()[pos..count]) {
20                Ok(n) => {
21                    if n == 0 {
22                        if pos != 0 {
23                            self.poisoned = true;
24                        }
25                        return Err(io::ErrorKind::BrokenPipe.into());
26                    } else {
27                        pos += n;
28                    }
29                }
30                Err(e) => {
31                    if pos != 0 {
32                        self.poisoned = true;
33                        return Err(e);
34                    }
35                }
36            }
37        }
38        self.buffer.clear();
39        Ok(())
40    }
41}
42
43impl<P: Read> ReadBuffer for IoBuffer<P> {
44    type Error = io::Error;
45
46    fn read(&mut self) -> Result<usize, Self::Error> {
47        assert!(!self.poisoned);
48        if self.buffer.vacant_len() == 0 {
49            if self.buffer.preceding_len() > 0 {
50                self.buffer.make_contiguous();
51            } else {
52                return Err(io::ErrorKind::OutOfMemory.into());
53            }
54        }
55        let res = self.pipe.read(self.buffer.vacant_mut());
56        if let Ok(n) = res {
57            self.buffer.advance(n);
58        }
59        res
60    }
61
62    fn skip(&mut self, count: usize) {
63        self.buffer.skip(count);
64    }
65}