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 939 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
950 LogConnectCompletion(rv); | 950 LogConnectCompletion(rv); |
951 DoReadCallback(rv); | 951 DoReadCallback(rv); |
952 } | 952 } |
953 } | 953 } |
954 | 954 |
955 void TCPClientSocketWin::DidCompleteRead() { | 955 void TCPClientSocketWin::DidCompleteRead() { |
956 DCHECK(waiting_read_); | 956 DCHECK(waiting_read_); |
957 DWORD num_bytes, flags; | 957 DWORD num_bytes, flags; |
958 BOOL ok = WSAGetOverlappedResult(socket_, &core_->read_overlapped_, | 958 BOOL ok = WSAGetOverlappedResult(socket_, &core_->read_overlapped_, |
959 &num_bytes, FALSE, &flags); | 959 &num_bytes, FALSE, &flags); |
960 WSAResetEvent(core_->read_overlapped_.hEvent); | |
961 waiting_read_ = false; | 960 waiting_read_ = false; |
962 int rv; | 961 int rv; |
963 if (ok) { | 962 if (ok) { |
964 base::StatsCounter read_bytes("tcp.read_bytes"); | 963 base::StatsCounter read_bytes("tcp.read_bytes"); |
965 read_bytes.Add(num_bytes); | 964 read_bytes.Add(num_bytes); |
966 num_bytes_read_ += num_bytes; | 965 num_bytes_read_ += num_bytes; |
967 if (num_bytes > 0) | 966 if (num_bytes > 0) |
968 use_history_.set_was_used_to_convey_data(); | 967 use_history_.set_was_used_to_convey_data(); |
969 net_log_.AddByteTransferEvent(NetLog::TYPE_SOCKET_BYTES_RECEIVED, | 968 net_log_.AddByteTransferEvent(NetLog::TYPE_SOCKET_BYTES_RECEIVED, |
970 num_bytes, core_->read_iobuffer_->data()); | 969 num_bytes, core_->read_iobuffer_->data()); |
971 rv = static_cast<int>(num_bytes); | 970 rv = static_cast<int>(num_bytes); |
972 } else { | 971 } else { |
973 int os_error = WSAGetLastError(); | 972 int os_error = WSAGetLastError(); |
974 rv = MapSystemError(os_error); | 973 rv = MapSystemError(os_error); |
975 net_log_.AddEvent(NetLog::TYPE_SOCKET_READ_ERROR, | 974 net_log_.AddEvent(NetLog::TYPE_SOCKET_READ_ERROR, |
976 CreateNetLogSocketErrorCallback(rv, os_error)); | 975 CreateNetLogSocketErrorCallback(rv, os_error)); |
977 } | 976 } |
977 WSAResetEvent(core_->read_overlapped_.hEvent); | |
wtc
2013/03/05 20:17:03
This change is just defensive programming. Between
| |
978 core_->read_iobuffer_ = NULL; | 978 core_->read_iobuffer_ = NULL; |
979 core_->read_buffer_length_ = 0; | 979 core_->read_buffer_length_ = 0; |
980 DoReadCallback(rv); | 980 DoReadCallback(rv); |
981 } | 981 } |
982 | 982 |
983 void TCPClientSocketWin::DidCompleteWrite() { | 983 void TCPClientSocketWin::DidCompleteWrite() { |
984 DCHECK(waiting_write_); | 984 DCHECK(waiting_write_); |
985 | 985 |
986 DWORD num_bytes, flags; | 986 DWORD num_bytes, flags; |
987 BOOL ok = WSAGetOverlappedResult(socket_, &core_->write_overlapped_, | 987 BOOL ok = WSAGetOverlappedResult(socket_, &core_->write_overlapped_, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1019 void TCPClientSocketWin::DidSignalRead() { | 1019 void TCPClientSocketWin::DidSignalRead() { |
1020 DCHECK(waiting_read_); | 1020 DCHECK(waiting_read_); |
1021 int os_error = 0; | 1021 int os_error = 0; |
1022 WSANETWORKEVENTS network_events; | 1022 WSANETWORKEVENTS network_events; |
1023 int rv = WSAEnumNetworkEvents(socket_, core_->read_overlapped_.hEvent, | 1023 int rv = WSAEnumNetworkEvents(socket_, core_->read_overlapped_.hEvent, |
1024 &network_events); | 1024 &network_events); |
1025 if (rv == SOCKET_ERROR) { | 1025 if (rv == SOCKET_ERROR) { |
1026 os_error = WSAGetLastError(); | 1026 os_error = WSAGetLastError(); |
1027 rv = MapSystemError(os_error); | 1027 rv = MapSystemError(os_error); |
1028 } else if (network_events.lNetworkEvents & FD_READ) { | 1028 } else if (network_events.lNetworkEvents & FD_READ) { |
1029 rv = DoRead(core_->read_iobuffer_, core_->read_buffer_length_, | 1029 if (network_events.iErrorCode[FD_READ_BIT]) { |
wtc
2013/03/05 20:17:03
According to MSDN documentation and the sample cod
rvargas (doing something else)
2013/03/05 23:14:07
could you point me to that sample?
wtc
2013/03/06 00:00:03
I will bring the book to the office tomorrow.
rvargas (doing something else)
2013/03/06 00:34:47
That's ok. We agree that it is better to add the c
Pat Meenan
2013/03/06 02:05:28
In theory the FD_CLOSE is supposed to stay signale
| |
1030 read_callback_); | 1030 os_error = network_events.iErrorCode[FD_READ_BIT]; |
1031 if (rv == ERR_IO_PENDING) | 1031 rv = MapSystemError(os_error); |
1032 return; | |
1033 } else if (network_events.lNetworkEvents & FD_CLOSE) { | |
1034 if (network_events.iErrorCode[FD_CLOSE_BIT]) { | |
1035 rv = MapSystemError(network_events.iErrorCode[FD_CLOSE_BIT]); | |
1036 net_log_.AddEvent(NetLog::TYPE_SOCKET_READ_ERROR, | 1032 net_log_.AddEvent(NetLog::TYPE_SOCKET_READ_ERROR, |
1037 CreateNetLogSocketErrorCallback(rv, os_error)); | 1033 CreateNetLogSocketErrorCallback(rv, os_error)); |
wtc
2013/03/05 20:17:03
This is the bug. Note that we map
network_events.i
| |
1038 } else { | 1034 } else { |
1035 rv = DoRead(core_->read_iobuffer_, core_->read_buffer_length_, | |
1036 read_callback_); | |
1037 if (rv == ERR_IO_PENDING) | |
1038 return; | |
1039 } | |
1040 } else if (network_events.lNetworkEvents & FD_CLOSE) { | |
1041 DCHECK_EQ(network_events.lNetworkEvents & ~FD_CLOSE, 0); | |
1042 if (network_events.iErrorCode[FD_CLOSE_BIT]) { | |
1043 os_error = network_events.iErrorCode[FD_CLOSE_BIT]; | |
1044 rv = MapSystemError(os_error); | |
1045 net_log_.AddEvent(NetLog::TYPE_SOCKET_READ_ERROR, | |
1046 CreateNetLogSocketErrorCallback(rv, os_error)); | |
1047 } else { | |
1039 rv = 0; | 1048 rv = 0; |
1040 } | 1049 } |
1041 } else { | 1050 } else { |
1042 // This should not happen but I have seen cases where we will get | 1051 // This should not happen but I have seen cases where we will get |
1043 // signaled but the network events flags are all clear (0). | 1052 // signaled but the network events flags are all clear (0). |
1044 core_->WatchForRead(); | 1053 core_->WatchForRead(); |
wtc
2013/03/05 20:17:03
I also saw this in my debugging. This occurs while
| |
1045 return; | 1054 return; |
1046 } | 1055 } |
1047 waiting_read_ = false; | 1056 waiting_read_ = false; |
1048 core_->read_iobuffer_ = NULL; | 1057 core_->read_iobuffer_ = NULL; |
1049 core_->read_buffer_length_ = 0; | 1058 core_->read_buffer_length_ = 0; |
1050 DoReadCallback(rv); | 1059 DoReadCallback(rv); |
1051 } | 1060 } |
1052 | 1061 |
1053 } // namespace net | 1062 } // namespace net |
OLD | NEW |