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(); |
} |