Index: dart/runtime/bin/eventhandler_macos.cc |
diff --git a/dart/runtime/bin/eventhandler_macos.cc b/dart/runtime/bin/eventhandler_macos.cc |
index 6caadc09622776e84c070dfddb4a2a5f7ef2e33d..fa2dbf6cd9dde328a680cf0fde3165bdfb40b85b 100644 |
--- a/dart/runtime/bin/eventhandler_macos.cc |
+++ b/dart/runtime/bin/eventhandler_macos.cc |
@@ -241,18 +241,18 @@ void EventHandlerImplementation::HandleInterruptFd() { |
// We only close the socket file descriptor from the operating |
// system if there are no other dart socket objects which |
// are listening on the same (address, port) combination. |
+ ListeningSocketRegistry *registry = |
+ ListeningSocketRegistry::Instance(); |
- // TODO(dart:io): This assumes that all sockets listen before we |
- // close. |
- // This needs to be synchronized with a global datastructure. |
- if (new_mask == 0) { |
- socket_map_.Remove( |
- GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd)); |
+ MutexLocker locker(registry->mutex()); |
+ |
+ if (registry->CloseSafe(fd)) { |
+ ASSERT(new_mask == 0); |
+ socket_map_.Remove(GetHashmapKeyFromFd(fd), |
+ GetHashmapHashFromFd(fd)); |
di->Close(); |
delete di; |
} |
- |
- |
} else { |
ASSERT(new_mask == 0); |
socket_map_.Remove( |