Closed
Description
The current timeout API on the various stream implementations behaves as a deadline vs. a timeout setting. I propose the following.
- Rename
set_timeout
->set_deadline
. (as well as the read and write variants). - Move
set_deadline
to a trait (for example:ReadDeadline
andWriteDeadline
) - Provide
TimedReader
andTimedWriter
that operate as follows:
/// Various network related helpers
use std::io::{Reader, Writer, IoResult};
use std::io::net::unix::UnixStream;
use util::Duration;
pub trait ReadDeadline {
fn set_read_deadline(&mut self, timeout_ms: Option<u64>);
}
impl ReadDeadline for UnixStream {
fn set_read_deadline(&mut self, timeout_ms: Option<u64>) {
self.set_read_timeout(timeout_ms);
}
}
pub trait WriteDeadline {
fn set_write_deadline(&mut self, timeout_ms: Option<u64>);
}
impl WriteDeadline for UnixStream {
fn set_write_deadline(&mut self, timeout_ms: Option<u64>) {
self.set_write_timeout(timeout_ms);
}
}
pub struct TimedReader<R> {
reader: R,
timeout_ms: u64
}
impl<R: Reader + ReadDeadline> TimedReader<R> {
pub fn new(reader: R, timeout_ms: u64) -> TimedReader<R> {
TimedReader {
reader: reader,
timeout_ms: timeout_ms
}
}
}
impl<R: Reader + ReadDeadline> Reader for TimedReader<R> {
fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
self.reader.set_read_deadline(Some(self.timeout_ms));
self.reader.read(buf)
}
}
pub struct TimedWriter<W> {
writer: W,
timeout_ms: u64
}
impl<W: Writer + WriteDeadline> TimedWriter<W> {
pub fn new(writer: W, timeout_ms: u64) -> TimedWriter<W> {
TimedWriter {
writer: writer,
timeout_ms: timeout_ms
}
}
}
impl<W: Writer + WriteDeadline> Writer for TimedWriter<W> {
fn write(&mut self, buf: &[u8]) -> IoResult<()> {
self.writer.set_write_deadline(Some(self.timeout_ms));
self.writer.write(buf)
}
}
Metadata
Assignees
Labels
No labels