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

Side by Side Diff: runtime/bin/eventhandler_win.cc

Issue 85993002: Add UDP support to dart:io (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Update test Created 7 years 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 15 matching lines...) Expand all
26 26
27 static const int kBufferSize = 64 * 1024; 27 static const int kBufferSize = 64 * 1024;
28 static const int kStdOverlappedBufferSize = 16 * 1024; 28 static const int kStdOverlappedBufferSize = 16 * 1024;
29 29
30 static const int kInfinityTimeout = -1; 30 static const int kInfinityTimeout = -1;
31 static const int kTimeoutId = -1; 31 static const int kTimeoutId = -1;
32 static const int kShutdownId = -2; 32 static const int kShutdownId = -2;
33 33
34 OverlappedBuffer* OverlappedBuffer::AllocateBuffer(int buffer_size, 34 OverlappedBuffer* OverlappedBuffer::AllocateBuffer(int buffer_size,
35 Operation operation) { 35 Operation operation) {
36 int actual_size = buffer_size;
37 // For calling recvfrom additional buffer space is needed for the source
38 // address information.
39 if (operation == kRecvFrom) {
Anders Johnsen 2013/12/12 12:19:58 Move this to AllocateRecvFromBuffer?
Søren Gjesse 2013/12/12 15:44:39 Done.
40 actual_size += sizeof(socklen_t) + sizeof(struct sockaddr_storage);
Anders Johnsen 2013/12/12 12:19:58 Make the size a constant in OverlappedBuffer.
Søren Gjesse 2013/12/12 15:44:39 Done.
41 }
36 OverlappedBuffer* buffer = 42 OverlappedBuffer* buffer =
37 new(buffer_size) OverlappedBuffer(buffer_size, operation); 43 new(actual_size) OverlappedBuffer(actual_size, operation);
38 return buffer; 44 return buffer;
39 } 45 }
40 46
41 47
42 OverlappedBuffer* OverlappedBuffer::AllocateAcceptBuffer(int buffer_size) { 48 OverlappedBuffer* OverlappedBuffer::AllocateAcceptBuffer(int buffer_size) {
43 OverlappedBuffer* buffer = AllocateBuffer(buffer_size, kAccept); 49 OverlappedBuffer* buffer = AllocateBuffer(buffer_size, kAccept);
44 return buffer; 50 return buffer;
45 } 51 }
46 52
47 53
48 OverlappedBuffer* OverlappedBuffer::AllocateReadBuffer(int buffer_size) { 54 OverlappedBuffer* OverlappedBuffer::AllocateReadBuffer(int buffer_size) {
49 return AllocateBuffer(buffer_size, kRead); 55 return AllocateBuffer(buffer_size, kRead);
50 } 56 }
51 57
52 58
59 OverlappedBuffer* OverlappedBuffer::AllocateRecvFromBuffer(int buffer_size) {
60 return AllocateBuffer(buffer_size, kRecvFrom);
61 }
62
63
53 OverlappedBuffer* OverlappedBuffer::AllocateWriteBuffer(int buffer_size) { 64 OverlappedBuffer* OverlappedBuffer::AllocateWriteBuffer(int buffer_size) {
54 return AllocateBuffer(buffer_size, kWrite); 65 return AllocateBuffer(buffer_size, kWrite);
55 } 66 }
56 67
57 68
69 OverlappedBuffer* OverlappedBuffer::AllocateSendToBuffer(int buffer_size) {
70 return AllocateBuffer(buffer_size, kSendTo);
71 }
72
73
58 OverlappedBuffer* OverlappedBuffer::AllocateDisconnectBuffer() { 74 OverlappedBuffer* OverlappedBuffer::AllocateDisconnectBuffer() {
59 return AllocateBuffer(0, kDisconnect); 75 return AllocateBuffer(0, kDisconnect);
60 } 76 }
61 77
62 78
63 void OverlappedBuffer::DisposeBuffer(OverlappedBuffer* buffer) { 79 void OverlappedBuffer::DisposeBuffer(OverlappedBuffer* buffer) {
64 delete buffer; 80 delete buffer;
65 } 81 }
66 82
67 83
(...skipping 16 matching lines...) Expand all
84 100
85 int OverlappedBuffer::Write(const void* buffer, int num_bytes) { 101 int OverlappedBuffer::Write(const void* buffer, int num_bytes) {
86 ASSERT(num_bytes == buflen_); 102 ASSERT(num_bytes == buflen_);
87 memmove(GetBufferStart(), buffer, num_bytes); 103 memmove(GetBufferStart(), buffer, num_bytes);
88 data_length_ = num_bytes; 104 data_length_ = num_bytes;
89 return num_bytes; 105 return num_bytes;
90 } 106 }
91 107
92 108
93 int OverlappedBuffer::GetRemainingLength() { 109 int OverlappedBuffer::GetRemainingLength() {
94 ASSERT(operation_ == kRead); 110 ASSERT(operation_ == kRead || operation_ == kRecvFrom);
95 return data_length_ - index_; 111 return data_length_ - index_;
96 } 112 }
97 113
98 114
99 Handle::Handle(HANDLE handle) 115 Handle::Handle(HANDLE handle)
100 : handle_(reinterpret_cast<HANDLE>(handle)), 116 : handle_(reinterpret_cast<HANDLE>(handle)),
101 port_(0), 117 port_(0),
102 mask_(0), 118 mask_(0),
103 completion_port_(INVALID_HANDLE_VALUE), 119 completion_port_(INVALID_HANDLE_VALUE),
104 event_handler_(NULL), 120 event_handler_(NULL),
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 ASSERT(data_ready_ == NULL); 208 ASSERT(data_ready_ == NULL);
193 if (!IsClosing() && !buffer->IsEmpty()) { 209 if (!IsClosing() && !buffer->IsEmpty()) {
194 data_ready_ = pending_read_; 210 data_ready_ = pending_read_;
195 } else { 211 } else {
196 OverlappedBuffer::DisposeBuffer(buffer); 212 OverlappedBuffer::DisposeBuffer(buffer);
197 } 213 }
198 pending_read_ = NULL; 214 pending_read_ = NULL;
199 } 215 }
200 216
201 217
218 void Handle::RecvFromComplete(OverlappedBuffer* buffer) {
219 ReadComplete(buffer);
220 }
221
222
202 void Handle::WriteComplete(OverlappedBuffer* buffer) { 223 void Handle::WriteComplete(OverlappedBuffer* buffer) {
203 ScopedLock lock(this); 224 ScopedLock lock(this);
204 // Currently only one outstanding write at the time. 225 // Currently only one outstanding write at the time.
205 ASSERT(pending_write_ == buffer); 226 ASSERT(pending_write_ == buffer);
206 OverlappedBuffer::DisposeBuffer(buffer); 227 OverlappedBuffer::DisposeBuffer(buffer);
207 pending_write_ = NULL; 228 pending_write_ = NULL;
208 } 229 }
209 230
210 231
211 static void ReadFileThread(uword args) { 232 static void ReadFileThread(uword args) {
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 int result = dart::Thread::Start(ReadFileThread, 293 int result = dart::Thread::Start(ReadFileThread,
273 reinterpret_cast<uword>(this)); 294 reinterpret_cast<uword>(this));
274 if (result != 0) { 295 if (result != 0) {
275 FATAL1("Failed to start read file thread %d", result); 296 FATAL1("Failed to start read file thread %d", result);
276 } 297 }
277 return true; 298 return true;
278 } 299 }
279 } 300 }
280 301
281 302
303 bool Handle::IssueRecvFrom() {
304 return false;
305 }
306
307
282 bool Handle::IssueWrite() { 308 bool Handle::IssueWrite() {
283 ScopedLock lock(this); 309 ScopedLock lock(this);
284 ASSERT(type_ != kListenSocket); 310 ASSERT(type_ != kListenSocket);
285 ASSERT(completion_port_ != INVALID_HANDLE_VALUE); 311 ASSERT(completion_port_ != INVALID_HANDLE_VALUE);
286 ASSERT(pending_write_ != NULL); 312 ASSERT(pending_write_ != NULL);
287 ASSERT(pending_write_->operation() == OverlappedBuffer::kWrite); 313 ASSERT(pending_write_->operation() == OverlappedBuffer::kWrite);
288 314
289 OverlappedBuffer* buffer = pending_write_; 315 OverlappedBuffer* buffer = pending_write_;
290 BOOL ok = WriteFile(handle_, 316 BOOL ok = WriteFile(handle_,
291 buffer->GetBufferStart(), 317 buffer->GetBufferStart(),
292 buffer->GetBufferSize(), 318 buffer->GetBufferSize(),
293 NULL, 319 NULL,
294 buffer->GetCleanOverlapped()); 320 buffer->GetCleanOverlapped());
295 if (ok || GetLastError() == ERROR_IO_PENDING) { 321 if (ok || GetLastError() == ERROR_IO_PENDING) {
296 // Completing asynchronously. 322 // Completing asynchronously.
297 pending_write_ = buffer; 323 pending_write_ = buffer;
298 return true; 324 return true;
299 } 325 }
300 OverlappedBuffer::DisposeBuffer(buffer); 326 OverlappedBuffer::DisposeBuffer(buffer);
301 HandleIssueError(); 327 HandleIssueError();
302 return false; 328 return false;
303 } 329 }
304 330
305 331
332 bool Handle::IssueSendTo(struct sockaddr* sa, socklen_t sa_len) {
333 return false;
334 }
335
336
306 void Handle::HandleIssueError() { 337 void Handle::HandleIssueError() {
307 DWORD error = GetLastError(); 338 DWORD error = GetLastError();
308 if (error == ERROR_BROKEN_PIPE) { 339 if (error == ERROR_BROKEN_PIPE) {
309 event_handler_->HandleClosed(this); 340 event_handler_->HandleClosed(this);
310 } else { 341 } else {
311 event_handler_->HandleError(this); 342 event_handler_->HandleError(this);
312 } 343 }
313 SetLastError(error); 344 SetLastError(error);
314 } 345 }
315 346
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
536 if (data_ready_ == NULL) return 0; 567 if (data_ready_ == NULL) return 0;
537 num_bytes = data_ready_->Read(buffer, num_bytes); 568 num_bytes = data_ready_->Read(buffer, num_bytes);
538 if (data_ready_->IsEmpty()) { 569 if (data_ready_->IsEmpty()) {
539 OverlappedBuffer::DisposeBuffer(data_ready_); 570 OverlappedBuffer::DisposeBuffer(data_ready_);
540 data_ready_ = NULL; 571 data_ready_ = NULL;
541 } 572 }
542 return num_bytes; 573 return num_bytes;
543 } 574 }
544 575
545 576
577 int Handle::RecvFrom(
578 void* buffer, int num_bytes, struct sockaddr* sa, socklen_t sa_len) {
579 ScopedLock lock(this);
580 if (data_ready_ == NULL) return 0;
581 num_bytes = data_ready_->Read(buffer, num_bytes);
Anders Johnsen 2013/12/12 12:19:58 Will this allow us to read only a part of a UDP pa
Søren Gjesse 2013/12/12 15:44:39 It will, I changed it to dispose of the rest, so t
582 if (data_ready_->from()->sa_family == AF_INET) {
583 ASSERT(sa_len >= sizeof(struct sockaddr_in));
584 memmove(sa, data_ready_->from(), sizeof(struct sockaddr_in));
585 } else {
586 ASSERT(data_ready_->from()->sa_family == AF_INET6);
587 ASSERT(sa_len >= sizeof(struct sockaddr_in6));
588 memmove(sa, data_ready_->from(), sizeof(struct sockaddr_in6));
589 }
590 if (data_ready_->IsEmpty()) {
591 OverlappedBuffer::DisposeBuffer(data_ready_);
592 data_ready_ = NULL;
593 }
594 return num_bytes;
595 }
596
597
546 int Handle::Write(const void* buffer, int num_bytes) { 598 int Handle::Write(const void* buffer, int num_bytes) {
547 ScopedLock lock(this); 599 ScopedLock lock(this);
548 if (pending_write_ != NULL) return 0; 600 if (pending_write_ != NULL) return 0;
549 if (num_bytes > kBufferSize) num_bytes = kBufferSize; 601 if (num_bytes > kBufferSize) num_bytes = kBufferSize;
550 ASSERT(SupportsOverlappedIO()); 602 ASSERT(SupportsOverlappedIO());
551 if (completion_port_ == INVALID_HANDLE_VALUE) return 0; 603 if (completion_port_ == INVALID_HANDLE_VALUE) return 0;
552 pending_write_ = OverlappedBuffer::AllocateWriteBuffer(num_bytes); 604 pending_write_ = OverlappedBuffer::AllocateWriteBuffer(num_bytes);
553 pending_write_->Write(buffer, num_bytes); 605 pending_write_->Write(buffer, num_bytes);
554 if (!IssueWrite()) return -1; 606 if (!IssueWrite()) return -1;
555 return num_bytes; 607 return num_bytes;
556 } 608 }
557 609
558 610
611 int Handle::SendTo(
612 const void* buffer, int num_bytes, struct sockaddr* sa, socklen_t sa_len) {
613 ScopedLock lock(this);
614 if (pending_write_ != NULL) return 0;
615 if (num_bytes > kBufferSize) num_bytes = kBufferSize;
616 ASSERT(SupportsOverlappedIO());
617 if (completion_port_ == INVALID_HANDLE_VALUE) return 0;
618 pending_write_ = OverlappedBuffer::AllocateSendToBuffer(num_bytes);
619 pending_write_->Write(buffer, num_bytes);
620 if (!IssueSendTo(sa, sa_len)) return -1;
Anders Johnsen 2013/12/12 12:19:58 Can this leak the pending_write?
Søren Gjesse 2013/12/12 15:44:39 No, IssueSendTo will dispose of it before returnin
621 return num_bytes;
622 }
623
624
559 static void WriteFileThread(uword args) { 625 static void WriteFileThread(uword args) {
560 StdHandle* handle = reinterpret_cast<StdHandle*>(args); 626 StdHandle* handle = reinterpret_cast<StdHandle*>(args);
561 handle->RunWriteLoop(); 627 handle->RunWriteLoop();
562 } 628 }
563 629
564 630
565 void StdHandle::RunWriteLoop() { 631 void StdHandle::RunWriteLoop() {
566 write_monitor_->Enter(); 632 write_monitor_->Enter();
567 write_thread_running_ = true; 633 write_thread_running_ = true;
568 // Notify we have started. 634 // Notify we have started.
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 shutdown(socket(), SD_BOTH); 766 shutdown(socket(), SD_BOTH);
701 IssueDisconnect(); 767 IssueDisconnect();
702 } 768 }
703 769
704 770
705 bool ClientSocket::IssueRead() { 771 bool ClientSocket::IssueRead() {
706 ScopedLock lock(this); 772 ScopedLock lock(this);
707 ASSERT(completion_port_ != INVALID_HANDLE_VALUE); 773 ASSERT(completion_port_ != INVALID_HANDLE_VALUE);
708 ASSERT(pending_read_ == NULL); 774 ASSERT(pending_read_ == NULL);
709 775
710 OverlappedBuffer* buffer = OverlappedBuffer::AllocateReadBuffer(1024); 776 // TODO(sgjesse): Use a MTU value here. Only the loopback adapter can
777 // handle 64k datagrams.
778 OverlappedBuffer* buffer = OverlappedBuffer::AllocateReadBuffer(65536);
711 779
712 DWORD flags; 780 DWORD flags;
713 flags = 0; 781 flags = 0;
714 int rc = WSARecv(socket(), 782 int rc = WSARecv(socket(),
715 buffer->GetWASBUF(), 783 buffer->GetWASBUF(),
716 1, 784 1,
717 NULL, 785 NULL,
718 &flags, 786 &flags,
719 buffer->GetCleanOverlapped(), 787 buffer->GetCleanOverlapped(),
720 NULL); 788 NULL);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
784 CreateCompletionPort(event_handler_->completion_port()); 852 CreateCompletionPort(event_handler_->completion_port());
785 } 853 }
786 } 854 }
787 855
788 856
789 bool ClientSocket::IsClosed() { 857 bool ClientSocket::IsClosed() {
790 return false; 858 return false;
791 } 859 }
792 860
793 861
862 bool DatagramSocket::IssueSendTo(struct sockaddr* sa, socklen_t sa_len) {
863 ScopedLock lock(this);
864 ASSERT(completion_port_ != INVALID_HANDLE_VALUE);
865 ASSERT(pending_write_ != NULL);
866 ASSERT(pending_write_->operation() == OverlappedBuffer::kSendTo);
867
868 int rc = WSASendTo(socket(),
869 pending_write_->GetWASBUF(),
870 1,
871 NULL,
872 0,
873 sa,
874 sa_len,
875 pending_write_->GetCleanOverlapped(),
876 NULL);
877 if (rc == NO_ERROR || WSAGetLastError() == WSA_IO_PENDING) {
878 return true;
879 }
880 OverlappedBuffer::DisposeBuffer(pending_write_);
881 pending_write_ = NULL;
882 HandleIssueError();
883 return false;
884 }
885
886
887 bool DatagramSocket::IssueRecvFrom() {
888 ScopedLock lock(this);
889 ASSERT(completion_port_ != INVALID_HANDLE_VALUE);
890 ASSERT(pending_read_ == NULL);
891
892 OverlappedBuffer* buffer = OverlappedBuffer::AllocateRecvFromBuffer(1024);
893
894 DWORD flags;
895 flags = 0;
896 int len;
897 int rc = WSARecvFrom(socket(),
898 buffer->GetWASBUF(),
899 1,
900 NULL,
901 &flags,
902 buffer->from(),
903 buffer->from_len_addr(),
904 buffer->GetCleanOverlapped(),
905 NULL);
906 if (rc == NO_ERROR || WSAGetLastError() == WSA_IO_PENDING) {
907 pending_read_ = buffer;
908 return true;
909 }
910 OverlappedBuffer::DisposeBuffer(buffer);
911 pending_read_ = NULL;
912 HandleIssueError();
913 return false;
914 }
915
916
917 void DatagramSocket::EnsureInitialized(
918 EventHandlerImplementation* event_handler) {
919 ScopedLock lock(this);
920 if (completion_port_ == INVALID_HANDLE_VALUE) {
921 ASSERT(event_handler_ == NULL);
922 event_handler_ = event_handler;
923 CreateCompletionPort(event_handler_->completion_port());
924 }
925 }
926
927
928 bool DatagramSocket::IsClosed() {
929 return IsClosing() && !HasPendingRead() && !HasPendingWrite();
930 }
931
932
933 void DatagramSocket::DoClose() {
934 // Just close the socket. This will cause any queued requests to be aborted.
935 closesocket(socket());
936 MarkClosedRead();
937 MarkClosedWrite();
938 }
939
940
794 static void DeleteIfClosed(Handle* handle) { 941 static void DeleteIfClosed(Handle* handle) {
795 if (handle->IsClosed()) { 942 if (handle->IsClosed()) {
796 Dart_Port port = handle->port(); 943 Dart_Port port = handle->port();
797 delete handle; 944 delete handle;
798 DartUtils::PostInt32(port, 1 << kDestroyedEvent); 945 DartUtils::PostInt32(port, 1 << kDestroyedEvent);
799 } 946 }
800 } 947 }
801 948
802 949
803 void EventHandlerImplementation::HandleInterrupt(InterruptMessage* msg) { 950 void EventHandlerImplementation::HandleInterrupt(InterruptMessage* msg) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
851 // for read. 998 // for read.
852 if ((msg->data & (1 << kInEvent)) != 0) { 999 if ((msg->data & (1 << kInEvent)) != 0) {
853 if (handle->Available() > 0) { 1000 if (handle->Available() > 0) {
854 int event_mask = (1 << kInEvent); 1001 int event_mask = (1 << kInEvent);
855 handle->set_mask(handle->mask() & ~event_mask); 1002 handle->set_mask(handle->mask() & ~event_mask);
856 DartUtils::PostInt32(handle->port(), event_mask); 1003 DartUtils::PostInt32(handle->port(), event_mask);
857 } else if (handle->IsClosedRead()) { 1004 } else if (handle->IsClosedRead()) {
858 int event_mask = (1 << kCloseEvent); 1005 int event_mask = (1 << kCloseEvent);
859 DartUtils::PostInt32(handle->port(), event_mask); 1006 DartUtils::PostInt32(handle->port(), event_mask);
860 } else if (!handle->HasPendingRead()) { 1007 } else if (!handle->HasPendingRead()) {
861 handle->IssueRead(); 1008 if (handle->is_datagram_socket()) {
1009 handle->IssueRecvFrom();
1010 } else {
1011 handle->IssueRead();
1012 }
862 } 1013 }
863 } 1014 }
864 1015
865 // If out events (can write events) have been requested, and there 1016 // If out events (can write events) have been requested, and there
866 // are no pending writes, post an out event immediately. 1017 // are no pending writes, post an out event immediately.
867 if ((msg->data & (1 << kOutEvent)) != 0) { 1018 if ((msg->data & (1 << kOutEvent)) != 0) {
868 if (!handle->HasPendingWrite()) { 1019 if (!handle->HasPendingWrite()) {
869 int event_mask = (1 << kOutEvent); 1020 int event_mask = (1 << kOutEvent);
870 handle->set_mask(handle->mask() & ~event_mask); 1021 handle->set_mask(handle->mask() & ~event_mask);
871 DartUtils::PostInt32(handle->port(), event_mask); 1022 DartUtils::PostInt32(handle->port(), event_mask);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
946 HandleClosed(handle); 1097 HandleClosed(handle);
947 } else { 1098 } else {
948 HandleError(handle); 1099 HandleError(handle);
949 } 1100 }
950 } 1101 }
951 1102
952 DeleteIfClosed(handle); 1103 DeleteIfClosed(handle);
953 } 1104 }
954 1105
955 1106
1107 void EventHandlerImplementation::HandleRecvFrom(Handle* handle,
1108 int bytes,
1109 OverlappedBuffer* buffer) {
1110 ASSERT(handle->is_datagram_socket());
1111 buffer->set_data_length(bytes);
1112 handle->ReadComplete(buffer);
1113 if (!handle->IsClosing()) {
1114 int event_mask = 1 << kInEvent;
1115 if ((handle->mask() & event_mask) != 0) {
1116 DartUtils::PostInt32(handle->port(), event_mask);
1117 }
1118 }
1119
1120 DeleteIfClosed(handle);
1121 }
1122
1123
956 void EventHandlerImplementation::HandleWrite(Handle* handle, 1124 void EventHandlerImplementation::HandleWrite(Handle* handle,
957 int bytes, 1125 int bytes,
958 OverlappedBuffer* buffer) { 1126 OverlappedBuffer* buffer) {
959 handle->WriteComplete(buffer); 1127 handle->WriteComplete(buffer);
960 1128
961 if (bytes > 0) { 1129 if (bytes > 0) {
962 if (!handle->IsError() && !handle->IsClosing()) { 1130 if (!handle->IsError() && !handle->IsClosing()) {
963 int event_mask = 1 << kOutEvent; 1131 int event_mask = 1 << kOutEvent;
964 if ((handle->mask() & event_mask) != 0) { 1132 if ((handle->mask() & event_mask) != 0) {
965 DartUtils::PostInt32(handle->port(), event_mask); 1133 DartUtils::PostInt32(handle->port(), event_mask);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
997 case OverlappedBuffer::kAccept: { 1165 case OverlappedBuffer::kAccept: {
998 ListenSocket* listen_socket = reinterpret_cast<ListenSocket*>(key); 1166 ListenSocket* listen_socket = reinterpret_cast<ListenSocket*>(key);
999 HandleAccept(listen_socket, buffer); 1167 HandleAccept(listen_socket, buffer);
1000 break; 1168 break;
1001 } 1169 }
1002 case OverlappedBuffer::kRead: { 1170 case OverlappedBuffer::kRead: {
1003 Handle* handle = reinterpret_cast<Handle*>(key); 1171 Handle* handle = reinterpret_cast<Handle*>(key);
1004 HandleRead(handle, bytes, buffer); 1172 HandleRead(handle, bytes, buffer);
1005 break; 1173 break;
1006 } 1174 }
1007 case OverlappedBuffer::kWrite: { 1175 case OverlappedBuffer::kRecvFrom: {
1176 Handle* handle = reinterpret_cast<Handle*>(key);
1177 HandleRecvFrom(handle, bytes, buffer);
1178 break;
1179 }
1180 case OverlappedBuffer::kWrite:
1181 case OverlappedBuffer::kSendTo: {
1008 Handle* handle = reinterpret_cast<Handle*>(key); 1182 Handle* handle = reinterpret_cast<Handle*>(key);
1009 HandleWrite(handle, bytes, buffer); 1183 HandleWrite(handle, bytes, buffer);
1010 break; 1184 break;
1011 } 1185 }
1012 case OverlappedBuffer::kDisconnect: { 1186 case OverlappedBuffer::kDisconnect: {
1013 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(key); 1187 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(key);
1014 HandleDisconnect(client_socket, bytes, buffer); 1188 HandleDisconnect(client_socket, bytes, buffer);
1015 break; 1189 break;
1016 } 1190 }
1017 default: 1191 default:
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1094 // ERROR_NETNAME_DELETED occurs when the client closes 1268 // ERROR_NETNAME_DELETED occurs when the client closes
1095 // the socket it is reading from. 1269 // the socket it is reading from.
1096 DWORD last_error = GetLastError(); 1270 DWORD last_error = GetLastError();
1097 if (last_error == ERROR_CONNECTION_ABORTED || 1271 if (last_error == ERROR_CONNECTION_ABORTED ||
1098 last_error == ERROR_OPERATION_ABORTED || 1272 last_error == ERROR_OPERATION_ABORTED ||
1099 last_error == ERROR_NETNAME_DELETED || 1273 last_error == ERROR_NETNAME_DELETED ||
1100 last_error == ERROR_BROKEN_PIPE) { 1274 last_error == ERROR_BROKEN_PIPE) {
1101 ASSERT(bytes == 0); 1275 ASSERT(bytes == 0);
1102 handler_impl->HandleIOCompletion(bytes, key, overlapped); 1276 handler_impl->HandleIOCompletion(bytes, key, overlapped);
1103 } else { 1277 } else {
1278 OverlappedBuffer* buffer =
Anders Johnsen 2013/12/12 12:19:58 Unused?
Søren Gjesse 2013/12/12 15:44:39 Yes, removed.
1279 OverlappedBuffer::GetFromOverlapped(overlapped);
1104 ASSERT(bytes == 0); 1280 ASSERT(bytes == 0);
1105 handler_impl->HandleIOCompletion(-1, key, overlapped); 1281 handler_impl->HandleIOCompletion(-1, key, overlapped);
1106 } 1282 }
1107 } else if (key == NULL) { 1283 } else if (key == NULL) {
1108 // A key of NULL signals an interrupt message. 1284 // A key of NULL signals an interrupt message.
1109 InterruptMessage* msg = reinterpret_cast<InterruptMessage*>(overlapped); 1285 InterruptMessage* msg = reinterpret_cast<InterruptMessage*>(overlapped);
1110 handler_impl->HandleInterrupt(msg); 1286 handler_impl->HandleInterrupt(msg);
1111 delete msg; 1287 delete msg;
1112 } else { 1288 } else {
1113 handler_impl->HandleIOCompletion(bytes, key, overlapped); 1289 handler_impl->HandleIOCompletion(bytes, key, overlapped);
(...skipping 18 matching lines...) Expand all
1132 1308
1133 1309
1134 void EventHandlerImplementation::Shutdown() { 1310 void EventHandlerImplementation::Shutdown() {
1135 SendData(kShutdownId, 0, 0); 1311 SendData(kShutdownId, 0, 0);
1136 } 1312 }
1137 1313
1138 } // namespace bin 1314 } // namespace bin
1139 } // namespace dart 1315 } // namespace dart
1140 1316
1141 #endif // defined(TARGET_OS_WINDOWS) 1317 #endif // defined(TARGET_OS_WINDOWS)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698