Index: runtime/bin/eventhandler_win.cc |
diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc |
index 332f80f8731b815081b89952e165b2d3fd6cb7d6..3ced5d085d93b504fa9a5953e64b2e89b2699355 100644 |
--- a/runtime/bin/eventhandler_win.cc |
+++ b/runtime/bin/eventhandler_win.cc |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
// for details. All rights reserved. Use of this source code is governed by a |
// BSD-style license that can be found in the LICENSE file. |
@@ -324,7 +324,7 @@ void FileHandle::EnsureInitialized(EventHandlerImplementation* event_handler) { |
bool FileHandle::IsClosed() { |
- return false; |
+ return IsClosing(); |
} |
@@ -573,7 +573,7 @@ void ClientSocket::Shutdown(int how) { |
void ClientSocket::DoClose() { |
- // Always do a suhtdown before initiating a disconnect. |
+ // Always do a shutdown before initiating a disconnect. |
shutdown(socket(), SD_BOTH); |
IssueDisconnect(); |
} |
@@ -630,12 +630,14 @@ bool ClientSocket::IssueWrite() { |
void ClientSocket::IssueDisconnect() { |
+ Dart_Port p = port(); |
IOBuffer* buffer = IOBuffer::AllocateDisconnectBuffer(); |
BOOL ok = DisconnectEx_( |
socket(), buffer->GetCleanOverlapped(), TF_REUSE_SOCKET, 0); |
if (!ok && WSAGetLastError() != WSA_IO_PENDING) { |
DisconnectComplete(buffer); |
} |
+ if (p != ILLEGAL_PORT) DartUtils::PostInt32(p, 1 << kDestroyedEvent); |
} |
@@ -666,6 +668,15 @@ bool ClientSocket::IsClosed() { |
} |
+static void DeleteIfClosed(Handle* handle) { |
+ if (handle->IsClosed()) { |
+ Dart_Port port = handle->port(); |
+ delete handle; |
+ DartUtils::PostInt32(port, 1 << kDestroyedEvent); |
+ } |
+} |
+ |
+ |
void EventHandlerImplementation::HandleInterrupt(InterruptMessage* msg) { |
if (msg->id == kTimeoutId) { |
// Change of timeout request. Just set the new timeout and port as the |
@@ -674,7 +685,6 @@ void EventHandlerImplementation::HandleInterrupt(InterruptMessage* msg) { |
} else if (msg->id == kShutdownId) { |
shutdown_ = true; |
} else { |
- bool delete_handle = false; |
Handle* handle = reinterpret_cast<Handle*>(msg->id); |
ASSERT(handle != NULL); |
if (handle->is_listen_socket()) { |
@@ -701,9 +711,6 @@ void EventHandlerImplementation::HandleInterrupt(InterruptMessage* msg) { |
if ((msg->data & (1 << kCloseCommand)) != 0) { |
listen_socket->Close(); |
- if (listen_socket->IsClosed()) { |
- delete_handle = true; |
- } |
} |
} else { |
handle->EnsureInitialized(this); |
@@ -756,15 +763,11 @@ void EventHandlerImplementation::HandleInterrupt(InterruptMessage* msg) { |
} |
if ((msg->data & (1 << kCloseCommand)) != 0) { |
+ handle->SetPortAndMask(msg->dart_port, msg->data); |
handle->Close(); |
- if (handle->IsClosed()) { |
- delete_handle = true; |
- } |
} |
} |
- if (delete_handle) { |
- delete handle; |
- } |
+ DeleteIfClosed(handle); |
} |
} |
@@ -780,9 +783,7 @@ void EventHandlerImplementation::HandleAccept(ListenSocket* listen_socket, |
} |
} |
- if (listen_socket->IsClosed()) { |
- delete listen_socket; |
- } |
+ DeleteIfClosed(listen_socket); |
} |
@@ -825,9 +826,7 @@ void EventHandlerImplementation::HandleRead(Handle* handle, |
} |
} |
- if (handle->IsClosed()) { |
- delete handle; |
- } |
+ DeleteIfClosed(handle); |
} |
@@ -849,9 +848,7 @@ void EventHandlerImplementation::HandleWrite(Handle* handle, |
HandleError(handle); |
} |
- if (handle->IsClosed()) { |
- delete handle; |
- } |
+ DeleteIfClosed(handle); |
} |