Chromium Code Reviews| Index: runtime/bin/eventhandler_linux.cc |
| diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc |
| index c6ebc335fa0b5ffd8f7fd7b82ced205b37aef4cf..15ddbc68aa2c5b11c74b40b00fcbe0010d7ffd27 100644 |
| --- a/runtime/bin/eventhandler_linux.cc |
| +++ b/runtime/bin/eventhandler_linux.cc |
| @@ -48,12 +48,12 @@ static void RemoveFromEpollInstance(intptr_t epoll_fd_, SocketData* sd) { |
| } |
| -static void AddToEpollInstance(intptr_t epoll_fd_, SocketData* sd) { |
| +static void AddToEpollInstance(intptr_t epoll_fd_, SocketData* sd, int mask) { |
| ASSERT(!sd->tracked_by_epoll()); |
| struct epoll_event event; |
| event.events = EPOLLET | EPOLLRDHUP; |
| - if ((sd->mask() & (1 << kInEvent)) != 0) event.events |= EPOLLIN; |
| - if ((sd->mask() & (1 << kOutEvent)) != 0) event.events |= EPOLLOUT; |
| + if ((mask & (1 << kInEvent)) != 0) event.events |= EPOLLIN; |
| + if ((mask & (1 << kOutEvent)) != 0) event.events |= EPOLLOUT; |
| event.data.ptr = sd; |
| int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_, |
| EPOLL_CTL_ADD, |
| @@ -190,8 +190,8 @@ void EventHandlerImplementation::HandleInterruptFd() { |
| bool is_new = false; |
| SocketData* sd = GetSocketData(msg[i].id, &is_new); |
| if (is_new) { |
| - sd->SetPortAndMask(msg[i].dart_port, msg[i].data); |
| - AddToEpollInstance(epoll_fd_, sd); |
| + sd->SetPort(msg[i].dart_port); |
| + AddToEpollInstance(epoll_fd_, sd, msg[i].data); |
| } |
| if ((msg[i].data & (1 << kShutdownReadCommand)) != 0) { |
| ASSERT(msg[i].data == (1 << kShutdownReadCommand)); |
| @@ -242,46 +242,29 @@ intptr_t EventHandlerImplementation::GetPollEvents(intptr_t events, |
| PrintEventMask(sd->fd(), events); |
| #endif |
| intptr_t event_mask = 0; |
| - if (sd->IsListeningSocket()) { |
| - // For listening sockets the EPOLLIN event indicate that there are |
| - // connections ready for accept unless accompanied with one of the |
| - // other flags. |
| + // Prioritize data events over close and error events. |
|
Søren Gjesse
2014/02/19 15:53:25
This comment seems wrong. We are not prioritizing
Anders Johnsen
2014/02/19 16:08:29
Done.
|
| + if ((events & (EPOLLIN | EPOLLHUP | EPOLLRDHUP)) != 0) { |
|
Søren Gjesse
2014/02/19 15:53:25
Is this if statement actually needed?
Anders Johnsen
2014/02/19 16:08:29
Done.
|
| + // If we have EPOLLIN and we have available bytes, report that. |
| if ((events & EPOLLIN) != 0) { |
| - if ((events & EPOLLHUP) != 0) event_mask |= (1 << kCloseEvent); |
| - if ((events & EPOLLERR) != 0) event_mask |= (1 << kErrorEvent); |
| - if (event_mask == 0) event_mask |= (1 << kInEvent); |
| + event_mask = (1 << kInEvent); |
| } |
| - } else { |
| - // Prioritize data events over close and error events. |
| - if ((events & (EPOLLIN | EPOLLHUP | EPOLLRDHUP)) != 0) { |
| - // If we have EPOLLIN and we have available bytes, report that. |
| - if ((events & EPOLLIN) != 0) { |
| - event_mask = (1 << kInEvent); |
| - } |
| - if ((events & (EPOLLHUP | EPOLLRDHUP)) != 0) { |
| - // If both EPOLLHUP and EPOLLERR are reported treat it as an |
| - // error. |
| - if ((events & EPOLLERR) != 0) { |
| - event_mask = (1 << kErrorEvent); |
| - } else { |
| - event_mask |= (1 << kCloseEvent); |
| - } |
| - } else if ((events & EPOLLERR) != 0) { |
| - event_mask = (1 << kErrorEvent); |
| - } |
| - } |
| - |
| - if ((events & EPOLLOUT) != 0) { |
| + if ((events & (EPOLLHUP | EPOLLRDHUP)) != 0) { |
| + // If both EPOLLHUP and EPOLLERR are reported treat it as an |
| + // error. |
| if ((events & EPOLLERR) != 0) { |
| - if (!sd->IsPipe()) { |
| - event_mask = (1 << kErrorEvent); |
| - } |
| + event_mask = (1 << kErrorEvent); |
| } else { |
| - event_mask |= (1 << kOutEvent); |
| + event_mask |= (1 << kCloseEvent); |
| } |
| + } else if ((events & EPOLLERR) != 0) { |
| + event_mask = (1 << kErrorEvent); |
| } |
| } |
| + if ((events & EPOLLOUT) != 0 && (events & EPOLLERR) == 0) { |
|
Søren Gjesse
2014/02/19 15:53:25
Can't this move up after line 250?
Anders Johnsen
2014/02/19 16:08:29
Done.
|
| + event_mask |= (1 << kOutEvent); |
| + } |
| + |
| return event_mask; |
| } |