OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "platform/globals.h" | 5 #include "platform/globals.h" |
6 #if defined(TARGET_OS_WINDOWS) | 6 #if defined(TARGET_OS_WINDOWS) |
7 | 7 |
8 #include "bin/eventhandler.h" | 8 #include "bin/eventhandler.h" |
9 | 9 |
10 #include <winsock2.h> // NOLINT | 10 #include <winsock2.h> // NOLINT |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 } | 366 } |
367 | 367 |
368 | 368 |
369 bool DirectoryWatchHandle::IsClosed() { | 369 bool DirectoryWatchHandle::IsClosed() { |
370 return IsClosing() && pending_read_ == NULL; | 370 return IsClosing() && pending_read_ == NULL; |
371 } | 371 } |
372 | 372 |
373 | 373 |
374 bool DirectoryWatchHandle::IssueRead() { | 374 bool DirectoryWatchHandle::IssueRead() { |
375 ScopedLock lock(this); | 375 ScopedLock lock(this); |
| 376 // It may have been started before, as we start the directory-handler when |
| 377 // we create it. |
| 378 if (pending_read_ != NULL) return true; |
376 OverlappedBuffer* buffer = OverlappedBuffer::AllocateReadBuffer(kBufferSize); | 379 OverlappedBuffer* buffer = OverlappedBuffer::AllocateReadBuffer(kBufferSize); |
377 | 380 |
378 ASSERT(completion_port_ != INVALID_HANDLE_VALUE); | 381 ASSERT(completion_port_ != INVALID_HANDLE_VALUE); |
379 | 382 |
380 BOOL ok = ReadDirectoryChangesW(handle_, | 383 BOOL ok = ReadDirectoryChangesW(handle_, |
381 buffer->GetBufferStart(), | 384 buffer->GetBufferStart(), |
382 buffer->GetBufferSize(), | 385 buffer->GetBufferSize(), |
383 recursive_, | 386 recursive_, |
384 events_, | 387 events_, |
385 NULL, | 388 NULL, |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
522 } | 525 } |
523 | 526 |
524 | 527 |
525 ClientSocket* ListenSocket::Accept() { | 528 ClientSocket* ListenSocket::Accept() { |
526 ScopedLock lock(this); | 529 ScopedLock lock(this); |
527 if (accepted_head_ == NULL) return NULL; | 530 if (accepted_head_ == NULL) return NULL; |
528 ClientSocket* result = accepted_head_; | 531 ClientSocket* result = accepted_head_; |
529 accepted_head_ = accepted_head_->next(); | 532 accepted_head_ = accepted_head_->next(); |
530 if (accepted_head_ == NULL) accepted_tail_ = NULL; | 533 if (accepted_head_ == NULL) accepted_tail_ = NULL; |
531 result->set_next(NULL); | 534 result->set_next(NULL); |
| 535 if (!IsClosing()) { |
| 536 while (pending_accept_count() < 5) { |
| 537 if (!IssueAccept()) { |
| 538 event_handler_->HandleError(this); |
| 539 } |
| 540 } |
| 541 } |
532 return result; | 542 return result; |
533 } | 543 } |
534 | 544 |
535 | 545 |
536 void ListenSocket::EnsureInitialized( | 546 void ListenSocket::EnsureInitialized( |
537 EventHandlerImplementation* event_handler) { | 547 EventHandlerImplementation* event_handler) { |
538 ScopedLock lock(this); | 548 ScopedLock lock(this); |
539 if (AcceptEx_ == NULL) { | 549 if (AcceptEx_ == NULL) { |
540 ASSERT(completion_port_ == INVALID_HANDLE_VALUE); | 550 ASSERT(completion_port_ == INVALID_HANDLE_VALUE); |
541 ASSERT(event_handler_ == NULL); | 551 ASSERT(event_handler_ == NULL); |
(...skipping 17 matching lines...) Expand all Loading... |
559 } | 569 } |
560 | 570 |
561 | 571 |
562 int Handle::Read(void* buffer, int num_bytes) { | 572 int Handle::Read(void* buffer, int num_bytes) { |
563 ScopedLock lock(this); | 573 ScopedLock lock(this); |
564 if (data_ready_ == NULL) return 0; | 574 if (data_ready_ == NULL) return 0; |
565 num_bytes = data_ready_->Read(buffer, num_bytes); | 575 num_bytes = data_ready_->Read(buffer, num_bytes); |
566 if (data_ready_->IsEmpty()) { | 576 if (data_ready_->IsEmpty()) { |
567 OverlappedBuffer::DisposeBuffer(data_ready_); | 577 OverlappedBuffer::DisposeBuffer(data_ready_); |
568 data_ready_ = NULL; | 578 data_ready_ = NULL; |
| 579 if (!IsClosing() && !IsClosedRead()) IssueRead(); |
569 } | 580 } |
570 return num_bytes; | 581 return num_bytes; |
571 } | 582 } |
572 | 583 |
573 | 584 |
574 int Handle::RecvFrom( | 585 int Handle::RecvFrom( |
575 void* buffer, int num_bytes, struct sockaddr* sa, socklen_t sa_len) { | 586 void* buffer, int num_bytes, struct sockaddr* sa, socklen_t sa_len) { |
576 ScopedLock lock(this); | 587 ScopedLock lock(this); |
577 if (data_ready_ == NULL) return 0; | 588 if (data_ready_ == NULL) return 0; |
578 num_bytes = data_ready_->Read(buffer, num_bytes); | 589 num_bytes = data_ready_->Read(buffer, num_bytes); |
579 if (data_ready_->from()->sa_family == AF_INET) { | 590 if (data_ready_->from()->sa_family == AF_INET) { |
580 ASSERT(sa_len >= sizeof(struct sockaddr_in)); | 591 ASSERT(sa_len >= sizeof(struct sockaddr_in)); |
581 memmove(sa, data_ready_->from(), sizeof(struct sockaddr_in)); | 592 memmove(sa, data_ready_->from(), sizeof(struct sockaddr_in)); |
582 } else { | 593 } else { |
583 ASSERT(data_ready_->from()->sa_family == AF_INET6); | 594 ASSERT(data_ready_->from()->sa_family == AF_INET6); |
584 ASSERT(sa_len >= sizeof(struct sockaddr_in6)); | 595 ASSERT(sa_len >= sizeof(struct sockaddr_in6)); |
585 memmove(sa, data_ready_->from(), sizeof(struct sockaddr_in6)); | 596 memmove(sa, data_ready_->from(), sizeof(struct sockaddr_in6)); |
586 } | 597 } |
587 // Always dispose of the buffer, as UDP messages must be read in their | 598 // Always dispose of the buffer, as UDP messages must be read in their |
588 // entirety to match how recvfrom works in a socket. | 599 // entirety to match how recvfrom works in a socket. |
589 OverlappedBuffer::DisposeBuffer(data_ready_); | 600 OverlappedBuffer::DisposeBuffer(data_ready_); |
590 data_ready_ = NULL; | 601 data_ready_ = NULL; |
| 602 if (!IsClosing() && !IsClosedRead()) IssueRecvFrom(); |
591 return num_bytes; | 603 return num_bytes; |
592 } | 604 } |
593 | 605 |
594 | 606 |
595 int Handle::Write(const void* buffer, int num_bytes) { | 607 int Handle::Write(const void* buffer, int num_bytes) { |
596 ScopedLock lock(this); | 608 ScopedLock lock(this); |
597 if (pending_write_ != NULL) return 0; | 609 if (pending_write_ != NULL) return 0; |
598 if (num_bytes > kBufferSize) num_bytes = kBufferSize; | 610 if (num_bytes > kBufferSize) num_bytes = kBufferSize; |
599 ASSERT(SupportsOverlappedIO()); | 611 ASSERT(SupportsOverlappedIO()); |
600 if (completion_port_ == INVALID_HANDLE_VALUE) return 0; | 612 if (completion_port_ == INVALID_HANDLE_VALUE) return 0; |
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
974 } | 986 } |
975 | 987 |
976 if ((msg->data & (1 << kCloseCommand)) != 0) { | 988 if ((msg->data & (1 << kCloseCommand)) != 0) { |
977 listen_socket->Close(); | 989 listen_socket->Close(); |
978 } | 990 } |
979 } else { | 991 } else { |
980 handle->EnsureInitialized(this); | 992 handle->EnsureInitialized(this); |
981 | 993 |
982 Handle::ScopedLock lock(handle); | 994 Handle::ScopedLock lock(handle); |
983 | 995 |
984 if (handle->IsError()) { | 996 // Only set mask if we turned on kInEvent or kOutEvent. |
985 DartUtils::PostInt32(msg->dart_port, 1 << kErrorEvent); | 997 if ((msg->data & ((1 << kInEvent) | (1 << kOutEvent))) != 0) { |
986 } else { | 998 handle->SetPortAndMask(msg->dart_port, msg->data); |
987 if ((msg->data & ((1 << kInEvent) | (1 << kOutEvent))) != 0) { | 999 } |
988 // Only set mask if we turned on kInEvent or kOutEvent. | |
989 handle->SetPortAndMask(msg->dart_port, msg->data); | |
990 | 1000 |
991 // If in events (data available events) have been requested, and data | 1001 // Issue a read. |
992 // is available, post an in event immediately. Otherwise make sure | 1002 if ((msg->data & (1 << kInEvent)) != 0) { |
993 // that a pending read is issued, unless the socket is already closed | 1003 handle->SetPortAndMask(msg->dart_port, msg->data); |
994 // for read. | 1004 if (handle->is_datagram_socket()) { |
995 if ((msg->data & (1 << kInEvent)) != 0) { | 1005 handle->IssueRecvFrom(); |
996 if (handle->Available() > 0) { | 1006 } else { |
997 int event_mask = (1 << kInEvent); | 1007 handle->IssueRead(); |
998 handle->set_mask(handle->mask() & ~event_mask); | |
999 DartUtils::PostInt32(handle->port(), event_mask); | |
1000 } else if (handle->IsClosedRead()) { | |
1001 int event_mask = (1 << kCloseEvent); | |
1002 DartUtils::PostInt32(handle->port(), event_mask); | |
1003 } else if (!handle->HasPendingRead()) { | |
1004 if (handle->is_datagram_socket()) { | |
1005 handle->IssueRecvFrom(); | |
1006 } else { | |
1007 handle->IssueRead(); | |
1008 } | |
1009 } | |
1010 } | |
1011 | |
1012 // If out events (can write events) have been requested, and there | |
1013 // are no pending writes, post an out event immediately. | |
1014 if ((msg->data & (1 << kOutEvent)) != 0) { | |
1015 if (!handle->HasPendingWrite()) { | |
1016 int event_mask = (1 << kOutEvent); | |
1017 handle->set_mask(handle->mask() & ~event_mask); | |
1018 DartUtils::PostInt32(handle->port(), event_mask); | |
1019 } | |
1020 } | |
1021 } | |
1022 | |
1023 if (handle->is_client_socket()) { | |
1024 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(handle); | |
1025 if ((msg->data & (1 << kShutdownReadCommand)) != 0) { | |
1026 client_socket->Shutdown(SD_RECEIVE); | |
1027 } | |
1028 | |
1029 if ((msg->data & (1 << kShutdownWriteCommand)) != 0) { | |
1030 client_socket->Shutdown(SD_SEND); | |
1031 } | |
1032 } | 1008 } |
1033 } | 1009 } |
1034 | 1010 |
1035 if ((msg->data & (1 << kCloseCommand)) != 0) { | 1011 // If out events (can write events) have been requested, and there |
| 1012 // are no pending writes, meaning any writes are already complete, |
| 1013 // post an out event immediately. |
| 1014 if ((msg->data & (1 << kOutEvent)) != 0) { |
1036 handle->SetPortAndMask(msg->dart_port, msg->data); | 1015 handle->SetPortAndMask(msg->dart_port, msg->data); |
1037 handle->Close(); | 1016 if (!handle->HasPendingWrite()) { |
| 1017 int event_mask = (1 << kOutEvent); |
| 1018 DartUtils::PostInt32(handle->port(), event_mask); |
| 1019 } |
| 1020 } |
| 1021 |
| 1022 if (handle->is_client_socket()) { |
| 1023 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(handle); |
| 1024 if ((msg->data & (1 << kShutdownReadCommand)) != 0) { |
| 1025 client_socket->Shutdown(SD_RECEIVE); |
| 1026 } |
| 1027 |
| 1028 if ((msg->data & (1 << kShutdownWriteCommand)) != 0) { |
| 1029 client_socket->Shutdown(SD_SEND); |
| 1030 } |
1038 } | 1031 } |
1039 } | 1032 } |
| 1033 |
| 1034 if ((msg->data & (1 << kCloseCommand)) != 0) { |
| 1035 handle->SetPortAndMask(msg->dart_port, msg->data); |
| 1036 handle->Close(); |
| 1037 } |
| 1038 |
1040 DeleteIfClosed(handle); | 1039 DeleteIfClosed(handle); |
1041 } | 1040 } |
1042 } | 1041 } |
1043 | 1042 |
1044 | 1043 |
1045 void EventHandlerImplementation::HandleAccept(ListenSocket* listen_socket, | 1044 void EventHandlerImplementation::HandleAccept(ListenSocket* listen_socket, |
1046 OverlappedBuffer* buffer) { | 1045 OverlappedBuffer* buffer) { |
1047 listen_socket->AcceptComplete(buffer, completion_port_); | 1046 listen_socket->AcceptComplete(buffer, completion_port_); |
1048 | 1047 |
1049 if (!listen_socket->IsClosing()) { | 1048 if (!listen_socket->IsClosing()) { |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1302 | 1301 |
1303 | 1302 |
1304 void EventHandlerImplementation::Shutdown() { | 1303 void EventHandlerImplementation::Shutdown() { |
1305 SendData(kShutdownId, 0, 0); | 1304 SendData(kShutdownId, 0, 0); |
1306 } | 1305 } |
1307 | 1306 |
1308 } // namespace bin | 1307 } // namespace bin |
1309 } // namespace dart | 1308 } // namespace dart |
1310 | 1309 |
1311 #endif // defined(TARGET_OS_WINDOWS) | 1310 #endif // defined(TARGET_OS_WINDOWS) |
OLD | NEW |