Index: net/socket/tcp_client_socket_win.cc |
=================================================================== |
--- net/socket/tcp_client_socket_win.cc (revision 185536) |
+++ net/socket/tcp_client_socket_win.cc (working copy) |
@@ -266,7 +266,7 @@ |
TCPClientSocketWin* socket) |
: read_buffer_length_(0), |
write_buffer_length_(0), |
- disable_overlapped_reads_(g_disable_overlapped_reads), |
+ disable_overlapped_reads_(true), |
wtc
2013/03/06 17:33:43
Please ignore this change. I need this temporary c
|
non_blocking_reads_initialized_(false), |
socket_(socket), |
ALLOW_THIS_IN_INITIALIZER_LIST(reader_(this)), |
@@ -840,6 +840,9 @@ |
FD_READ | FD_CLOSE); |
core_->non_blocking_reads_initialized_ = true; |
} |
+ // Sometimes core_->read_overlapped_.hEvent is signaled at this |
+ // point. It is usually the 3rd-5th times we call recv() on the |
+ // socket, never the first time. |
int rv = recv(socket_, buf->data(), buf_len, 0); |
if (rv == SOCKET_ERROR) { |
int os_error = WSAGetLastError(); |
@@ -858,6 +861,8 @@ |
} |
net_log_.AddByteTransferEvent(NetLog::TYPE_SOCKET_BYTES_RECEIVED, rv, |
buf->data()); |
+ BOOL ok = WSAResetEvent(core_->read_overlapped_.hEvent); |
rvargas (doing something else)
2013/03/06 23:08:49
I think this can cause unwanted hangs (unlikely, b
Pat Meenan
2013/03/07 15:11:04
What are you trying to solve by manually resetting
|
+ CHECK(ok); |
return rv; |
} |
} else { |
@@ -1022,25 +1027,20 @@ |
WSANETWORKEVENTS network_events; |
int rv = WSAEnumNetworkEvents(socket_, core_->read_overlapped_.hEvent, |
&network_events); |
+ AssertEventNotSignaled(core_->read_overlapped_.hEvent); |
wtc
2013/03/06 17:33:43
This asserts that WSAEnumNetworkEvents resets the
rvargas (doing something else)
2013/03/06 23:08:49
Sounds like a race to me.
Pat Meenan
2013/03/07 15:11:04
Agreed, it's not atomic so it's theoretically poss
|
if (rv == SOCKET_ERROR) { |
+ NOTREACHED(); |
rvargas (doing something else)
2013/03/06 23:08:49
I'm assuming this is for development purposes... I
|
os_error = WSAGetLastError(); |
rv = MapSystemError(os_error); |
- } else if (network_events.lNetworkEvents & FD_READ) { |
+ } else if (network_events.lNetworkEvents) { |
rv = DoRead(core_->read_iobuffer_, core_->read_buffer_length_, |
read_callback_); |
wtc
2013/03/06 17:33:43
I got the inspiration of this change from the old-
Pat Meenan
2013/03/07 15:11:04
Is the last error from the recv() here as granular
wtc
2013/03/14 01:24:45
Yes, in fact it is better.
When the peer resets t
|
if (rv == ERR_IO_PENDING) |
return; |
- } else if (network_events.lNetworkEvents & FD_CLOSE) { |
- if (network_events.iErrorCode[FD_CLOSE_BIT]) { |
- rv = MapSystemError(network_events.iErrorCode[FD_CLOSE_BIT]); |
- net_log_.AddEvent(NetLog::TYPE_SOCKET_READ_ERROR, |
- CreateNetLogSocketErrorCallback(rv, os_error)); |
wtc
2013/03/06 17:33:43
If you prefer a smaller change, I can call DoRead(
|
- } else { |
- rv = 0; |
- } |
} else { |
// This should not happen but I have seen cases where we will get |
// signaled but the network events flags are all clear (0). |
wtc
2013/03/06 17:33:43
The WSAResetEvent call I added on line 864 elimina
rvargas (doing something else)
2013/03/06 23:08:49
I'm thinking that we either accept a spurious wake
Pat Meenan
2013/03/07 15:11:04
How often do the Spurious wake-ups happen from IsC
wtc
2013/03/14 01:24:45
I confirmed that the spurious wake-ups are NOT cau
|
+ NOTREACHED(); |
rvargas (doing something else)
2013/03/06 23:08:49
same thing here. If this triggers for a developer
|
core_->WatchForRead(); |
return; |
} |