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 |