tools/wrapped_reader_stream.rs: allocate Vec<u8> for buffer
This commit is contained in:
parent
ff8bdf3b64
commit
8eeef8492a
|
@ -6,12 +6,15 @@ use futures::stream::Stream;
|
||||||
|
|
||||||
pub struct WrappedReaderStream<R: Read> {
|
pub struct WrappedReaderStream<R: Read> {
|
||||||
reader: R,
|
reader: R,
|
||||||
|
buffer: Vec<u8>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl <R: Read> WrappedReaderStream<R> {
|
impl <R: Read> WrappedReaderStream<R> {
|
||||||
|
|
||||||
pub fn new(reader: R) -> Self {
|
pub fn new(reader: R) -> Self {
|
||||||
Self { reader }
|
let mut buffer = Vec::with_capacity(64*1024);
|
||||||
|
unsafe { buffer.set_len(buffer.capacity()); }
|
||||||
|
Self { reader, buffer }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,13 +30,12 @@ impl <R: Read> Stream for WrappedReaderStream<R> {
|
||||||
type Error = std::io::Error;
|
type Error = std::io::Error;
|
||||||
|
|
||||||
fn poll(&mut self) -> Result<Async<Option<Vec<u8>>>, std::io::Error> {
|
fn poll(&mut self) -> Result<Async<Option<Vec<u8>>>, std::io::Error> {
|
||||||
let mut buf = [0u8;64*1024];
|
match tokio_threadpool::blocking(|| self.reader.read(&mut self.buffer)) {
|
||||||
match tokio_threadpool::blocking(|| self.reader.read(&mut buf)) {
|
|
||||||
Ok(Async::Ready(Ok(n))) => {
|
Ok(Async::Ready(Ok(n))) => {
|
||||||
if n == 0 { // EOF
|
if n == 0 { // EOF
|
||||||
Ok(Async::Ready(None))
|
Ok(Async::Ready(None))
|
||||||
} else {
|
} else {
|
||||||
Ok(Async::Ready(Some(buf[..n].to_vec())))
|
Ok(Async::Ready(Some(self.buffer[..n].to_vec())))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Ok(Async::Ready(Err(err))) => Err(err),
|
Ok(Async::Ready(Err(err))) => Err(err),
|
||||||
|
|
Loading…
Reference in New Issue