| Index: runtime/bin/eventhandler_linux.cc
|
| diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
|
| index b0bf01e992171fb8b82abf834925a6a67a0e94e5..1bf9378aac2a309bc04abd33fbefbdd58fcb3e4a 100644
|
| --- a/runtime/bin/eventhandler_linux.cc
|
| +++ b/runtime/bin/eventhandler_linux.cc
|
| @@ -216,9 +216,13 @@ void EventHandlerImplementation::HandleInterruptFd() {
|
| socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
|
| delete sd;
|
| } else {
|
| - // Setup events to wait for.
|
| - sd->SetPortAndMask(msg.dart_port, msg.data);
|
| - UpdateEpollInstance(epoll_fd_, sd);
|
| + if ((msg.data & (1 << kInEvent)) != 0 && sd->IsClosedRead()) {
|
| + DartUtils::PostInt32(msg.dart_port, 1 << kCloseEvent);
|
| + } else {
|
| + // Setup events to wait for.
|
| + sd->SetPortAndMask(msg.dart_port, msg.data);
|
| + UpdateEpollInstance(epoll_fd_, sd);
|
| + }
|
| }
|
| }
|
| }
|
| @@ -343,6 +347,8 @@ void EventHandlerImplementation::HandleEvents(struct epoll_event* events,
|
| }
|
| }
|
| }
|
| + // Handle after socket events, so we avoid closing a socket before we handle
|
| + // the current events.
|
| HandleInterruptFd();
|
| }
|
|
|
|
|