| Index: dart/runtime/bin/eventhandler_linux.cc
|
| diff --git a/dart/runtime/bin/eventhandler_linux.cc b/dart/runtime/bin/eventhandler_linux.cc
|
| index 2037fccd6060a9e26837495c91a8b88ada263462..f28481f70daf280741dae324d887b8c4ad89d5d1 100644
|
| --- a/dart/runtime/bin/eventhandler_linux.cc
|
| +++ b/dart/runtime/bin/eventhandler_linux.cc
|
| @@ -241,13 +241,15 @@ 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;
|
| }
|
|
|