Index: runtime/bin/eventhandler_win.cc |
diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc |
index 85bb1368e1ea6edd7c64380a12677b60ad6a59ea..c524fd5dc5e5f1afb2ede79185a0a7ea80ae5a94 100644 |
--- a/runtime/bin/eventhandler_win.cc |
+++ b/runtime/bin/eventhandler_win.cc |
@@ -373,6 +373,7 @@ bool DirectoryWatchHandle::IsClosed() { |
bool DirectoryWatchHandle::IssueRead() { |
ScopedLock lock(this); |
+ if (pending_read_ != NULL) return true; |
Søren Gjesse
2014/02/18 14:28:00
Should this ever happen?
Anders Johnsen
2014/02/19 09:43:03
Yes, in this case only. Will add comment.
|
OverlappedBuffer* buffer = OverlappedBuffer::AllocateReadBuffer(kBufferSize); |
ASSERT(completion_port_ != INVALID_HANDLE_VALUE); |
@@ -529,6 +530,13 @@ ClientSocket* ListenSocket::Accept() { |
accepted_head_ = accepted_head_->next(); |
if (accepted_head_ == NULL) accepted_tail_ = NULL; |
result->set_next(NULL); |
+ if (!IsClosing()) { |
+ while (pending_accept_count() < 5) { |
+ if (!IssueAccept()) { |
+ event_handler_->HandleError(this); |
+ } |
+ } |
+ } |
return result; |
} |
@@ -566,6 +574,7 @@ int Handle::Read(void* buffer, int num_bytes) { |
if (data_ready_->IsEmpty()) { |
OverlappedBuffer::DisposeBuffer(data_ready_); |
data_ready_ = NULL; |
+ if (!IsClosing() && !IsClosedRead()) IssueRead(); |
} |
return num_bytes; |
} |
@@ -588,6 +597,7 @@ int Handle::RecvFrom( |
// entirety to match how recvfrom works in a socket. |
OverlappedBuffer::DisposeBuffer(data_ready_); |
data_ready_ = NULL; |
+ if (!IsClosing() && !IsClosedRead()) IssueRecvFrom(); |
return num_bytes; |
} |
@@ -981,62 +991,48 @@ void EventHandlerImplementation::HandleInterrupt(InterruptMessage* msg) { |
Handle::ScopedLock lock(handle); |
- if (handle->IsError()) { |
- DartUtils::PostInt32(msg->dart_port, 1 << kErrorEvent); |
- } else { |
- if ((msg->data & ((1 << kInEvent) | (1 << kOutEvent))) != 0) { |
- // Only set mask if we turned on kInEvent or kOutEvent. |
- handle->SetPortAndMask(msg->dart_port, msg->data); |
- |
- // If in events (data available events) have been requested, and data |
- // is available, post an in event immediately. Otherwise make sure |
- // that a pending read is issued, unless the socket is already closed |
- // for read. |
- if ((msg->data & (1 << kInEvent)) != 0) { |
- if (handle->Available() > 0) { |
- int event_mask = (1 << kInEvent); |
- handle->set_mask(handle->mask() & ~event_mask); |
- DartUtils::PostInt32(handle->port(), event_mask); |
- } else if (handle->IsClosedRead()) { |
- int event_mask = (1 << kCloseEvent); |
- DartUtils::PostInt32(handle->port(), event_mask); |
- } else if (!handle->HasPendingRead()) { |
- if (handle->is_datagram_socket()) { |
- handle->IssueRecvFrom(); |
- } else { |
- handle->IssueRead(); |
- } |
- } |
- } |
+ // Only set mask if we turned on kInEvent or kOutEvent. |
Søren Gjesse
2014/02/18 14:28:00
What are the cases where neither in nor out events
Anders Johnsen
2014/02/19 09:43:03
close/shutdown before we listen for data. An examp
|
+ if ((msg->data & ((1 << kInEvent) | (1 << kOutEvent))) != 0) { |
+ handle->SetPortAndMask(msg->dart_port, msg->data); |
+ } |
- // If out events (can write events) have been requested, and there |
- // are no pending writes, post an out event immediately. |
- if ((msg->data & (1 << kOutEvent)) != 0) { |
- if (!handle->HasPendingWrite()) { |
- int event_mask = (1 << kOutEvent); |
- handle->set_mask(handle->mask() & ~event_mask); |
- DartUtils::PostInt32(handle->port(), event_mask); |
- } |
- } |
+ // Issue a read. |
+ if ((msg->data & (1 << kInEvent)) != 0) { |
+ handle->SetPortAndMask(msg->dart_port, msg->data); |
+ if (handle->is_datagram_socket()) { |
+ handle->IssueRecvFrom(); |
+ } else { |
+ handle->IssueRead(); |
} |
+ } |
- if (handle->is_client_socket()) { |
- ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(handle); |
- if ((msg->data & (1 << kShutdownReadCommand)) != 0) { |
- client_socket->Shutdown(SD_RECEIVE); |
- } |
- |
- if ((msg->data & (1 << kShutdownWriteCommand)) != 0) { |
- client_socket->Shutdown(SD_SEND); |
- } |
+ // If out events (can write events) have been requested, and there |
+ // are no pending writes, post an out event immediately. |
Søren Gjesse
2014/02/18 14:28:00
You should probably explain that no pending write
Anders Johnsen
2014/02/19 09:43:03
Done.
|
+ if ((msg->data & (1 << kOutEvent)) != 0) { |
+ handle->SetPortAndMask(msg->dart_port, msg->data); |
+ if (!handle->HasPendingWrite()) { |
+ int event_mask = (1 << kOutEvent); |
+ DartUtils::PostInt32(handle->port(), event_mask); |
} |
} |
- if ((msg->data & (1 << kCloseCommand)) != 0) { |
- handle->SetPortAndMask(msg->dart_port, msg->data); |
- handle->Close(); |
+ if (handle->is_client_socket()) { |
+ ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(handle); |
+ if ((msg->data & (1 << kShutdownReadCommand)) != 0) { |
+ client_socket->Shutdown(SD_RECEIVE); |
+ } |
+ |
+ if ((msg->data & (1 << kShutdownWriteCommand)) != 0) { |
+ client_socket->Shutdown(SD_SEND); |
+ } |
} |
} |
+ |
+ if ((msg->data & (1 << kCloseCommand)) != 0) { |
+ handle->SetPortAndMask(msg->dart_port, msg->data); |
+ handle->Close(); |
+ } |
+ |
DeleteIfClosed(handle); |
} |
} |