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}