Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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/base/tcp_client_socket.h" | 5 #include "net/base/tcp_client_socket.h" |
| 6 | 6 |
| 7 #include "base/memory_debug.h" | |
| 7 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 8 #include "base/trace_event.h" | 9 #include "base/trace_event.h" |
| 9 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
| 10 #include "net/base/winsock_init.h" | 11 #include "net/base/winsock_init.h" |
| 11 | 12 |
| 12 namespace net { | 13 namespace net { |
| 13 | 14 |
| 14 //----------------------------------------------------------------------------- | 15 //----------------------------------------------------------------------------- |
| 15 | 16 |
| 16 static int MapWinsockError(DWORD err) { | 17 static int MapWinsockError(DWORD err) { |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 168 TRACE_EVENT_BEGIN("socket.read", this, ""); | 169 TRACE_EVENT_BEGIN("socket.read", this, ""); |
| 169 // TODO(wtc): Remove the CHECKs after enough testing. | 170 // TODO(wtc): Remove the CHECKs after enough testing. |
| 170 CHECK(WaitForSingleObject(overlapped_.hEvent, 0) == WAIT_TIMEOUT); | 171 CHECK(WaitForSingleObject(overlapped_.hEvent, 0) == WAIT_TIMEOUT); |
| 171 DWORD num, flags = 0; | 172 DWORD num, flags = 0; |
| 172 int rv = WSARecv(socket_, &buffer_, 1, &num, &flags, &overlapped_, NULL); | 173 int rv = WSARecv(socket_, &buffer_, 1, &num, &flags, &overlapped_, NULL); |
| 173 if (rv == 0) { | 174 if (rv == 0) { |
| 174 CHECK(WaitForSingleObject(overlapped_.hEvent, 0) == WAIT_OBJECT_0); | 175 CHECK(WaitForSingleObject(overlapped_.hEvent, 0) == WAIT_OBJECT_0); |
| 175 BOOL ok = WSAResetEvent(overlapped_.hEvent); | 176 BOOL ok = WSAResetEvent(overlapped_.hEvent); |
| 176 CHECK(ok); | 177 CHECK(ok); |
| 177 TRACE_EVENT_END("socket.read", this, StringPrintf("%d bytes", num)); | 178 TRACE_EVENT_END("socket.read", this, StringPrintf("%d bytes", num)); |
| 179 | |
| 180 // Because of how WSARecv fills memory when used asynchronously, Purify | |
| 181 // isn't able to detect that it's been initialized, so it scans for 0xcd | |
| 182 // in the buffer and reports UMRs (uninitialized memory reads) for those | |
| 183 // individual bytes. We override that in PURIFY builds to avoid the false | |
| 184 // error reports. | |
| 185 // See http://code.google.com/p/chromium/issues/detail?id=5297 | |
|
darin (slow to review)
2008/12/10 17:33:29
Can we use a more abbreviated way of referring to
| |
| 186 base::MemoryDebug::MarkAsInitialized(buffer_.buf, num); | |
| 178 return static_cast<int>(num); | 187 return static_cast<int>(num); |
| 179 } | 188 } |
| 180 int err = WSAGetLastError(); | 189 int err = WSAGetLastError(); |
| 181 if (err == WSA_IO_PENDING) { | 190 if (err == WSA_IO_PENDING) { |
| 182 watcher_.StartWatching(overlapped_.hEvent, this); | 191 watcher_.StartWatching(overlapped_.hEvent, this); |
| 183 wait_state_ = WAITING_READ; | 192 wait_state_ = WAITING_READ; |
| 184 callback_ = callback; | 193 callback_ = callback; |
| 185 return ERR_IO_PENDING; | 194 return ERR_IO_PENDING; |
| 186 } | 195 } |
| 187 return MapWinsockError(err); | 196 return MapWinsockError(err); |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 349 DidCompleteIO(); | 358 DidCompleteIO(); |
| 350 break; | 359 break; |
| 351 default: | 360 default: |
| 352 NOTREACHED(); | 361 NOTREACHED(); |
| 353 break; | 362 break; |
| 354 } | 363 } |
| 355 } | 364 } |
| 356 | 365 |
| 357 } // namespace net | 366 } // namespace net |
| 358 | 367 |
| OLD | NEW |