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

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

Issue 8824006: Migrate net/socket/socket.h, net/socket/stream_socket.h to base::Bind(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased Created 9 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
« no previous file with comments | « net/socket/tcp_client_socket_win.h ('k') | net/socket/tcp_server_socket_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 299 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 310
311 TCPClientSocketWin::TCPClientSocketWin(const AddressList& addresses, 311 TCPClientSocketWin::TCPClientSocketWin(const AddressList& addresses,
312 net::NetLog* net_log, 312 net::NetLog* net_log,
313 const net::NetLog::Source& source) 313 const net::NetLog::Source& source)
314 : socket_(INVALID_SOCKET), 314 : socket_(INVALID_SOCKET),
315 bound_socket_(INVALID_SOCKET), 315 bound_socket_(INVALID_SOCKET),
316 addresses_(addresses), 316 addresses_(addresses),
317 current_ai_(NULL), 317 current_ai_(NULL),
318 waiting_read_(false), 318 waiting_read_(false),
319 waiting_write_(false), 319 waiting_write_(false),
320 old_read_callback_(NULL),
321 write_callback_(NULL),
322 next_connect_state_(CONNECT_STATE_NONE), 320 next_connect_state_(CONNECT_STATE_NONE),
323 connect_os_error_(0), 321 connect_os_error_(0),
324 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SOCKET)), 322 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SOCKET)),
325 previously_disconnected_(false), 323 previously_disconnected_(false),
326 num_bytes_read_(0) { 324 num_bytes_read_(0) {
327 scoped_refptr<NetLog::EventParameters> params; 325 scoped_refptr<NetLog::EventParameters> params;
328 if (source.is_valid()) 326 if (source.is_valid())
329 params = new NetLogSourceParameter("source_dependency", source); 327 params = new NetLogSourceParameter("source_dependency", source);
330 net_log_.BeginEvent(NetLog::TYPE_SOCKET_ALIVE, params); 328 net_log_.BeginEvent(NetLog::TYPE_SOCKET_ALIVE, params);
331 EnsureWinsockInit(); 329 EnsureWinsockInit();
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 bound_socket_ = INVALID_SOCKET; 373 bound_socket_ = INVALID_SOCKET;
376 return MapSystemError(error); 374 return MapSystemError(error);
377 } 375 }
378 376
379 bind_address_.reset(new IPEndPoint(address)); 377 bind_address_.reset(new IPEndPoint(address));
380 378
381 return 0; 379 return 0;
382 } 380 }
383 381
384 382
385 int TCPClientSocketWin::Connect(OldCompletionCallback* callback) {
386 DCHECK(CalledOnValidThread());
387
388 // If already connected, then just return OK.
389 if (socket_ != INVALID_SOCKET)
390 return OK;
391
392 base::StatsCounter connects("tcp.connect");
393 connects.Increment();
394
395 net_log_.BeginEvent(NetLog::TYPE_TCP_CONNECT,
396 new AddressListNetLogParam(addresses_));
397
398 // We will try to connect to each address in addresses_. Start with the
399 // first one in the list.
400 next_connect_state_ = CONNECT_STATE_CONNECT;
401 current_ai_ = addresses_.head();
402
403 int rv = DoConnectLoop(OK);
404 if (rv == ERR_IO_PENDING) {
405 // Synchronous operation not supported.
406 DCHECK(callback);
407 old_read_callback_ = callback;
408 } else {
409 LogConnectCompletion(rv);
410 }
411
412 return rv;
413 }
414 int TCPClientSocketWin::Connect(const CompletionCallback& callback) { 383 int TCPClientSocketWin::Connect(const CompletionCallback& callback) {
415 DCHECK(CalledOnValidThread()); 384 DCHECK(CalledOnValidThread());
416 385
417 // If already connected, then just return OK. 386 // If already connected, then just return OK.
418 if (socket_ != INVALID_SOCKET) 387 if (socket_ != INVALID_SOCKET)
419 return OK; 388 return OK;
420 389
421 base::StatsCounter connects("tcp.connect"); 390 base::StatsCounter connects("tcp.connect");
422 connects.Increment(); 391 connects.Increment();
423 392
424 net_log_.BeginEvent(NetLog::TYPE_TCP_CONNECT, 393 net_log_.BeginEvent(NetLog::TYPE_TCP_CONNECT,
425 new AddressListNetLogParam(addresses_)); 394 new AddressListNetLogParam(addresses_));
426 395
427 // We will try to connect to each address in addresses_. Start with the 396 // We will try to connect to each address in addresses_. Start with the
428 // first one in the list. 397 // first one in the list.
429 next_connect_state_ = CONNECT_STATE_CONNECT; 398 next_connect_state_ = CONNECT_STATE_CONNECT;
430 current_ai_ = addresses_.head(); 399 current_ai_ = addresses_.head();
431 400
432 int rv = DoConnectLoop(OK); 401 int rv = DoConnectLoop(OK);
433 if (rv == ERR_IO_PENDING) { 402 if (rv == ERR_IO_PENDING) {
434 // Synchronous operation not supported. 403 // Synchronous operation not supported.
435 DCHECK(!callback.is_null()); 404 DCHECK(!callback.is_null());
405 // TODO(ajwong): Is setting read_callback_ the right thing to do here??
436 read_callback_ = callback; 406 read_callback_ = callback;
437 } else { 407 } else {
438 LogConnectCompletion(rv); 408 LogConnectCompletion(rv);
439 } 409 }
440 410
441 return rv; 411 return rv;
442 } 412 }
443 413
444 int TCPClientSocketWin::DoConnectLoop(int result) { 414 int TCPClientSocketWin::DoConnectLoop(int result) {
445 DCHECK_NE(next_connect_state_, CONNECT_STATE_NONE); 415 DCHECK_NE(next_connect_state_, CONNECT_STATE_NONE);
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 int64 TCPClientSocketWin::NumBytesRead() const { 668 int64 TCPClientSocketWin::NumBytesRead() const {
699 return num_bytes_read_; 669 return num_bytes_read_;
700 } 670 }
701 671
702 base::TimeDelta TCPClientSocketWin::GetConnectTimeMicros() const { 672 base::TimeDelta TCPClientSocketWin::GetConnectTimeMicros() const {
703 return connect_time_micros_; 673 return connect_time_micros_;
704 } 674 }
705 675
706 int TCPClientSocketWin::Read(IOBuffer* buf, 676 int TCPClientSocketWin::Read(IOBuffer* buf,
707 int buf_len, 677 int buf_len,
708 OldCompletionCallback* callback) {
709 DCHECK(CalledOnValidThread());
710 DCHECK_NE(socket_, INVALID_SOCKET);
711 DCHECK(!waiting_read_);
712 DCHECK(!old_read_callback_ && read_callback_.is_null());
713 DCHECK(!core_->read_iobuffer_);
714
715 buf_len = core_->ThrottleReadSize(buf_len);
716
717 core_->read_buffer_.len = buf_len;
718 core_->read_buffer_.buf = buf->data();
719
720 // TODO(wtc): Remove the assertion after enough testing.
721 AssertEventNotSignaled(core_->read_overlapped_.hEvent);
722 DWORD num, flags = 0;
723 int rv = WSARecv(socket_, &core_->read_buffer_, 1, &num, &flags,
724 &core_->read_overlapped_, NULL);
725 if (rv == 0) {
726 if (ResetEventIfSignaled(core_->read_overlapped_.hEvent)) {
727 base::StatsCounter read_bytes("tcp.read_bytes");
728 read_bytes.Add(num);
729 num_bytes_read_ += num;
730 if (num > 0)
731 use_history_.set_was_used_to_convey_data();
732 net_log_.AddByteTransferEvent(NetLog::TYPE_SOCKET_BYTES_RECEIVED, num,
733 core_->read_buffer_.buf);
734 return static_cast<int>(num);
735 }
736 } else {
737 int os_error = WSAGetLastError();
738 if (os_error != WSA_IO_PENDING)
739 return MapSystemError(os_error);
740 }
741 core_->WatchForRead();
742 waiting_read_ = true;
743 old_read_callback_ = callback;
744 core_->read_iobuffer_ = buf;
745 return ERR_IO_PENDING;
746 }
747 int TCPClientSocketWin::Read(IOBuffer* buf,
748 int buf_len,
749 const CompletionCallback& callback) { 678 const CompletionCallback& callback) {
750 DCHECK(CalledOnValidThread()); 679 DCHECK(CalledOnValidThread());
751 DCHECK_NE(socket_, INVALID_SOCKET); 680 DCHECK_NE(socket_, INVALID_SOCKET);
752 DCHECK(!waiting_read_); 681 DCHECK(!waiting_read_);
753 DCHECK(!old_read_callback_ && read_callback_.is_null()); 682 DCHECK(read_callback_.is_null());
754 DCHECK(!core_->read_iobuffer_); 683 DCHECK(!core_->read_iobuffer_);
755 684
756 buf_len = core_->ThrottleReadSize(buf_len); 685 buf_len = core_->ThrottleReadSize(buf_len);
757 686
758 core_->read_buffer_.len = buf_len; 687 core_->read_buffer_.len = buf_len;
759 core_->read_buffer_.buf = buf->data(); 688 core_->read_buffer_.buf = buf->data();
760 689
761 // TODO(wtc): Remove the assertion after enough testing. 690 // TODO(wtc): Remove the assertion after enough testing.
762 AssertEventNotSignaled(core_->read_overlapped_.hEvent); 691 AssertEventNotSignaled(core_->read_overlapped_.hEvent);
763 DWORD num, flags = 0; 692 DWORD num, flags = 0;
(...skipping 17 matching lines...) Expand all
781 } 710 }
782 core_->WatchForRead(); 711 core_->WatchForRead();
783 waiting_read_ = true; 712 waiting_read_ = true;
784 read_callback_ = callback; 713 read_callback_ = callback;
785 core_->read_iobuffer_ = buf; 714 core_->read_iobuffer_ = buf;
786 return ERR_IO_PENDING; 715 return ERR_IO_PENDING;
787 } 716 }
788 717
789 int TCPClientSocketWin::Write(IOBuffer* buf, 718 int TCPClientSocketWin::Write(IOBuffer* buf,
790 int buf_len, 719 int buf_len,
791 OldCompletionCallback* callback) { 720 const CompletionCallback& callback) {
792 DCHECK(CalledOnValidThread()); 721 DCHECK(CalledOnValidThread());
793 DCHECK_NE(socket_, INVALID_SOCKET); 722 DCHECK_NE(socket_, INVALID_SOCKET);
794 DCHECK(!waiting_write_); 723 DCHECK(!waiting_write_);
795 DCHECK(!write_callback_); 724 DCHECK(write_callback_.is_null());
796 DCHECK_GT(buf_len, 0); 725 DCHECK_GT(buf_len, 0);
797 DCHECK(!core_->write_iobuffer_); 726 DCHECK(!core_->write_iobuffer_);
798 727
799 base::StatsCounter writes("tcp.writes"); 728 base::StatsCounter writes("tcp.writes");
800 writes.Increment(); 729 writes.Increment();
801 730
802 core_->write_buffer_.len = buf_len; 731 core_->write_buffer_.len = buf_len;
803 core_->write_buffer_.buf = buf->data(); 732 core_->write_buffer_.buf = buf->data();
804 core_->write_buffer_length_ = buf_len; 733 core_->write_buffer_length_ = buf_len;
805 734
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 reinterpret_cast<const struct sockaddr*>(&source_address), 803 reinterpret_cast<const struct sockaddr*>(&source_address),
875 sizeof(source_address)); 804 sizeof(source_address));
876 net_log_.EndEvent(NetLog::TYPE_TCP_CONNECT, 805 net_log_.EndEvent(NetLog::TYPE_TCP_CONNECT,
877 make_scoped_refptr(new NetLogStringParameter( 806 make_scoped_refptr(new NetLogStringParameter(
878 "source_address", 807 "source_address",
879 source_address_str))); 808 source_address_str)));
880 } 809 }
881 810
882 void TCPClientSocketWin::DoReadCallback(int rv) { 811 void TCPClientSocketWin::DoReadCallback(int rv) {
883 DCHECK_NE(rv, ERR_IO_PENDING); 812 DCHECK_NE(rv, ERR_IO_PENDING);
884 DCHECK(old_read_callback_ || !read_callback_.is_null()); 813 DCHECK(!read_callback_.is_null());
885 814
886 // since Run may result in Read being called, clear read_callback_ up front. 815 // Since Run may result in Read being called, clear read_callback_ up front.
887 if (old_read_callback_) { 816 CompletionCallback c = read_callback_;
888 OldCompletionCallback* c = old_read_callback_; 817 read_callback_.Reset();
889 old_read_callback_ = NULL; 818 c.Run(rv);
890 c->Run(rv);
891 } else {
892 CompletionCallback c = read_callback_;
893 read_callback_.Reset();
894 c.Run(rv);
895 }
896 } 819 }
897 820
898 void TCPClientSocketWin::DoWriteCallback(int rv) { 821 void TCPClientSocketWin::DoWriteCallback(int rv) {
899 DCHECK_NE(rv, ERR_IO_PENDING); 822 DCHECK_NE(rv, ERR_IO_PENDING);
900 DCHECK(write_callback_); 823 DCHECK(!write_callback_.is_null());
901 824
902 // since Run may result in Write being called, clear write_callback_ up front. 825 // since Run may result in Write being called, clear write_callback_ up front.
903 OldCompletionCallback* c = write_callback_; 826 CompletionCallback c = write_callback_;
904 write_callback_ = NULL; 827 write_callback_.Reset();
905 c->Run(rv); 828 c.Run(rv);
906 } 829 }
907 830
908 void TCPClientSocketWin::DidCompleteConnect() { 831 void TCPClientSocketWin::DidCompleteConnect() {
909 DCHECK_EQ(next_connect_state_, CONNECT_STATE_CONNECT_COMPLETE); 832 DCHECK_EQ(next_connect_state_, CONNECT_STATE_CONNECT_COMPLETE);
910 int result; 833 int result;
911 834
912 WSANETWORKEVENTS events; 835 WSANETWORKEVENTS events;
913 int rv = WSAEnumNetworkEvents(socket_, core_->read_overlapped_.hEvent, 836 int rv = WSAEnumNetworkEvents(socket_, core_->read_overlapped_.hEvent,
914 &events); 837 &events);
915 int os_error = 0; 838 int os_error = 0;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
980 use_history_.set_was_used_to_convey_data(); 903 use_history_.set_was_used_to_convey_data();
981 net_log_.AddByteTransferEvent(NetLog::TYPE_SOCKET_BYTES_SENT, num_bytes, 904 net_log_.AddByteTransferEvent(NetLog::TYPE_SOCKET_BYTES_SENT, num_bytes,
982 core_->write_buffer_.buf); 905 core_->write_buffer_.buf);
983 } 906 }
984 } 907 }
985 core_->write_iobuffer_ = NULL; 908 core_->write_iobuffer_ = NULL;
986 DoWriteCallback(rv); 909 DoWriteCallback(rv);
987 } 910 }
988 911
989 } // namespace net 912 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/tcp_client_socket_win.h ('k') | net/socket/tcp_server_socket_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698