| 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(
|
|
|