Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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_socket.h" | 5 #include "net/socket/tcp_socket.h" |
| 6 #include "net/socket/tcp_socket_win.h" | 6 #include "net/socket/tcp_socket_win.h" |
| 7 | 7 |
| 8 #include <mstcpip.h> | 8 #include <mstcpip.h> |
| 9 | 9 |
| 10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 243 // We grab an extra reference because there is an IO operation in progress. | 243 // We grab an extra reference because there is an IO operation in progress. |
| 244 // Balanced in WriteDelegate::OnObjectSignaled(). | 244 // Balanced in WriteDelegate::OnObjectSignaled(). |
| 245 AddRef(); | 245 AddRef(); |
| 246 write_watcher_.StartWatching(write_overlapped_.hEvent, &writer_); | 246 write_watcher_.StartWatching(write_overlapped_.hEvent, &writer_); |
| 247 } | 247 } |
| 248 | 248 |
| 249 void TCPSocketWin::Core::ReadDelegate::OnObjectSignaled(HANDLE object) { | 249 void TCPSocketWin::Core::ReadDelegate::OnObjectSignaled(HANDLE object) { |
| 250 // TODO(vadimt): Remove ScopedTracker below once crbug.com/418183 is fixed. | 250 // TODO(vadimt): Remove ScopedTracker below once crbug.com/418183 is fixed. |
| 251 tracked_objects::ScopedTracker tracking_profile( | 251 tracked_objects::ScopedTracker tracking_profile( |
| 252 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 252 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 253 "TCPSocketWin_Core_ReadDelegate_OnObjectSignaled")); | 253 "418183 TCPSocketWin::Core::ReadDelegate::OnObjectSignaled")); |
| 254 | 254 |
| 255 DCHECK_EQ(object, core_->read_overlapped_.hEvent); | 255 DCHECK_EQ(object, core_->read_overlapped_.hEvent); |
| 256 if (core_->socket_) { | 256 if (core_->socket_) { |
| 257 if (core_->socket_->waiting_connect_) | 257 if (core_->socket_->waiting_connect_) |
| 258 core_->socket_->DidCompleteConnect(); | 258 core_->socket_->DidCompleteConnect(); |
| 259 else | 259 else |
| 260 core_->socket_->DidSignalRead(); | 260 core_->socket_->DidSignalRead(); |
| 261 } | 261 } |
| 262 | 262 |
| 263 core_->Release(); | 263 core_->Release(); |
| 264 } | 264 } |
| 265 | 265 |
| 266 void TCPSocketWin::Core::WriteDelegate::OnObjectSignaled( | 266 void TCPSocketWin::Core::WriteDelegate::OnObjectSignaled( |
| 267 HANDLE object) { | 267 HANDLE object) { |
| 268 // TODO(vadimt): Remove ScopedTracker below once crbug.com/418183 is fixed. | 268 // TODO(vadimt): Remove ScopedTracker below once crbug.com/418183 is fixed. |
| 269 tracked_objects::ScopedTracker tracking_profile( | 269 tracked_objects::ScopedTracker tracking_profile( |
| 270 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 270 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 271 "TCPSocketWin_Core_WriteDelegate_OnObjectSignaled")); | 271 "418183 TCPSocketWin::Core::WriteDelegate::OnObjectSignaled")); |
| 272 | 272 |
| 273 DCHECK_EQ(object, core_->write_overlapped_.hEvent); | 273 DCHECK_EQ(object, core_->write_overlapped_.hEvent); |
| 274 if (core_->socket_) | 274 if (core_->socket_) |
| 275 core_->socket_->DidCompleteWrite(); | 275 core_->socket_->DidCompleteWrite(); |
| 276 | 276 |
| 277 core_->Release(); | 277 core_->Release(); |
| 278 } | 278 } |
| 279 | 279 |
| 280 //----------------------------------------------------------------------------- | 280 //----------------------------------------------------------------------------- |
| 281 | 281 |
| (...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 767 *socket = tcp_socket.Pass(); | 767 *socket = tcp_socket.Pass(); |
| 768 *address = ip_end_point; | 768 *address = ip_end_point; |
| 769 net_log_.EndEvent(NetLog::TYPE_TCP_ACCEPT, | 769 net_log_.EndEvent(NetLog::TYPE_TCP_ACCEPT, |
| 770 CreateNetLogIPEndPointCallback(&ip_end_point)); | 770 CreateNetLogIPEndPointCallback(&ip_end_point)); |
| 771 return OK; | 771 return OK; |
| 772 } | 772 } |
| 773 | 773 |
| 774 void TCPSocketWin::OnObjectSignaled(HANDLE object) { | 774 void TCPSocketWin::OnObjectSignaled(HANDLE object) { |
| 775 // TODO(vadimt): Remove ScopedTracker below once crbug.com/418183 is fixed. | 775 // TODO(vadimt): Remove ScopedTracker below once crbug.com/418183 is fixed. |
| 776 tracked_objects::ScopedTracker tracking_profile( | 776 tracked_objects::ScopedTracker tracking_profile( |
| 777 FROM_HERE_WITH_EXPLICIT_FUNCTION("TCPSocketWin_OnObjectSignaled")); | 777 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 778 "418383 TCPSocketWin::OnObjectSignaled")); | |
| 778 | 779 |
| 779 WSANETWORKEVENTS ev; | 780 WSANETWORKEVENTS ev; |
| 780 if (WSAEnumNetworkEvents(socket_, accept_event_, &ev) == SOCKET_ERROR) { | 781 if (WSAEnumNetworkEvents(socket_, accept_event_, &ev) == SOCKET_ERROR) { |
| 781 PLOG(ERROR) << "WSAEnumNetworkEvents()"; | 782 PLOG(ERROR) << "WSAEnumNetworkEvents()"; |
| 782 return; | 783 return; |
| 783 } | 784 } |
| 784 | 785 |
| 785 if (ev.lNetworkEvents & FD_ACCEPT) { | 786 if (ev.lNetworkEvents & FD_ACCEPT) { |
| 786 int result = AcceptInternal(accept_socket_, accept_address_); | 787 int result = AcceptInternal(accept_socket_, accept_address_); |
| 787 if (result != ERR_IO_PENDING) { | 788 if (result != ERR_IO_PENDING) { |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 956 core_->read_buffer_length_ = buf_len; | 957 core_->read_buffer_length_ = buf_len; |
| 957 core_->WatchForRead(); | 958 core_->WatchForRead(); |
| 958 return ERR_IO_PENDING; | 959 return ERR_IO_PENDING; |
| 959 } | 960 } |
| 960 | 961 |
| 961 void TCPSocketWin::DidCompleteConnect() { | 962 void TCPSocketWin::DidCompleteConnect() { |
| 962 DCHECK(waiting_connect_); | 963 DCHECK(waiting_connect_); |
| 963 DCHECK(!read_callback_.is_null()); | 964 DCHECK(!read_callback_.is_null()); |
| 964 int result; | 965 int result; |
| 965 | 966 |
| 967 // TODO(pkasting): Remove ScopedTracker below once crbug.com/418183 is fixed. | |
| 968 tracked_objects::ScopedTracker tracking_profile( | |
| 969 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
| 970 "418183 TCPSocketWin::DidCompleteConnect1")); | |
| 966 WSANETWORKEVENTS events; | 971 WSANETWORKEVENTS events; |
| 967 int rv = WSAEnumNetworkEvents(socket_, core_->read_overlapped_.hEvent, | 972 int rv = WSAEnumNetworkEvents(socket_, core_->read_overlapped_.hEvent, |
| 968 &events); | 973 &events); |
| 969 int os_error = 0; | 974 int os_error = 0; |
| 970 if (rv == SOCKET_ERROR) { | 975 if (rv == SOCKET_ERROR) { |
| 976 // TODO(pkasting): Remove ScopedTracker below once crbug.com/418183 is | |
| 977 // fixed. | |
| 978 tracked_objects::ScopedTracker tracking_profile( | |
| 979 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
| 980 "418183 TCPSocketWin::DidCompleteConnect2")); | |
|
vadimt
2015/02/05 01:17:14
The instrumentation will interfere with WSAGetLast
Peter Kasting
2015/02/05 01:59:38
Done.
| |
| 971 NOTREACHED(); | 981 NOTREACHED(); |
| 972 os_error = WSAGetLastError(); | 982 os_error = WSAGetLastError(); |
| 973 result = MapSystemError(os_error); | 983 result = MapSystemError(os_error); |
| 974 } else if (events.lNetworkEvents & FD_CONNECT) { | 984 } else if (events.lNetworkEvents & FD_CONNECT) { |
| 985 // TODO(pkasting): Remove ScopedTracker below once crbug.com/418183 is | |
| 986 // fixed. | |
| 987 tracked_objects::ScopedTracker tracking_profile( | |
| 988 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
| 989 "418183 TCPSocketWin::DidCompleteConnect3")); | |
| 975 os_error = events.iErrorCode[FD_CONNECT_BIT]; | 990 os_error = events.iErrorCode[FD_CONNECT_BIT]; |
| 976 result = MapConnectError(os_error); | 991 result = MapConnectError(os_error); |
| 977 } else { | 992 } else { |
| 978 NOTREACHED(); | 993 NOTREACHED(); |
| 979 result = ERR_UNEXPECTED; | 994 result = ERR_UNEXPECTED; |
| 980 } | 995 } |
| 981 | 996 |
| 997 // TODO(pkasting): Remove ScopedTracker below once crbug.com/418183 is fixed. | |
| 998 tracked_objects::ScopedTracker tracking_profile( | |
| 999 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
| 1000 "418183 TCPSocketWin::DidCompleteConnect4")); | |
| 982 connect_os_error_ = os_error; | 1001 connect_os_error_ = os_error; |
| 983 DoConnectComplete(result); | 1002 DoConnectComplete(result); |
| 984 waiting_connect_ = false; | 1003 waiting_connect_ = false; |
| 985 | 1004 |
| 1005 // TODO(pkasting): Remove ScopedTracker below once crbug.com/418183 is fixed. | |
| 1006 tracked_objects::ScopedTracker tracking_profile( | |
| 1007 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
| 1008 "418183 TCPSocketWin::DidCompleteConnect5")); | |
| 986 DCHECK_NE(result, ERR_IO_PENDING); | 1009 DCHECK_NE(result, ERR_IO_PENDING); |
| 987 base::ResetAndReturn(&read_callback_).Run(result); | 1010 base::ResetAndReturn(&read_callback_).Run(result); |
| 988 } | 1011 } |
| 989 | 1012 |
| 990 void TCPSocketWin::DidCompleteWrite() { | 1013 void TCPSocketWin::DidCompleteWrite() { |
| 991 DCHECK(waiting_write_); | 1014 DCHECK(waiting_write_); |
| 992 DCHECK(!write_callback_.is_null()); | 1015 DCHECK(!write_callback_.is_null()); |
| 993 | 1016 |
| 994 DWORD num_bytes, flags; | 1017 DWORD num_bytes, flags; |
| 995 BOOL ok = WSAGetOverlappedResult(socket_, &core_->write_overlapped_, | 1018 BOOL ok = WSAGetOverlappedResult(socket_, &core_->write_overlapped_, |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 1023 core_->write_iobuffer_ = NULL; | 1046 core_->write_iobuffer_ = NULL; |
| 1024 | 1047 |
| 1025 DCHECK_NE(rv, ERR_IO_PENDING); | 1048 DCHECK_NE(rv, ERR_IO_PENDING); |
| 1026 base::ResetAndReturn(&write_callback_).Run(rv); | 1049 base::ResetAndReturn(&write_callback_).Run(rv); |
| 1027 } | 1050 } |
| 1028 | 1051 |
| 1029 void TCPSocketWin::DidSignalRead() { | 1052 void TCPSocketWin::DidSignalRead() { |
| 1030 DCHECK(waiting_read_); | 1053 DCHECK(waiting_read_); |
| 1031 DCHECK(!read_callback_.is_null()); | 1054 DCHECK(!read_callback_.is_null()); |
| 1032 | 1055 |
| 1056 // TODO(pkasting): Remove ScopedTracker below once crbug.com/418183 is fixed. | |
| 1057 tracked_objects::ScopedTracker tracking_profile( | |
| 1058 FROM_HERE_WITH_EXPLICIT_FUNCTION("418183 TCPSocketWin::DidSignalRead1")); | |
| 1033 int os_error = 0; | 1059 int os_error = 0; |
| 1034 WSANETWORKEVENTS network_events; | 1060 WSANETWORKEVENTS network_events; |
| 1035 int rv = WSAEnumNetworkEvents(socket_, core_->read_overlapped_.hEvent, | 1061 int rv = WSAEnumNetworkEvents(socket_, core_->read_overlapped_.hEvent, |
| 1036 &network_events); | 1062 &network_events); |
| 1037 if (rv == SOCKET_ERROR) { | 1063 if (rv == SOCKET_ERROR) { |
| 1064 // TODO(pkasting): Remove ScopedTracker below once crbug.com/418183 is | |
| 1065 // fixed. | |
| 1066 tracked_objects::ScopedTracker tracking_profile( | |
| 1067 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
|
vadimt
2015/02/05 01:17:14
Same thing
Peter Kasting
2015/02/05 01:59:38
Done.
| |
| 1068 "418183 TCPSocketWin::DidSignalRead2")); | |
| 1038 os_error = WSAGetLastError(); | 1069 os_error = WSAGetLastError(); |
| 1039 rv = MapSystemError(os_error); | 1070 rv = MapSystemError(os_error); |
| 1040 } else if (network_events.lNetworkEvents) { | 1071 } else if (network_events.lNetworkEvents) { |
| 1072 // TODO(pkasting): Remove ScopedTracker below once crbug.com/418183 is | |
| 1073 // fixed. | |
| 1074 tracked_objects::ScopedTracker tracking_profile( | |
| 1075 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
| 1076 "418183 TCPSocketWin::DidSignalRead3")); | |
| 1041 DCHECK_EQ(network_events.lNetworkEvents & ~(FD_READ | FD_CLOSE), 0); | 1077 DCHECK_EQ(network_events.lNetworkEvents & ~(FD_READ | FD_CLOSE), 0); |
| 1042 // If network_events.lNetworkEvents is FD_CLOSE and | 1078 // If network_events.lNetworkEvents is FD_CLOSE and |
| 1043 // network_events.iErrorCode[FD_CLOSE_BIT] is 0, it is a graceful | 1079 // network_events.iErrorCode[FD_CLOSE_BIT] is 0, it is a graceful |
| 1044 // connection closure. It is tempting to directly set rv to 0 in | 1080 // connection closure. It is tempting to directly set rv to 0 in |
| 1045 // this case, but the MSDN pages for WSAEventSelect and | 1081 // this case, but the MSDN pages for WSAEventSelect and |
| 1046 // WSAAsyncSelect recommend we still call DoRead(): | 1082 // WSAAsyncSelect recommend we still call DoRead(): |
| 1047 // FD_CLOSE should only be posted after all data is read from a | 1083 // FD_CLOSE should only be posted after all data is read from a |
| 1048 // socket, but an application should check for remaining data upon | 1084 // socket, but an application should check for remaining data upon |
| 1049 // receipt of FD_CLOSE to avoid any possibility of losing data. | 1085 // receipt of FD_CLOSE to avoid any possibility of losing data. |
| 1050 // | 1086 // |
| 1051 // If network_events.iErrorCode[FD_READ_BIT] or | 1087 // If network_events.iErrorCode[FD_READ_BIT] or |
| 1052 // network_events.iErrorCode[FD_CLOSE_BIT] is nonzero, still call | 1088 // network_events.iErrorCode[FD_CLOSE_BIT] is nonzero, still call |
| 1053 // DoRead() because recv() reports a more accurate error code | 1089 // DoRead() because recv() reports a more accurate error code |
| 1054 // (WSAECONNRESET vs. WSAECONNABORTED) when the connection was | 1090 // (WSAECONNRESET vs. WSAECONNABORTED) when the connection was |
| 1055 // reset. | 1091 // reset. |
| 1056 rv = DoRead(core_->read_iobuffer_.get(), core_->read_buffer_length_, | 1092 rv = DoRead(core_->read_iobuffer_.get(), core_->read_buffer_length_, |
| 1057 read_callback_); | 1093 read_callback_); |
| 1058 if (rv == ERR_IO_PENDING) | 1094 if (rv == ERR_IO_PENDING) |
| 1059 return; | 1095 return; |
| 1060 } else { | 1096 } else { |
| 1097 // TODO(pkasting): Remove ScopedTracker below once crbug.com/418183 is | |
| 1098 // fixed. | |
| 1099 tracked_objects::ScopedTracker tracking_profile( | |
| 1100 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
| 1101 "418183 TCPSocketWin::DidSignalRead4")); | |
| 1061 // This may happen because Read() may succeed synchronously and | 1102 // This may happen because Read() may succeed synchronously and |
| 1062 // consume all the received data without resetting the event object. | 1103 // consume all the received data without resetting the event object. |
| 1063 core_->WatchForRead(); | 1104 core_->WatchForRead(); |
| 1064 return; | 1105 return; |
| 1065 } | 1106 } |
| 1066 | 1107 |
| 1067 waiting_read_ = false; | 1108 waiting_read_ = false; |
| 1068 core_->read_iobuffer_ = NULL; | 1109 core_->read_iobuffer_ = NULL; |
| 1069 core_->read_buffer_length_ = 0; | 1110 core_->read_buffer_length_ = 0; |
| 1070 | 1111 |
| 1071 DCHECK_NE(rv, ERR_IO_PENDING); | |
| 1072 // TODO(vadimt): Remove ScopedTracker below once crbug.com/418183 is fixed. | 1112 // TODO(vadimt): Remove ScopedTracker below once crbug.com/418183 is fixed. |
| 1073 tracked_objects::ScopedTracker tracking_profile( | 1113 tracked_objects::ScopedTracker tracking_profile( |
| 1074 FROM_HERE_WITH_EXPLICIT_FUNCTION("TCPSocketWin::DidSignalRead")); | 1114 FROM_HERE_WITH_EXPLICIT_FUNCTION("418183 TCPSocketWin::DidSignalRead5")); |
| 1115 DCHECK_NE(rv, ERR_IO_PENDING); | |
| 1075 base::ResetAndReturn(&read_callback_).Run(rv); | 1116 base::ResetAndReturn(&read_callback_).Run(rv); |
| 1076 } | 1117 } |
| 1077 | 1118 |
| 1078 } // namespace net | 1119 } // namespace net |
| OLD | NEW |