Commit 91199d4d authored by Dominik Charousset's avatar Dominik Charousset

ignore POLLHUP until there's no more data to read

parent bc950094
...@@ -66,7 +66,7 @@ class middleman_event_handler_impl : public middleman_event_handler { ...@@ -66,7 +66,7 @@ class middleman_event_handler_impl : public middleman_event_handler {
int presult; int presult;
do { do {
presult = ::poll(m_pollset.data(), m_pollset.size(), -1); presult = ::poll(m_pollset.data(), m_pollset.size(), -1);
CPPA_LOGMF(CPPA_DEBUG, self, "poll() on " << num_sockets() CPPA_LOG_DEBUG("poll() on " << num_sockets()
<< " sockets returned " << presult); << " sockets returned " << presult);
if (presult < 0) { if (presult < 0) {
switch (errno) { switch (errno) {
...@@ -92,13 +92,19 @@ class middleman_event_handler_impl : public middleman_event_handler { ...@@ -92,13 +92,19 @@ class middleman_event_handler_impl : public middleman_event_handler {
for (size_t i = 0; i < m_pollset.size(); ++i) { for (size_t i = 0; i < m_pollset.size(); ++i) {
event_bitmask eb = event::none; event_bitmask eb = event::none;
auto& revents = m_pollset[i].revents; auto& revents = m_pollset[i].revents;
if (revents & (POLLRDHUP | POLLERR | POLLHUP | POLLNVAL)) { // read as long as possible, ignore POLLHUP as long as
// there is still data available
if (revents & (POLLIN | POLLPRI)) eb |= event::read;
else if (revents & (POLLRDHUP | POLLERR | POLLHUP | POLLNVAL)) {
CPPA_LOG_DEBUG_IF(revents & POLLRDHUP, "POLLRDHUP");
CPPA_LOG_DEBUG_IF(revents & POLLERR, "POLLERR");
CPPA_LOG_DEBUG_IF(revents & POLLHUP, "POLLHUP");
CPPA_LOG_DEBUG_IF(revents & POLLNVAL, "POLLNVAL");
eb = event::error; eb = event::error;
} }
else { // POLLOUT and POLLHUP are mutually exclusive:
if (revents & (POLLIN | POLLPRI)) eb |= event::read; // no need to check wheter event::error has been set
if (revents & POLLOUT) eb |= event::write; if (revents & POLLOUT) eb |= event::write;
}
revents = 0; revents = 0;
m_events.emplace_back(eb, m_meta[i].ptr.get()); m_events.emplace_back(eb, m_meta[i].ptr.get());
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment