| Index: dart/runtime/bin/eventhandler_win.cc
|
| diff --git a/dart/runtime/bin/eventhandler_win.cc b/dart/runtime/bin/eventhandler_win.cc
|
| index a4528b3b4112b58c1538381db770b8448d9c0f74..61b6f44578d74ac274c63aee63e380759c9a2bcb 100644
|
| --- a/dart/runtime/bin/eventhandler_win.cc
|
| +++ b/dart/runtime/bin/eventhandler_win.cc
|
| @@ -1014,82 +1014,102 @@ void EventHandlerImplementation::HandleInterrupt(InterruptMessage* msg) {
|
| } else if (msg->id == kShutdownId) {
|
| shutdown_ = true;
|
| } else {
|
| - // No tokens to return on Windows.
|
| - if ((msg->data & (1 << kReturnTokenCommand)) != 0) return;
|
| Handle* handle = reinterpret_cast<Handle*>(msg->id);
|
| ASSERT(handle != NULL);
|
| if (handle->is_listen_socket()) {
|
| ListenSocket* listen_socket =
|
| reinterpret_cast<ListenSocket*>(handle);
|
| listen_socket->EnsureInitialized(this);
|
| - listen_socket->SetPortAndMask(msg->dart_port, msg->data);
|
|
|
| Handle::ScopedLock lock(listen_socket);
|
|
|
| - // If incoming connections are requested make sure to post already
|
| - // accepted connections.
|
| - if ((msg->data & (1 << kInEvent)) != 0) {
|
| - if (listen_socket->CanAccept()) {
|
| - int event_mask = (1 << kInEvent);
|
| - handle->set_mask(handle->mask() & ~event_mask);
|
| - DartUtils::PostInt32(handle->port(), event_mask);
|
| + if (IS_COMMAND(msg->data, kReturnTokenCommand)) {
|
| + // No tokens to return on Windows.
|
| + } else if (IS_COMMAND(msg->data, kSetEventMaskCommand)) {
|
| + // `events` can only have kInEvent/kOutEvent flags set.
|
| + intptr_t events = msg->data & EVENT_MASK;
|
| + ASSERT(0 == (events & ~(1 << kInEvent | 1 << kOutEvent)));
|
| +
|
| + listen_socket->SetPortAndMask(msg->dart_port, msg->data);
|
| +
|
| + // If incoming connections are requested make sure to post already
|
| + // accepted connections.
|
| + if ((events & (1 << kInEvent)) != 0) {
|
| + if (listen_socket->CanAccept()) {
|
| + int event_mask = (1 << kInEvent);
|
| + handle->set_mask(handle->mask() & ~event_mask);
|
| + DartUtils::PostInt32(handle->port(), event_mask);
|
| + }
|
| }
|
| + } else if (IS_COMMAND(msg->data, kCloseCommand)) {
|
| + handle->SetPortAndMask(msg->dart_port, msg->data);
|
| + handle->Close();
|
| + } else {
|
| + UNREACHABLE();
|
| }
|
| } else {
|
| handle->EnsureInitialized(this);
|
|
|
| Handle::ScopedLock lock(handle);
|
|
|
| - // Only set mask if we turned on kInEvent or kOutEvent.
|
| - if ((msg->data & ((1 << kInEvent) | (1 << kOutEvent))) != 0) {
|
| + if (IS_COMMAND(msg->data, kReturnTokenCommand)) {
|
| + // No tokens to return on Windows.
|
| + } else if (IS_COMMAND(msg->data, kSetEventMaskCommand)) {
|
| + // `events` can only have kInEvent/kOutEvent flags set.
|
| + intptr_t events = msg->data & EVENT_MASK;
|
| + ASSERT(0 == (events & ~(1 << kInEvent | 1 << kOutEvent)));
|
| +
|
| handle->SetPortAndMask(msg->dart_port, msg->data);
|
| - }
|
|
|
| - // Issue a read.
|
| - if ((msg->data & (1 << kInEvent)) != 0) {
|
| - if (handle->is_datagram_socket()) {
|
| - handle->IssueRecvFrom();
|
| - } else if (handle->is_client_socket()) {
|
| - if (reinterpret_cast<ClientSocket*>(handle)->is_connected()) {
|
| + // Issue a read.
|
| + if ((msg->data & (1 << kInEvent)) != 0) {
|
| + if (handle->is_datagram_socket()) {
|
| + handle->IssueRecvFrom();
|
| + } else if (handle->is_client_socket()) {
|
| + if (reinterpret_cast<ClientSocket*>(handle)->is_connected()) {
|
| + handle->IssueRead();
|
| + }
|
| + } else {
|
| handle->IssueRead();
|
| }
|
| - } else {
|
| - handle->IssueRead();
|
| }
|
| - }
|
|
|
| - // If out events (can write events) have been requested, and there
|
| - // are no pending writes, meaning any writes are already complete,
|
| - // post an out event immediately.
|
| - if ((msg->data & (1 << kOutEvent)) != 0) {
|
| - if (!handle->HasPendingWrite()) {
|
| - if (handle->is_client_socket()) {
|
| - if (reinterpret_cast<ClientSocket*>(handle)->is_connected()) {
|
| + // If out events (can write events) have been requested, and there
|
| + // are no pending writes, meaning any writes are already complete,
|
| + // post an out event immediately.
|
| + if ((msg->data & (1 << kOutEvent)) != 0) {
|
| + if (!handle->HasPendingWrite()) {
|
| + if (handle->is_client_socket()) {
|
| + if (reinterpret_cast<ClientSocket*>(handle)->is_connected()) {
|
| + DartUtils::PostInt32(handle->port(), 1 << kOutEvent);
|
| + }
|
| + } else {
|
| DartUtils::PostInt32(handle->port(), 1 << kOutEvent);
|
| }
|
| - } else {
|
| - DartUtils::PostInt32(handle->port(), 1 << kOutEvent);
|
| }
|
| }
|
| - }
|
| + } else if (IS_COMMAND(msg->data, kShutdownReadCommand)) {
|
| + ASSERT(handle->is_client_socket());
|
|
|
| - if (handle->is_client_socket()) {
|
| ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(handle);
|
| if ((msg->data & (1 << kShutdownReadCommand)) != 0) {
|
| client_socket->Shutdown(SD_RECEIVE);
|
| }
|
| + } else if (IS_COMMAND(msg->data, kShutdownWriteCommand)) {
|
| + ASSERT(handle->is_client_socket());
|
|
|
| + ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(handle);
|
| if ((msg->data & (1 << kShutdownWriteCommand)) != 0) {
|
| client_socket->Shutdown(SD_SEND);
|
| }
|
| + } else if (IS_COMMAND(msg->data, kCloseCommand)) {
|
| + handle->SetPortAndMask(msg->dart_port, msg->data);
|
| + handle->Close();
|
| + } else {
|
| + UNREACHABLE();
|
| }
|
| }
|
|
|
| - if ((msg->data & (1 << kCloseCommand)) != 0) {
|
| - handle->SetPortAndMask(msg->dart_port, msg->data);
|
| - handle->Close();
|
| - }
|
| -
|
| DeleteIfClosed(handle);
|
| }
|
| }
|
|
|