Index: runtime/bin/eventhandler_android.cc |
diff --git a/runtime/bin/eventhandler_android.cc b/runtime/bin/eventhandler_android.cc |
index 053b69d085d7a3a7a1215de092ff9f398ed07279..b1a424f2f9359c10edd7f47bc1f28d6b62cf8fe5 100644 |
--- a/runtime/bin/eventhandler_android.cc |
+++ b/runtime/bin/eventhandler_android.cc |
@@ -205,9 +205,13 @@ void EventHandlerImplementation::HandleInterruptFd() { |
shutdown_ = true; |
} else { |
ASSERT((msg[i].data & COMMAND_MASK) != 0); |
- |
+ Socket* socket = reinterpret_cast<Socket*>(msg[i].id); |
+ RefCntReleaseScope<Socket> rs(socket); |
+ if (socket->fd() == -1) { |
+ continue; |
+ } |
DescriptorInfo* di = |
- GetDescriptorInfo(msg[i].id, IS_LISTENING_SOCKET(msg[i].data)); |
+ GetDescriptorInfo(socket->fd(), IS_LISTENING_SOCKET(msg[i].data)); |
if (IS_COMMAND(msg[i].data, kShutdownReadCommand)) { |
ASSERT(!di->IsListeningSocket()); |
// Close the socket for reading. |
@@ -235,18 +239,20 @@ void EventHandlerImplementation::HandleInterruptFd() { |
MutexLocker locker(registry->mutex()); |
- if (registry->CloseSafe(fd)) { |
+ if (registry->CloseSafe(socket)) { |
ASSERT(new_mask == 0); |
socket_map_.Remove(GetHashmapKeyFromFd(fd), |
GetHashmapHashFromFd(fd)); |
di->Close(); |
delete di; |
+ socket->SetClosedFd(); |
} |
} else { |
ASSERT(new_mask == 0); |
socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd)); |
di->Close(); |
delete di; |
+ socket->SetClosedFd(); |
} |
DartUtils::PostInt32(port, 1 << kDestroyedEvent); |
@@ -405,6 +411,7 @@ void EventHandlerImplementation::Poll(uword args) { |
handler_impl->HandleEvents(events, result); |
} |
} |
+ DEBUG_ASSERT(ReferenceCounted<Socket>::instances() == 0); |
handler->NotifyShutdownDone(); |
} |