Index: runtime/bin/eventhandler_win.cc |
diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc |
index 43a686d8536e7bbcc7d23afebd0df0262843834d..9aeda580a30e9cba7d450c3d810658ad7a5082fa 100644 |
--- a/runtime/bin/eventhandler_win.cc |
+++ b/runtime/bin/eventhandler_win.cc |
@@ -40,18 +40,15 @@ OverlappedBuffer* OverlappedBuffer::AllocateBuffer(int buffer_size, |
return buffer; |
} |
- |
OverlappedBuffer* OverlappedBuffer::AllocateAcceptBuffer(int buffer_size) { |
OverlappedBuffer* buffer = AllocateBuffer(buffer_size, kAccept); |
return buffer; |
} |
- |
OverlappedBuffer* OverlappedBuffer::AllocateReadBuffer(int buffer_size) { |
return AllocateBuffer(buffer_size, kRead); |
} |
- |
OverlappedBuffer* OverlappedBuffer::AllocateRecvFromBuffer(int buffer_size) { |
// For calling recvfrom additional buffer space is needed for the source |
// address information. |
@@ -59,39 +56,32 @@ OverlappedBuffer* OverlappedBuffer::AllocateRecvFromBuffer(int buffer_size) { |
return AllocateBuffer(buffer_size, kRecvFrom); |
} |
- |
OverlappedBuffer* OverlappedBuffer::AllocateWriteBuffer(int buffer_size) { |
return AllocateBuffer(buffer_size, kWrite); |
} |
- |
OverlappedBuffer* OverlappedBuffer::AllocateSendToBuffer(int buffer_size) { |
return AllocateBuffer(buffer_size, kSendTo); |
} |
- |
OverlappedBuffer* OverlappedBuffer::AllocateDisconnectBuffer() { |
return AllocateBuffer(0, kDisconnect); |
} |
- |
OverlappedBuffer* OverlappedBuffer::AllocateConnectBuffer() { |
return AllocateBuffer(0, kConnect); |
} |
- |
void OverlappedBuffer::DisposeBuffer(OverlappedBuffer* buffer) { |
delete buffer; |
} |
- |
OverlappedBuffer* OverlappedBuffer::GetFromOverlapped(OVERLAPPED* overlapped) { |
OverlappedBuffer* buffer = |
CONTAINING_RECORD(overlapped, OverlappedBuffer, overlapped_); |
return buffer; |
} |
- |
int OverlappedBuffer::Read(void* buffer, int num_bytes) { |
if (num_bytes > GetRemainingLength()) { |
num_bytes = GetRemainingLength(); |
@@ -101,7 +91,6 @@ int OverlappedBuffer::Read(void* buffer, int num_bytes) { |
return num_bytes; |
} |
- |
int OverlappedBuffer::Write(const void* buffer, int num_bytes) { |
ASSERT(num_bytes == buflen_); |
memmove(GetBufferStart(), buffer, num_bytes); |
@@ -109,13 +98,11 @@ int OverlappedBuffer::Write(const void* buffer, int num_bytes) { |
return num_bytes; |
} |
- |
int OverlappedBuffer::GetRemainingLength() { |
ASSERT(operation_ == kRead || operation_ == kRecvFrom); |
return data_length_ - index_; |
} |
- |
Handle::Handle(intptr_t handle) |
: ReferenceCounted(), |
DescriptorInfoBase(handle), |
@@ -133,12 +120,10 @@ Handle::Handle(intptr_t handle) |
read_thread_finished_(false), |
monitor_(new Monitor()) {} |
- |
Handle::~Handle() { |
delete monitor_; |
} |
- |
bool Handle::CreateCompletionPort(HANDLE completion_port) { |
ASSERT(completion_port_ == INVALID_HANDLE_VALUE); |
// A reference to the Handle is Retained by the IO completion port. |
@@ -149,7 +134,6 @@ bool Handle::CreateCompletionPort(HANDLE completion_port) { |
return (completion_port_ != NULL); |
} |
- |
void Handle::Close() { |
MonitorLocker ml(monitor_); |
if (!SupportsOverlappedIO()) { |
@@ -176,7 +160,6 @@ void Handle::Close() { |
ASSERT(IsHandleClosed()); |
} |
- |
void Handle::DoClose() { |
if (!IsHandleClosed()) { |
CloseHandle(handle_); |
@@ -184,19 +167,16 @@ void Handle::DoClose() { |
} |
} |
- |
bool Handle::HasPendingRead() { |
MonitorLocker ml(monitor_); |
return pending_read_ != NULL; |
} |
- |
bool Handle::HasPendingWrite() { |
MonitorLocker ml(monitor_); |
return pending_write_ != NULL; |
} |
- |
void Handle::WaitForReadThreadStarted() { |
MonitorLocker ml(monitor_); |
while (read_thread_starting_) { |
@@ -204,7 +184,6 @@ void Handle::WaitForReadThreadStarted() { |
} |
} |
- |
void Handle::WaitForReadThreadFinished() { |
HANDLE to_join = NULL; |
{ |
@@ -227,7 +206,6 @@ void Handle::WaitForReadThreadFinished() { |
} |
} |
- |
void Handle::ReadComplete(OverlappedBuffer* buffer) { |
WaitForReadThreadStarted(); |
{ |
@@ -245,12 +223,10 @@ void Handle::ReadComplete(OverlappedBuffer* buffer) { |
WaitForReadThreadFinished(); |
} |
- |
void Handle::RecvFromComplete(OverlappedBuffer* buffer) { |
ReadComplete(buffer); |
} |
- |
void Handle::WriteComplete(OverlappedBuffer* buffer) { |
MonitorLocker ml(monitor_); |
// Currently only one outstanding write at the time. |
@@ -259,13 +235,11 @@ void Handle::WriteComplete(OverlappedBuffer* buffer) { |
pending_write_ = NULL; |
} |
- |
static void ReadFileThread(uword args) { |
Handle* handle = reinterpret_cast<Handle*>(args); |
handle->ReadSyncCompleteAsync(); |
} |
- |
void Handle::NotifyReadThreadStarted() { |
MonitorLocker ml(monitor_); |
ASSERT(read_thread_starting_); |
@@ -276,7 +250,6 @@ void Handle::NotifyReadThreadStarted() { |
ml.Notify(); |
} |
- |
void Handle::NotifyReadThreadFinished() { |
MonitorLocker ml(monitor_); |
ASSERT(!read_thread_finished_); |
@@ -285,7 +258,6 @@ void Handle::NotifyReadThreadFinished() { |
ml.Notify(); |
} |
- |
void Handle::ReadSyncCompleteAsync() { |
NotifyReadThreadStarted(); |
ASSERT(pending_read_ != NULL); |
@@ -311,7 +283,6 @@ void Handle::ReadSyncCompleteAsync() { |
NotifyReadThreadFinished(); |
} |
- |
bool Handle::IssueRead() { |
ASSERT(type_ != kListenSocket); |
ASSERT(pending_read_ == NULL); |
@@ -342,12 +313,10 @@ bool Handle::IssueRead() { |
} |
} |
- |
bool Handle::IssueRecvFrom() { |
return false; |
} |
- |
bool Handle::IssueWrite() { |
MonitorLocker ml(monitor_); |
ASSERT(type_ != kListenSocket); |
@@ -369,12 +338,10 @@ bool Handle::IssueWrite() { |
return false; |
} |
- |
bool Handle::IssueSendTo(struct sockaddr* sa, socklen_t sa_len) { |
return false; |
} |
- |
static void HandleClosed(Handle* handle) { |
if (!handle->IsClosing()) { |
int event_mask = 1 << kCloseEvent; |
@@ -382,7 +349,6 @@ static void HandleClosed(Handle* handle) { |
} |
} |
- |
static void HandleError(Handle* handle) { |
handle->set_last_error(WSAGetLastError()); |
handle->MarkError(); |
@@ -391,7 +357,6 @@ static void HandleError(Handle* handle) { |
} |
} |
- |
void Handle::HandleIssueError() { |
DWORD error = GetLastError(); |
if (error == ERROR_BROKEN_PIPE) { |
@@ -402,7 +367,6 @@ void Handle::HandleIssueError() { |
SetLastError(error); |
} |
- |
void FileHandle::EnsureInitialized(EventHandlerImplementation* event_handler) { |
MonitorLocker ml(monitor_); |
event_handler_ = event_handler; |
@@ -419,12 +383,10 @@ void FileHandle::EnsureInitialized(EventHandlerImplementation* event_handler) { |
} |
} |
- |
bool FileHandle::IsClosed() { |
return IsClosing() && !HasPendingRead() && !HasPendingWrite(); |
} |
- |
void DirectoryWatchHandle::EnsureInitialized( |
EventHandlerImplementation* event_handler) { |
MonitorLocker ml(monitor_); |
@@ -434,12 +396,10 @@ void DirectoryWatchHandle::EnsureInitialized( |
} |
} |
- |
bool DirectoryWatchHandle::IsClosed() { |
return IsClosing() && (pending_read_ == NULL); |
} |
- |
bool DirectoryWatchHandle::IssueRead() { |
// It may have been started before, as we start the directory-handler when |
// we create it. |
@@ -460,7 +420,6 @@ bool DirectoryWatchHandle::IssueRead() { |
return false; |
} |
- |
void DirectoryWatchHandle::Stop() { |
MonitorLocker ml(monitor_); |
// Stop the outstanding read, so we can close the handle. |
@@ -473,7 +432,6 @@ void DirectoryWatchHandle::Stop() { |
DoClose(); |
} |
- |
void SocketHandle::HandleIssueError() { |
int error = WSAGetLastError(); |
if (error == WSAECONNRESET) { |
@@ -484,7 +442,6 @@ void SocketHandle::HandleIssueError() { |
WSASetLastError(error); |
} |
- |
bool ListenSocket::LoadAcceptEx() { |
// Load the AcceptEx function into memory using WSAIoctl. |
GUID guid_accept_ex = WSAID_ACCEPTEX; |
@@ -495,7 +452,6 @@ bool ListenSocket::LoadAcceptEx() { |
return (status != SOCKET_ERROR); |
} |
- |
bool ListenSocket::IssueAccept() { |
MonitorLocker ml(monitor_); |
@@ -530,7 +486,6 @@ bool ListenSocket::IssueAccept() { |
return true; |
} |
- |
void ListenSocket::AcceptComplete(OverlappedBuffer* buffer, |
HANDLE completion_port) { |
MonitorLocker ml(monitor_); |
@@ -565,7 +520,6 @@ void ListenSocket::AcceptComplete(OverlappedBuffer* buffer, |
OverlappedBuffer::DisposeBuffer(buffer); |
} |
- |
static void DeleteIfClosed(Handle* handle) { |
if (handle->IsClosed()) { |
handle->set_completion_port(INVALID_HANDLE_VALUE); |
@@ -578,7 +532,6 @@ static void DeleteIfClosed(Handle* handle) { |
} |
} |
- |
void ListenSocket::DoClose() { |
closesocket(socket()); |
handle_ = INVALID_HANDLE_VALUE; |
@@ -605,13 +558,11 @@ void ListenSocket::DoClose() { |
AcceptEx_ = NULL; |
} |
- |
bool ListenSocket::CanAccept() { |
MonitorLocker ml(monitor_); |
return accepted_head_ != NULL; |
} |
- |
ClientSocket* ListenSocket::Accept() { |
MonitorLocker ml(monitor_); |
@@ -639,7 +590,6 @@ ClientSocket* ListenSocket::Accept() { |
return result; |
} |
- |
void ListenSocket::EnsureInitialized( |
EventHandlerImplementation* event_handler) { |
MonitorLocker ml(monitor_); |
@@ -652,12 +602,10 @@ void ListenSocket::EnsureInitialized( |
} |
} |
- |
bool ListenSocket::IsClosed() { |
return IsClosing() && !HasPendingAccept(); |
} |
- |
intptr_t Handle::Available() { |
MonitorLocker ml(monitor_); |
if (data_ready_ == NULL) { |
@@ -667,7 +615,6 @@ intptr_t Handle::Available() { |
return data_ready_->GetRemainingLength(); |
} |
- |
intptr_t Handle::Read(void* buffer, intptr_t num_bytes) { |
MonitorLocker ml(monitor_); |
if (data_ready_ == NULL) { |
@@ -685,7 +632,6 @@ intptr_t Handle::Read(void* buffer, intptr_t num_bytes) { |
return num_bytes; |
} |
- |
intptr_t Handle::RecvFrom(void* buffer, |
intptr_t num_bytes, |
struct sockaddr* sa, |
@@ -714,7 +660,6 @@ intptr_t Handle::RecvFrom(void* buffer, |
return num_bytes; |
} |
- |
intptr_t Handle::Write(const void* buffer, intptr_t num_bytes) { |
MonitorLocker ml(monitor_); |
if (pending_write_ != NULL) { |
@@ -736,7 +681,6 @@ intptr_t Handle::Write(const void* buffer, intptr_t num_bytes) { |
return truncated_bytes; |
} |
- |
intptr_t Handle::SendTo(const void* buffer, |
intptr_t num_bytes, |
struct sockaddr* sa, |
@@ -760,7 +704,6 @@ intptr_t Handle::SendTo(const void* buffer, |
return num_bytes; |
} |
- |
Mutex* StdHandle::stdin_mutex_ = new Mutex(); |
StdHandle* StdHandle::stdin_ = NULL; |
@@ -772,13 +715,11 @@ StdHandle* StdHandle::Stdin(HANDLE handle) { |
return stdin_; |
} |
- |
static void WriteFileThread(uword args) { |
StdHandle* handle = reinterpret_cast<StdHandle*>(args); |
handle->RunWriteLoop(); |
} |
- |
void StdHandle::RunWriteLoop() { |
MonitorLocker ml(monitor_); |
write_thread_running_ = true; |
@@ -799,7 +740,6 @@ void StdHandle::RunWriteLoop() { |
ml.Notify(); |
} |
- |
void StdHandle::WriteSyncCompleteAsync() { |
ASSERT(pending_write_ != NULL); |
@@ -863,7 +803,6 @@ intptr_t StdHandle::Write(const void* buffer, intptr_t num_bytes) { |
return 0; |
} |
- |
void StdHandle::DoClose() { |
{ |
MonitorLocker ml(monitor_); |
@@ -885,12 +824,10 @@ void StdHandle::DoClose() { |
StdHandle::stdin_ = NULL; |
} |
- |
#if defined(DEBUG) |
intptr_t ClientSocket::disconnecting_ = 0; |
#endif |
- |
bool ClientSocket::LoadDisconnectEx() { |
// Load the DisconnectEx function into memory using WSAIoctl. |
GUID guid_disconnect_ex = WSAID_DISCONNECTEX; |
@@ -902,7 +839,6 @@ bool ClientSocket::LoadDisconnectEx() { |
return (status != SOCKET_ERROR); |
} |
- |
void ClientSocket::Shutdown(int how) { |
int rc = shutdown(socket(), how); |
if (how == SD_RECEIVE) { |
@@ -917,7 +853,6 @@ void ClientSocket::Shutdown(int how) { |
} |
} |
- |
void ClientSocket::DoClose() { |
// Always do a shutdown before initiating a disconnect. |
shutdown(socket(), SD_BOTH); |
@@ -925,7 +860,6 @@ void ClientSocket::DoClose() { |
handle_ = INVALID_HANDLE_VALUE; |
} |
- |
bool ClientSocket::IssueRead() { |
MonitorLocker ml(monitor_); |
ASSERT(completion_port_ != INVALID_HANDLE_VALUE); |
@@ -949,7 +883,6 @@ bool ClientSocket::IssueRead() { |
return false; |
} |
- |
bool ClientSocket::IssueWrite() { |
MonitorLocker ml(monitor_); |
ASSERT(completion_port_ != INVALID_HANDLE_VALUE); |
@@ -967,7 +900,6 @@ bool ClientSocket::IssueWrite() { |
return false; |
} |
- |
void ClientSocket::IssueDisconnect() { |
OverlappedBuffer* buffer = OverlappedBuffer::AllocateDisconnectBuffer(); |
BOOL ok = |
@@ -991,7 +923,6 @@ void ClientSocket::IssueDisconnect() { |
#endif |
} |
- |
void ClientSocket::DisconnectComplete(OverlappedBuffer* buffer) { |
OverlappedBuffer::DisposeBuffer(buffer); |
closesocket(socket()); |
@@ -1004,7 +935,6 @@ void ClientSocket::DisconnectComplete(OverlappedBuffer* buffer) { |
#endif |
} |
- |
void ClientSocket::ConnectComplete(OverlappedBuffer* buffer) { |
OverlappedBuffer::DisposeBuffer(buffer); |
// Update socket to support full socket API, after ConnectEx completed. |
@@ -1020,7 +950,6 @@ void ClientSocket::ConnectComplete(OverlappedBuffer* buffer) { |
} |
} |
- |
void ClientSocket::EnsureInitialized( |
EventHandlerImplementation* event_handler) { |
MonitorLocker ml(monitor_); |
@@ -1031,12 +960,10 @@ void ClientSocket::EnsureInitialized( |
} |
} |
- |
bool ClientSocket::IsClosed() { |
return connected_ && closed_; |
} |
- |
bool DatagramSocket::IssueSendTo(struct sockaddr* sa, socklen_t sa_len) { |
MonitorLocker ml(monitor_); |
ASSERT(completion_port_ != INVALID_HANDLE_VALUE); |
@@ -1054,7 +981,6 @@ bool DatagramSocket::IssueSendTo(struct sockaddr* sa, socklen_t sa_len) { |
return false; |
} |
- |
bool DatagramSocket::IssueRecvFrom() { |
MonitorLocker ml(monitor_); |
ASSERT(completion_port_ != INVALID_HANDLE_VALUE); |
@@ -1078,7 +1004,6 @@ bool DatagramSocket::IssueRecvFrom() { |
return false; |
} |
- |
void DatagramSocket::EnsureInitialized( |
EventHandlerImplementation* event_handler) { |
MonitorLocker ml(monitor_); |
@@ -1089,12 +1014,10 @@ void DatagramSocket::EnsureInitialized( |
} |
} |
- |
bool DatagramSocket::IsClosed() { |
return IsClosing() && !HasPendingRead() && !HasPendingWrite(); |
} |
- |
void DatagramSocket::DoClose() { |
// Just close the socket. This will cause any queued requests to be aborted. |
closesocket(socket()); |
@@ -1103,7 +1026,6 @@ void DatagramSocket::DoClose() { |
handle_ = INVALID_HANDLE_VALUE; |
} |
- |
void EventHandlerImplementation::HandleInterrupt(InterruptMessage* msg) { |
ASSERT(this != NULL); |
if (msg->id == kTimerId) { |
@@ -1224,7 +1146,6 @@ void EventHandlerImplementation::HandleInterrupt(InterruptMessage* msg) { |
} |
} |
- |
void EventHandlerImplementation::HandleAccept(ListenSocket* listen_socket, |
OverlappedBuffer* buffer) { |
listen_socket->AcceptComplete(buffer, completion_port_); |
@@ -1237,7 +1158,6 @@ void EventHandlerImplementation::HandleAccept(ListenSocket* listen_socket, |
DeleteIfClosed(listen_socket); |
} |
- |
void EventHandlerImplementation::TryDispatchingPendingAccepts( |
ListenSocket* listen_socket) { |
if (!listen_socket->IsClosing() && listen_socket->CanAccept()) { |
@@ -1251,7 +1171,6 @@ void EventHandlerImplementation::TryDispatchingPendingAccepts( |
} |
} |
- |
void EventHandlerImplementation::HandleRead(Handle* handle, |
int bytes, |
OverlappedBuffer* buffer) { |
@@ -1277,7 +1196,6 @@ void EventHandlerImplementation::HandleRead(Handle* handle, |
DeleteIfClosed(handle); |
} |
- |
void EventHandlerImplementation::HandleRecvFrom(Handle* handle, |
int bytes, |
OverlappedBuffer* buffer) { |
@@ -1299,7 +1217,6 @@ void EventHandlerImplementation::HandleRecvFrom(Handle* handle, |
DeleteIfClosed(handle); |
} |
- |
void EventHandlerImplementation::HandleWrite(Handle* handle, |
int bytes, |
OverlappedBuffer* buffer) { |
@@ -1322,7 +1239,6 @@ void EventHandlerImplementation::HandleWrite(Handle* handle, |
DeleteIfClosed(handle); |
} |
- |
void EventHandlerImplementation::HandleDisconnect(ClientSocket* client_socket, |
int bytes, |
OverlappedBuffer* buffer) { |
@@ -1330,7 +1246,6 @@ void EventHandlerImplementation::HandleDisconnect(ClientSocket* client_socket, |
DeleteIfClosed(client_socket); |
} |
- |
void EventHandlerImplementation::HandleConnect(ClientSocket* client_socket, |
int bytes, |
OverlappedBuffer* buffer) { |
@@ -1344,7 +1259,6 @@ void EventHandlerImplementation::HandleConnect(ClientSocket* client_socket, |
DeleteIfClosed(client_socket); |
} |
- |
void EventHandlerImplementation::HandleTimeout() { |
if (!timeout_queue_.HasTimeout()) { |
return; |
@@ -1353,7 +1267,6 @@ void EventHandlerImplementation::HandleTimeout() { |
timeout_queue_.RemoveCurrent(); |
} |
- |
void EventHandlerImplementation::HandleIOCompletion(DWORD bytes, |
ULONG_PTR key, |
OVERLAPPED* overlapped) { |
@@ -1395,7 +1308,6 @@ void EventHandlerImplementation::HandleIOCompletion(DWORD bytes, |
} |
} |
- |
void EventHandlerImplementation::HandleCompletionOrInterrupt( |
BOOL ok, |
DWORD bytes, |
@@ -1433,7 +1345,6 @@ void EventHandlerImplementation::HandleCompletionOrInterrupt( |
} |
} |
- |
EventHandlerImplementation::EventHandlerImplementation() { |
startup_monitor_ = new Monitor(); |
handler_thread_id_ = Thread::kInvalidThreadId; |
@@ -1446,7 +1357,6 @@ EventHandlerImplementation::EventHandlerImplementation() { |
shutdown_ = false; |
} |
- |
EventHandlerImplementation::~EventHandlerImplementation() { |
// Join the handler thread. |
DWORD res = WaitForSingleObject(handler_thread_handle_, INFINITE); |
@@ -1456,7 +1366,6 @@ EventHandlerImplementation::~EventHandlerImplementation() { |
CloseHandle(completion_port_); |
} |
- |
int64_t EventHandlerImplementation::GetTimeout() { |
if (!timeout_queue_.HasTimeout()) { |
return kInfinityTimeout; |
@@ -1466,7 +1375,6 @@ int64_t EventHandlerImplementation::GetTimeout() { |
return (millis < 0) ? 0 : millis; |
} |
- |
void EventHandlerImplementation::SendData(intptr_t id, |
Dart_Port dart_port, |
int64_t data) { |
@@ -1481,7 +1389,6 @@ void EventHandlerImplementation::SendData(intptr_t id, |
} |
} |
- |
void EventHandlerImplementation::EventHandlerEntry(uword args) { |
EventHandler* handler = reinterpret_cast<EventHandler*>(args); |
EventHandlerImplementation* handler_impl = &handler->delegate_; |
@@ -1554,7 +1461,6 @@ void EventHandlerImplementation::EventHandlerEntry(uword args) { |
handler->NotifyShutdownDone(); |
} |
- |
void EventHandlerImplementation::Start(EventHandler* handler) { |
int result = |
Thread::Start(EventHandlerEntry, reinterpret_cast<uword>(handler)); |
@@ -1575,7 +1481,6 @@ void EventHandlerImplementation::Start(EventHandler* handler) { |
} |
} |
- |
void EventHandlerImplementation::Shutdown() { |
SendData(kShutdownId, 0, 0); |
} |