Chromium Code Reviews| 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 |