Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(600)

Unified Diff: runtime/bin/eventhandler_win.cc

Issue 14864009: Keep track of when a socket has been destroyed (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Remove delete_handle marker. Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/bin/eventhandler_macos.cc ('k') | runtime/bin/socket_patch.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « runtime/bin/eventhandler_macos.cc ('k') | runtime/bin/socket_patch.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698