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

Side by Side Diff: net/socket/tcp_client_socket_win.cc

Issue 10916016: Switch the TCP reads on Windows to use non-blocking/non-async I/O. (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: Created 8 years, 2 months 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) 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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« net/socket/tcp_client_socket_win.h ('K') | « net/socket/tcp_client_socket_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698