OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/socket/tcp_client_socket_win.h" | 5 #include "net/socket/tcp_client_socket_win.h" |
6 | 6 |
7 #include <mstcpip.h> | 7 #include <mstcpip.h> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
(...skipping 10 matching lines...) Expand all Loading... | |
21 #include "net/base/network_change_notifier.h" | 21 #include "net/base/network_change_notifier.h" |
22 #include "net/base/winsock_init.h" | 22 #include "net/base/winsock_init.h" |
23 #include "net/base/winsock_util.h" | 23 #include "net/base/winsock_util.h" |
24 #include "net/socket/socket_net_log_params.h" | 24 #include "net/socket/socket_net_log_params.h" |
25 | 25 |
26 namespace net { | 26 namespace net { |
27 | 27 |
28 namespace { | 28 namespace { |
29 | 29 |
30 const int kTCPKeepAliveSeconds = 45; | 30 const int kTCPKeepAliveSeconds = 45; |
31 bool g_disable_overlapped_reads = false; | |
31 | 32 |
32 bool SetSocketReceiveBufferSize(SOCKET socket, int32 size) { | 33 bool SetSocketReceiveBufferSize(SOCKET socket, int32 size) { |
33 int rv = setsockopt(socket, SOL_SOCKET, SO_RCVBUF, | 34 int rv = setsockopt(socket, SOL_SOCKET, SO_RCVBUF, |
34 reinterpret_cast<const char*>(&size), sizeof(size)); | 35 reinterpret_cast<const char*>(&size), sizeof(size)); |
35 DCHECK(!rv) << "Could not set socket receive buffer size: " << GetLastError(); | 36 DCHECK(!rv) << "Could not set socket receive buffer size: " << GetLastError(); |
36 return rv == 0; | 37 return rv == 0; |
37 } | 38 } |
38 | 39 |
39 bool SetSocketSendBufferSize(SOCKET socket, int32 size) { | 40 bool SetSocketSendBufferSize(SOCKET socket, int32 size) { |
40 int rv = setsockopt(socket, SOL_SOCKET, SO_SNDBUF, | 41 int rv = setsockopt(socket, SOL_SOCKET, SO_SNDBUF, |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
184 | 185 |
185 // The separate OVERLAPPED variables for asynchronous operation. | 186 // The separate OVERLAPPED variables for asynchronous operation. |
186 // |read_overlapped_| is used for both Connect() and Read(). | 187 // |read_overlapped_| is used for both Connect() and Read(). |
187 // |write_overlapped_| is only used for Write(); | 188 // |write_overlapped_| is only used for Write(); |
188 OVERLAPPED read_overlapped_; | 189 OVERLAPPED read_overlapped_; |
189 OVERLAPPED write_overlapped_; | 190 OVERLAPPED write_overlapped_; |
190 | 191 |
191 // The buffers used in Read() and Write(). | 192 // The buffers used in Read() and Write(). |
192 scoped_refptr<IOBuffer> read_iobuffer_; | 193 scoped_refptr<IOBuffer> read_iobuffer_; |
193 scoped_refptr<IOBuffer> write_iobuffer_; | 194 scoped_refptr<IOBuffer> write_iobuffer_; |
195 int read_buffer_length_; | |
194 int write_buffer_length_; | 196 int write_buffer_length_; |
195 | 197 |
196 // Throttle the read size based on our current slow start state. | 198 // Throttle the read size based on our current slow start state. |
197 // Returns the throttled read size. | 199 // Returns the throttled read size. |
198 int ThrottleReadSize(int size) { | 200 int ThrottleReadSize(int size) { |
199 if (slow_start_throttle_ < kMaxSlowStartThrottle) { | 201 if (slow_start_throttle_ < kMaxSlowStartThrottle) { |
200 size = std::min(size, slow_start_throttle_); | 202 size = std::min(size, slow_start_throttle_); |
201 slow_start_throttle_ *= 2; | 203 slow_start_throttle_ *= 2; |
202 } | 204 } |
203 return size; | 205 return size; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
251 static const int kInitialSlowStartThrottle = 1 * 1024; | 253 static const int kInitialSlowStartThrottle = 1 * 1024; |
252 static const int kMaxSlowStartThrottle = 32 * kInitialSlowStartThrottle; | 254 static const int kMaxSlowStartThrottle = 32 * kInitialSlowStartThrottle; |
253 int slow_start_throttle_; | 255 int slow_start_throttle_; |
254 | 256 |
255 DISALLOW_COPY_AND_ASSIGN(Core); | 257 DISALLOW_COPY_AND_ASSIGN(Core); |
256 }; | 258 }; |
257 | 259 |
258 TCPClientSocketWin::Core::Core( | 260 TCPClientSocketWin::Core::Core( |
259 TCPClientSocketWin* socket) | 261 TCPClientSocketWin* socket) |
260 : write_buffer_length_(0), | 262 : write_buffer_length_(0), |
263 read_buffer_length_(0), | |
261 socket_(socket), | 264 socket_(socket), |
262 ALLOW_THIS_IN_INITIALIZER_LIST(reader_(this)), | 265 ALLOW_THIS_IN_INITIALIZER_LIST(reader_(this)), |
263 ALLOW_THIS_IN_INITIALIZER_LIST(writer_(this)), | 266 ALLOW_THIS_IN_INITIALIZER_LIST(writer_(this)), |
264 slow_start_throttle_(kInitialSlowStartThrottle) { | 267 slow_start_throttle_(kInitialSlowStartThrottle) { |
265 memset(&read_overlapped_, 0, sizeof(read_overlapped_)); | 268 memset(&read_overlapped_, 0, sizeof(read_overlapped_)); |
266 memset(&write_overlapped_, 0, sizeof(write_overlapped_)); | 269 memset(&write_overlapped_, 0, sizeof(write_overlapped_)); |
267 | 270 |
268 read_overlapped_.hEvent = WSACreateEvent(); | 271 read_overlapped_.hEvent = WSACreateEvent(); |
269 write_overlapped_.hEvent = WSACreateEvent(); | 272 write_overlapped_.hEvent = WSACreateEvent(); |
270 } | 273 } |
(...skipping 23 matching lines...) Expand all Loading... | |
294 write_watcher_.StartWatching(write_overlapped_.hEvent, &writer_); | 297 write_watcher_.StartWatching(write_overlapped_.hEvent, &writer_); |
295 } | 298 } |
296 | 299 |
297 void TCPClientSocketWin::Core::ReadDelegate::OnObjectSignaled( | 300 void TCPClientSocketWin::Core::ReadDelegate::OnObjectSignaled( |
298 HANDLE object) { | 301 HANDLE object) { |
299 DCHECK_EQ(object, core_->read_overlapped_.hEvent); | 302 DCHECK_EQ(object, core_->read_overlapped_.hEvent); |
300 if (core_->socket_) { | 303 if (core_->socket_) { |
301 if (core_->socket_->waiting_connect()) { | 304 if (core_->socket_->waiting_connect()) { |
302 core_->socket_->DidCompleteConnect(); | 305 core_->socket_->DidCompleteConnect(); |
303 } else { | 306 } else { |
304 core_->socket_->DidCompleteRead(); | 307 if (g_disable_overlapped_reads) { |
Ryan Sleevi
2012/10/12 18:53:13
BUG? What happens if overlapped reads are disabled
pmeenan
2012/10/17 15:12:31
Done.
| |
308 core_->socket_->DidSignalRead(); | |
309 } else { | |
310 core_->socket_->DidCompleteRead(); | |
311 } | |
305 } | 312 } |
306 } | 313 } |
307 | 314 |
308 core_->Release(); | 315 core_->Release(); |
309 } | 316 } |
310 | 317 |
311 void TCPClientSocketWin::Core::WriteDelegate::OnObjectSignaled( | 318 void TCPClientSocketWin::Core::WriteDelegate::OnObjectSignaled( |
312 HANDLE object) { | 319 HANDLE object) { |
313 DCHECK_EQ(object, core_->write_overlapped_.hEvent); | 320 DCHECK_EQ(object, core_->write_overlapped_.hEvent); |
314 if (core_->socket_) | 321 if (core_->socket_) |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
347 DCHECK_EQ(socket_, INVALID_SOCKET); | 354 DCHECK_EQ(socket_, INVALID_SOCKET); |
348 | 355 |
349 int error = SetupSocket(socket); | 356 int error = SetupSocket(socket); |
350 if (error) | 357 if (error) |
351 return MapSystemError(error); | 358 return MapSystemError(error); |
352 | 359 |
353 socket_ = socket; | 360 socket_ = socket; |
354 SetNonBlocking(socket_); | 361 SetNonBlocking(socket_); |
355 | 362 |
356 core_ = new Core(this); | 363 core_ = new Core(this); |
364 if (g_disable_overlapped_reads) { | |
365 WSAEventSelect(socket_, core_->read_overlapped_.hEvent, | |
366 FD_READ | FD_CLOSE); | |
367 } | |
357 | 368 |
358 current_address_index_ = 0; | 369 current_address_index_ = 0; |
359 use_history_.set_was_ever_connected(); | 370 use_history_.set_was_ever_connected(); |
360 | 371 |
361 return OK; | 372 return OK; |
362 } | 373 } |
363 | 374 |
364 int TCPClientSocketWin::Bind(const IPEndPoint& address) { | 375 int TCPClientSocketWin::Bind(const IPEndPoint& address) { |
365 if (current_address_index_ >= 0 || bind_address_.get()) { | 376 if (current_address_index_ >= 0 || bind_address_.get()) { |
366 // Cannot bind the socket if we are already connected or connecting. | 377 // Cannot bind the socket if we are already connected or connecting. |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
478 return ERR_INVALID_ARGUMENT; | 489 return ERR_INVALID_ARGUMENT; |
479 if (bind(socket_, storage.addr, storage.addr_len)) | 490 if (bind(socket_, storage.addr, storage.addr_len)) |
480 return MapSystemError(errno); | 491 return MapSystemError(errno); |
481 } | 492 } |
482 } | 493 } |
483 | 494 |
484 DCHECK(!core_); | 495 DCHECK(!core_); |
485 core_ = new Core(this); | 496 core_ = new Core(this); |
486 // WSAEventSelect sets the socket to non-blocking mode as a side effect. | 497 // WSAEventSelect sets the socket to non-blocking mode as a side effect. |
487 // Our connect() and recv() calls require that the socket be non-blocking. | 498 // Our connect() and recv() calls require that the socket be non-blocking. |
488 WSAEventSelect(socket_, core_->read_overlapped_.hEvent, FD_CONNECT); | 499 if (g_disable_overlapped_reads) { |
500 WSAEventSelect(socket_, core_->read_overlapped_.hEvent, | |
501 FD_CONNECT | FD_READ | FD_CLOSE); | |
502 } else { | |
503 WSAEventSelect(socket_, core_->read_overlapped_.hEvent, FD_CONNECT); | |
504 } | |
489 | 505 |
490 SockaddrStorage storage; | 506 SockaddrStorage storage; |
491 if (!endpoint.ToSockAddr(storage.addr, &storage.addr_len)) | 507 if (!endpoint.ToSockAddr(storage.addr, &storage.addr_len)) |
492 return ERR_INVALID_ARGUMENT; | 508 return ERR_INVALID_ARGUMENT; |
493 connect_start_time_ = base::TimeTicks::Now(); | 509 connect_start_time_ = base::TimeTicks::Now(); |
494 if (!connect(socket_, storage.addr, storage.addr_len)) { | 510 if (!connect(socket_, storage.addr, storage.addr_len)) { |
495 // Connected without waiting! | 511 // Connected without waiting! |
496 // | 512 // |
497 // The MSDN page for connect says: | 513 // The MSDN page for connect says: |
498 // With a nonblocking socket, the connection attempt cannot be completed | 514 // With a nonblocking socket, the connection attempt cannot be completed |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
704 | 720 |
705 int TCPClientSocketWin::Read(IOBuffer* buf, | 721 int TCPClientSocketWin::Read(IOBuffer* buf, |
706 int buf_len, | 722 int buf_len, |
707 const CompletionCallback& callback) { | 723 const CompletionCallback& callback) { |
708 DCHECK(CalledOnValidThread()); | 724 DCHECK(CalledOnValidThread()); |
709 DCHECK_NE(socket_, INVALID_SOCKET); | 725 DCHECK_NE(socket_, INVALID_SOCKET); |
710 DCHECK(!waiting_read_); | 726 DCHECK(!waiting_read_); |
711 DCHECK(read_callback_.is_null()); | 727 DCHECK(read_callback_.is_null()); |
712 DCHECK(!core_->read_iobuffer_); | 728 DCHECK(!core_->read_iobuffer_); |
713 | 729 |
714 buf_len = core_->ThrottleReadSize(buf_len); | 730 if (g_disable_overlapped_reads) { |
715 | 731 int flags = 0; |
716 WSABUF read_buffer; | 732 int rv = recv(socket_, buf->data(), buf_len, flags); |
717 read_buffer.len = buf_len; | 733 if (rv == SOCKET_ERROR) { |
718 read_buffer.buf = buf->data(); | 734 int os_error = WSAGetLastError(); |
719 | 735 if (os_error != WSAEWOULDBLOCK) { |
720 // TODO(wtc): Remove the assertion after enough testing. | 736 int net_error = MapSystemError(os_error); |
721 AssertEventNotSignaled(core_->read_overlapped_.hEvent); | 737 net_log_.AddEvent(NetLog::TYPE_SOCKET_READ_ERROR, |
722 DWORD num, flags = 0; | 738 CreateNetLogSocketErrorCallback(net_error, os_error)); |
723 int rv = WSARecv(socket_, &read_buffer, 1, &num, &flags, | 739 return net_error; |
724 &core_->read_overlapped_, NULL); | 740 } |
725 if (rv == 0) { | 741 } else { |
726 if (ResetEventIfSignaled(core_->read_overlapped_.hEvent)) { | |
727 base::StatsCounter read_bytes("tcp.read_bytes"); | 742 base::StatsCounter read_bytes("tcp.read_bytes"); |
728 read_bytes.Add(num); | 743 if (rv > 0) { |
729 num_bytes_read_ += num; | |
730 if (num > 0) | |
731 use_history_.set_was_used_to_convey_data(); | 744 use_history_.set_was_used_to_convey_data(); |
732 net_log_.AddByteTransferEvent(NetLog::TYPE_SOCKET_BYTES_RECEIVED, num, | 745 read_bytes.Add(rv); |
746 num_bytes_read_ += rv; | |
747 } | |
748 net_log_.AddByteTransferEvent(NetLog::TYPE_SOCKET_BYTES_RECEIVED, rv, | |
733 buf->data()); | 749 buf->data()); |
734 return static_cast<int>(num); | 750 return rv; |
735 } | 751 } |
736 } else { | 752 } else { |
737 int os_error = WSAGetLastError(); | 753 buf_len = core_->ThrottleReadSize(buf_len); |
738 if (os_error != WSA_IO_PENDING) { | 754 |
739 int net_error = MapSystemError(os_error); | 755 WSABUF read_buffer; |
740 net_log_.AddEvent(NetLog::TYPE_SOCKET_READ_ERROR, | 756 read_buffer.len = buf_len; |
741 CreateNetLogSocketErrorCallback(net_error, os_error)); | 757 read_buffer.buf = buf->data(); |
742 return net_error; | 758 |
759 // TODO(wtc): Remove the assertion after enough testing. | |
760 AssertEventNotSignaled(core_->read_overlapped_.hEvent); | |
761 DWORD num, flags = 0; | |
762 int rv = WSARecv(socket_, &read_buffer, 1, &num, &flags, | |
763 &core_->read_overlapped_, NULL); | |
764 if (rv == 0) { | |
765 if (ResetEventIfSignaled(core_->read_overlapped_.hEvent)) { | |
766 base::StatsCounter read_bytes("tcp.read_bytes"); | |
767 read_bytes.Add(num); | |
768 num_bytes_read_ += num; | |
769 if (num > 0) | |
770 use_history_.set_was_used_to_convey_data(); | |
771 net_log_.AddByteTransferEvent(NetLog::TYPE_SOCKET_BYTES_RECEIVED, num, | |
772 buf->data()); | |
773 return static_cast<int>(num); | |
774 } | |
775 } else { | |
776 int os_error = WSAGetLastError(); | |
777 if (os_error != WSA_IO_PENDING) { | |
778 int net_error = MapSystemError(os_error); | |
779 net_log_.AddEvent(NetLog::TYPE_SOCKET_READ_ERROR, | |
780 CreateNetLogSocketErrorCallback(net_error, os_error)); | |
781 return net_error; | |
782 } | |
743 } | 783 } |
744 } | 784 } |
745 core_->WatchForRead(); | 785 |
746 waiting_read_ = true; | 786 waiting_read_ = true; |
747 read_callback_ = callback; | 787 read_callback_ = callback; |
748 core_->read_iobuffer_ = buf; | 788 core_->read_iobuffer_ = buf; |
789 core_->read_buffer_length_ = buf_len; | |
790 core_->WatchForRead(); | |
749 return ERR_IO_PENDING; | 791 return ERR_IO_PENDING; |
750 } | 792 } |
751 | 793 |
752 int TCPClientSocketWin::Write(IOBuffer* buf, | 794 int TCPClientSocketWin::Write(IOBuffer* buf, |
753 int buf_len, | 795 int buf_len, |
754 const CompletionCallback& callback) { | 796 const CompletionCallback& callback) { |
755 DCHECK(CalledOnValidThread()); | 797 DCHECK(CalledOnValidThread()); |
756 DCHECK_NE(socket_, INVALID_SOCKET); | 798 DCHECK_NE(socket_, INVALID_SOCKET); |
757 DCHECK(!waiting_write_); | 799 DCHECK(!waiting_write_); |
758 DCHECK(write_callback_.is_null()); | 800 DCHECK(write_callback_.is_null()); |
759 DCHECK_GT(buf_len, 0); | 801 DCHECK_GT(buf_len, 0); |
760 DCHECK(!core_->write_iobuffer_); | 802 DCHECK(!core_->write_iobuffer_); |
761 | 803 |
762 base::StatsCounter writes("tcp.writes"); | 804 base::StatsCounter writes("tcp.writes"); |
763 writes.Increment(); | 805 writes.Increment(); |
764 | 806 |
765 WSABUF write_buffer; | 807 WSABUF write_buffer; |
766 write_buffer.len = buf_len; | 808 write_buffer.len = buf_len; |
767 write_buffer.buf = buf->data(); | 809 write_buffer.buf = buf->data(); |
768 core_->write_buffer_length_ = buf_len; | |
769 | 810 |
770 // TODO(wtc): Remove the assertion after enough testing. | 811 // TODO(wtc): Remove the assertion after enough testing. |
771 AssertEventNotSignaled(core_->write_overlapped_.hEvent); | 812 AssertEventNotSignaled(core_->write_overlapped_.hEvent); |
772 DWORD num; | 813 DWORD num; |
773 int rv = WSASend(socket_, &write_buffer, 1, &num, 0, | 814 int rv = WSASend(socket_, &write_buffer, 1, &num, 0, |
774 &core_->write_overlapped_, NULL); | 815 &core_->write_overlapped_, NULL); |
775 if (rv == 0) { | 816 if (rv == 0) { |
776 if (ResetEventIfSignaled(core_->write_overlapped_.hEvent)) { | 817 if (ResetEventIfSignaled(core_->write_overlapped_.hEvent)) { |
777 rv = static_cast<int>(num); | 818 rv = static_cast<int>(num); |
778 if (rv > buf_len || rv < 0) { | 819 if (rv > buf_len || rv < 0) { |
(...skipping 13 matching lines...) Expand all Loading... | |
792 } | 833 } |
793 } else { | 834 } else { |
794 int os_error = WSAGetLastError(); | 835 int os_error = WSAGetLastError(); |
795 if (os_error != WSA_IO_PENDING) { | 836 if (os_error != WSA_IO_PENDING) { |
796 int net_error = MapSystemError(os_error); | 837 int net_error = MapSystemError(os_error); |
797 net_log_.AddEvent(NetLog::TYPE_SOCKET_WRITE_ERROR, | 838 net_log_.AddEvent(NetLog::TYPE_SOCKET_WRITE_ERROR, |
798 CreateNetLogSocketErrorCallback(net_error, os_error)); | 839 CreateNetLogSocketErrorCallback(net_error, os_error)); |
799 return net_error; | 840 return net_error; |
800 } | 841 } |
801 } | 842 } |
802 core_->WatchForWrite(); | |
803 waiting_write_ = true; | 843 waiting_write_ = true; |
804 write_callback_ = callback; | 844 write_callback_ = callback; |
805 core_->write_iobuffer_ = buf; | 845 core_->write_iobuffer_ = buf; |
846 core_->write_buffer_length_ = buf_len; | |
847 core_->WatchForWrite(); | |
806 return ERR_IO_PENDING; | 848 return ERR_IO_PENDING; |
807 } | 849 } |
808 | 850 |
809 bool TCPClientSocketWin::SetReceiveBufferSize(int32 size) { | 851 bool TCPClientSocketWin::SetReceiveBufferSize(int32 size) { |
810 DCHECK(CalledOnValidThread()); | 852 DCHECK(CalledOnValidThread()); |
811 return SetSocketReceiveBufferSize(socket_, size); | 853 return SetSocketReceiveBufferSize(socket_, size); |
812 } | 854 } |
813 | 855 |
814 bool TCPClientSocketWin::SetSendBufferSize(int32 size) { | 856 bool TCPClientSocketWin::SetSendBufferSize(int32 size) { |
815 DCHECK(CalledOnValidThread()); | 857 DCHECK(CalledOnValidThread()); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
893 } | 935 } |
894 | 936 |
895 connect_os_error_ = os_error; | 937 connect_os_error_ = os_error; |
896 rv = DoConnectLoop(result); | 938 rv = DoConnectLoop(result); |
897 if (rv != ERR_IO_PENDING) { | 939 if (rv != ERR_IO_PENDING) { |
898 LogConnectCompletion(rv); | 940 LogConnectCompletion(rv); |
899 DoReadCallback(rv); | 941 DoReadCallback(rv); |
900 } | 942 } |
901 } | 943 } |
902 | 944 |
945 void TCPClientSocketWin::DidSignalRead() { | |
Ryan Sleevi
2012/10/12 18:53:13
style nit: The order in the implementation should
pmeenan
2012/10/17 15:12:31
Done.
| |
946 DCHECK(waiting_read_); | |
947 int rv; | |
948 int os_error = 0, flags = 0; | |
Ryan Sleevi
2012/10/12 18:53:13
style nit: Chromium style is to have one variable
pmeenan
2012/10/17 15:12:31
Done.
| |
949 WSANETWORKEVENTS network_events; | |
950 rv = WSAEnumNetworkEvents(socket_, core_->read_overlapped_.hEvent, | |
951 &network_events); | |
Ryan Sleevi
2012/10/12 18:53:13
style nit: whitespace
pmeenan
2012/10/17 15:12:31
Done.
| |
952 if (rv != SOCKET_ERROR) { | |
rvargas (doing something else)
2012/10/13 03:34:06
nit: invert the order if the condition.
pmeenan
2012/10/17 15:12:31
Done.
| |
953 if (network_events.lNetworkEvents & FD_READ) { | |
954 rv = recv(socket_, core_->read_iobuffer_->data(), | |
955 core_->read_buffer_length_, flags); | |
956 if (rv == SOCKET_ERROR) { | |
957 os_error = WSAGetLastError(); | |
958 if (os_error == WSAEWOULDBLOCK) { | |
959 core_->WatchForRead(); | |
960 return; | |
961 } else { | |
962 rv = MapSystemError(os_error); | |
963 } | |
964 } | |
965 } else { | |
966 core_->WatchForRead(); | |
Ryan Sleevi
2012/10/12 18:53:13
Do you also need to be watching for FD_CLOSE? Will
pmeenan
2012/10/17 15:12:31
Added the FD_CLOSE handling. FD_READ does not get
| |
967 return; | |
968 } | |
969 } else { | |
970 os_error = WSAGetLastError(); | |
971 rv = MapSystemError(os_error); | |
972 } | |
973 if (rv > 0) { | |
974 base::StatsCounter read_bytes("tcp.read_bytes"); | |
rvargas (doing something else)
2012/10/13 03:34:06
This block logically follows the recv call so it w
pmeenan
2012/10/17 15:12:31
This got a lot cleaner when I cleaned it up and it
| |
975 if (rv > 0) { | |
976 use_history_.set_was_used_to_convey_data(); | |
977 read_bytes.Add(rv); | |
978 num_bytes_read_ += rv; | |
979 } | |
980 net_log_.AddByteTransferEvent(NetLog::TYPE_SOCKET_BYTES_RECEIVED, rv, | |
981 core_->read_iobuffer_->data()); | |
982 } else { | |
983 rv = MapSystemError(os_error); | |
rvargas (doing something else)
2012/10/13 03:34:06
nit: It's a little funky that we can end up here w
pmeenan
2012/10/17 15:12:31
Should be a lot cleaner now.
| |
984 net_log_.AddEvent(NetLog::TYPE_SOCKET_READ_ERROR, | |
985 CreateNetLogSocketErrorCallback(rv, os_error)); | |
986 } | |
987 waiting_read_ = false; | |
988 core_->read_iobuffer_ = NULL; | |
989 core_->read_buffer_length_ = 0; | |
990 DoReadCallback(rv); | |
991 } | |
992 | |
903 void TCPClientSocketWin::DidCompleteRead() { | 993 void TCPClientSocketWin::DidCompleteRead() { |
904 DCHECK(waiting_read_); | 994 DCHECK(waiting_read_); |
905 DWORD num_bytes, flags; | 995 DWORD num_bytes, flags; |
906 BOOL ok = WSAGetOverlappedResult(socket_, &core_->read_overlapped_, | 996 BOOL ok = WSAGetOverlappedResult(socket_, &core_->read_overlapped_, |
907 &num_bytes, FALSE, &flags); | 997 &num_bytes, FALSE, &flags); |
908 WSAResetEvent(core_->read_overlapped_.hEvent); | 998 WSAResetEvent(core_->read_overlapped_.hEvent); |
909 waiting_read_ = false; | 999 waiting_read_ = false; |
910 int rv; | 1000 int rv; |
911 if (ok) { | 1001 if (ok) { |
912 base::StatsCounter read_bytes("tcp.read_bytes"); | 1002 base::StatsCounter read_bytes("tcp.read_bytes"); |
913 read_bytes.Add(num_bytes); | 1003 read_bytes.Add(num_bytes); |
914 num_bytes_read_ += num_bytes; | 1004 num_bytes_read_ += num_bytes; |
915 if (num_bytes > 0) | 1005 if (num_bytes > 0) |
916 use_history_.set_was_used_to_convey_data(); | 1006 use_history_.set_was_used_to_convey_data(); |
917 net_log_.AddByteTransferEvent(NetLog::TYPE_SOCKET_BYTES_RECEIVED, | 1007 net_log_.AddByteTransferEvent(NetLog::TYPE_SOCKET_BYTES_RECEIVED, |
918 num_bytes, core_->read_iobuffer_->data()); | 1008 num_bytes, core_->read_iobuffer_->data()); |
919 rv = static_cast<int>(num_bytes); | 1009 rv = static_cast<int>(num_bytes); |
920 } else { | 1010 } else { |
921 int os_error = WSAGetLastError(); | 1011 int os_error = WSAGetLastError(); |
922 rv = MapSystemError(os_error); | 1012 rv = MapSystemError(os_error); |
923 net_log_.AddEvent(NetLog::TYPE_SOCKET_READ_ERROR, | 1013 net_log_.AddEvent(NetLog::TYPE_SOCKET_READ_ERROR, |
924 CreateNetLogSocketErrorCallback(rv, os_error)); | 1014 CreateNetLogSocketErrorCallback(rv, os_error)); |
925 } | 1015 } |
926 core_->read_iobuffer_ = NULL; | 1016 core_->read_iobuffer_ = NULL; |
927 DoReadCallback(rv); | 1017 DoReadCallback(rv); |
Ryan Sleevi
2012/10/12 18:53:13
no core_->read_buffer_length_ = 0?
pmeenan
2012/10/17 15:12:31
Fixed. The buffer length isn't used in the overla
| |
928 } | 1018 } |
929 | 1019 |
930 void TCPClientSocketWin::DidCompleteWrite() { | 1020 void TCPClientSocketWin::DidCompleteWrite() { |
931 DCHECK(waiting_write_); | 1021 DCHECK(waiting_write_); |
932 | 1022 |
933 DWORD num_bytes, flags; | 1023 DWORD num_bytes, flags; |
934 BOOL ok = WSAGetOverlappedResult(socket_, &core_->write_overlapped_, | 1024 BOOL ok = WSAGetOverlappedResult(socket_, &core_->write_overlapped_, |
935 &num_bytes, FALSE, &flags); | 1025 &num_bytes, FALSE, &flags); |
936 WSAResetEvent(core_->write_overlapped_.hEvent); | 1026 WSAResetEvent(core_->write_overlapped_.hEvent); |
937 waiting_write_ = false; | 1027 waiting_write_ = false; |
(...skipping 18 matching lines...) Expand all Loading... | |
956 if (num_bytes > 0) | 1046 if (num_bytes > 0) |
957 use_history_.set_was_used_to_convey_data(); | 1047 use_history_.set_was_used_to_convey_data(); |
958 net_log_.AddByteTransferEvent(NetLog::TYPE_SOCKET_BYTES_SENT, num_bytes, | 1048 net_log_.AddByteTransferEvent(NetLog::TYPE_SOCKET_BYTES_SENT, num_bytes, |
959 core_->write_iobuffer_->data()); | 1049 core_->write_iobuffer_->data()); |
960 } | 1050 } |
961 } | 1051 } |
962 core_->write_iobuffer_ = NULL; | 1052 core_->write_iobuffer_ = NULL; |
963 DoWriteCallback(rv); | 1053 DoWriteCallback(rv); |
964 } | 1054 } |
965 | 1055 |
1056 void TCPClientSocketWin::DisableOverlappedReads() { | |
Ryan Sleevi
2012/10/12 18:53:13
style nit: The order in the implementation should
pmeenan
2012/10/17 15:12:31
Done.
| |
1057 g_disable_overlapped_reads = true; | |
1058 } | |
1059 | |
966 } // namespace net | 1060 } // namespace net |
OLD | NEW |