locked_io.rs

 1use std::io;
 2use std::io::prelude::*;
 3
 4use std::sync::{Arc, Mutex};
 5
 6pub struct LockedIO<T>(Arc<Mutex<T>>);
 7
 8impl<T> LockedIO<T> {
 9    pub fn from(inner: Arc<Mutex<T>>) -> LockedIO<T> {
10        LockedIO(inner)
11    }
12}
13
14impl<T> Clone for LockedIO<T> {
15    fn clone(&self) -> LockedIO<T> {
16        LockedIO(self.0.clone())
17    }
18}
19
20impl<T: Write> io::Write for LockedIO<T> {
21    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
22        let mut inner = self.0.lock().unwrap(); // TODO: make safer
23        inner.write(buf)
24    }
25
26    fn flush(&mut self) -> io::Result<()> {
27        let mut inner = self.0.lock().unwrap(); // TODO: make safer
28        inner.flush()
29    }
30}
31
32impl<T: Read> io::Read for LockedIO<T> {
33    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
34        let mut inner = self.0.lock().unwrap(); // TODO: make safer
35        inner.read(buf)
36    }
37}