mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-09-08 00:00:13 +02:00
Handle hup events as indicating read readiness
Using Linux's `epoll(7)` interface, a `EPOLLHUP` condition is signalled for the reading end of a pipe or socket when the other end is closed for writing. This may happen in combination with `EPOLLIN` being signalled (if further data is available for reading), or with `EPOLLIN`. If `EPOLLHUP` is signalled without `EPOLLIN` it indicates an immediate EOF condition, which will result in the next `read()` suceeding with 0 bytes read. It is thus not required to handle `EPOLLHUP` specially in the reader, but we need to indicate readiness upon encountering it. Looking at the `kqueue` and `windows` mio backends, they seem to be turn a detected EOF and connection reset into `mio::Ready::hup()` events, so it may be reasonable to speculate that this change is an improvement for these platforms as well. Fixes #117.
This commit is contained in:
+2
-2
@@ -306,7 +306,7 @@ impl Core {
|
|||||||
let mut writer = None;
|
let mut writer = None;
|
||||||
let mut inner = self.inner.borrow_mut();
|
let mut inner = self.inner.borrow_mut();
|
||||||
if let Some(io) = inner.io_dispatch.get_mut(token) {
|
if let Some(io) = inner.io_dispatch.get_mut(token) {
|
||||||
if ready.is_readable() {
|
if ready.is_readable() || ready.is_hup() {
|
||||||
reader = io.reader.take();
|
reader = io.reader.take();
|
||||||
io.readiness.fetch_or(1, Ordering::Relaxed);
|
io.readiness.fetch_or(1, Ordering::Relaxed);
|
||||||
}
|
}
|
||||||
@@ -430,7 +430,7 @@ impl Inner {
|
|||||||
let entry = self.io_dispatch.vacant_entry().unwrap();
|
let entry = self.io_dispatch.vacant_entry().unwrap();
|
||||||
try!(self.io.register(source,
|
try!(self.io.register(source,
|
||||||
mio::Token(TOKEN_START + entry.index() * 2),
|
mio::Token(TOKEN_START + entry.index() * 2),
|
||||||
mio::Ready::readable() | mio::Ready::writable(),
|
mio::Ready::readable() | mio::Ready::writable() | mio::Ready::hup(),
|
||||||
mio::PollOpt::edge()));
|
mio::PollOpt::edge()));
|
||||||
Ok((sched.readiness.clone(), entry.insert(sched).index()))
|
Ok((sched.readiness.clone(), entry.insert(sched).index()))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user