| 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/string_util.h" | 7 #include "base/string_util.h" |
| 8 #include "base/trace_event.h" | 8 #include "base/trace_event.h" |
| 9 #include "net/base/net_errors.h" | 9 #include "net/base/net_errors.h" |
| 10 #include "net/base/winsock_init.h" | 10 #include "net/base/winsock_init.h" |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 int TCPClientSocket::Read(char* buf, | 150 int TCPClientSocket::Read(char* buf, |
| 151 int buf_len, | 151 int buf_len, |
| 152 CompletionCallback* callback) { | 152 CompletionCallback* callback) { |
| 153 DCHECK(socket_ != INVALID_SOCKET); | 153 DCHECK(socket_ != INVALID_SOCKET); |
| 154 DCHECK(wait_state_ == NOT_WAITING); | 154 DCHECK(wait_state_ == NOT_WAITING); |
| 155 DCHECK(!callback_); | 155 DCHECK(!callback_); |
| 156 | 156 |
| 157 buffer_.len = buf_len; | 157 buffer_.len = buf_len; |
| 158 buffer_.buf = buf; | 158 buffer_.buf = buf; |
| 159 | 159 |
| 160 TRACE_EVENT_BEGIN("socket.read", this, ""); |
| 160 // TODO(wtc): Remove the CHECKs after enough testing. | 161 // TODO(wtc): Remove the CHECKs after enough testing. |
| 161 CHECK(WaitForSingleObject(overlapped_.hEvent, 0) == WAIT_TIMEOUT); | 162 CHECK(WaitForSingleObject(overlapped_.hEvent, 0) == WAIT_TIMEOUT); |
| 162 DWORD num, flags = 0; | 163 DWORD num, flags = 0; |
| 163 int rv = WSARecv(socket_, &buffer_, 1, &num, &flags, &overlapped_, NULL); | 164 int rv = WSARecv(socket_, &buffer_, 1, &num, &flags, &overlapped_, NULL); |
| 164 if (rv == 0) { | 165 if (rv == 0) { |
| 165 CHECK(WaitForSingleObject(overlapped_.hEvent, 0) == WAIT_OBJECT_0); | 166 CHECK(WaitForSingleObject(overlapped_.hEvent, 0) == WAIT_OBJECT_0); |
| 166 BOOL ok = WSAResetEvent(overlapped_.hEvent); | 167 BOOL ok = WSAResetEvent(overlapped_.hEvent); |
| 167 CHECK(ok); | 168 CHECK(ok); |
| 169 TRACE_EVENT_END("socket.read", this, StringPrintf("%d bytes", num)); |
| 168 return static_cast<int>(num); | 170 return static_cast<int>(num); |
| 169 } | 171 } |
| 170 int err = WSAGetLastError(); | 172 int err = WSAGetLastError(); |
| 171 if (err == WSA_IO_PENDING) { | 173 if (err == WSA_IO_PENDING) { |
| 172 watcher_.StartWatching(overlapped_.hEvent, this); | 174 watcher_.StartWatching(overlapped_.hEvent, this); |
| 173 wait_state_ = WAITING_READ; | 175 wait_state_ = WAITING_READ; |
| 174 callback_ = callback; | 176 callback_ = callback; |
| 175 return ERR_IO_PENDING; | 177 return ERR_IO_PENDING; |
| 176 } | 178 } |
| 177 return MapWinsockError(err); | 179 return MapWinsockError(err); |
| 178 } | 180 } |
| 179 | 181 |
| 180 int TCPClientSocket::Write(const char* buf, | 182 int TCPClientSocket::Write(const char* buf, |
| 181 int buf_len, | 183 int buf_len, |
| 182 CompletionCallback* callback) { | 184 CompletionCallback* callback) { |
| 183 DCHECK(socket_ != INVALID_SOCKET); | 185 DCHECK(socket_ != INVALID_SOCKET); |
| 184 DCHECK(wait_state_ == NOT_WAITING); | 186 DCHECK(wait_state_ == NOT_WAITING); |
| 185 DCHECK(!callback_); | 187 DCHECK(!callback_); |
| 186 | 188 |
| 187 buffer_.len = buf_len; | 189 buffer_.len = buf_len; |
| 188 buffer_.buf = const_cast<char*>(buf); | 190 buffer_.buf = const_cast<char*>(buf); |
| 189 | 191 |
| 192 TRACE_EVENT_BEGIN("socket.write", this, ""); |
| 190 // TODO(wtc): Remove the CHECKs after enough testing. | 193 // TODO(wtc): Remove the CHECKs after enough testing. |
| 191 CHECK(WaitForSingleObject(overlapped_.hEvent, 0) == WAIT_TIMEOUT); | 194 CHECK(WaitForSingleObject(overlapped_.hEvent, 0) == WAIT_TIMEOUT); |
| 192 DWORD num; | 195 DWORD num; |
| 193 int rv = WSASend(socket_, &buffer_, 1, &num, 0, &overlapped_, NULL); | 196 int rv = WSASend(socket_, &buffer_, 1, &num, 0, &overlapped_, NULL); |
| 194 if (rv == 0) { | 197 if (rv == 0) { |
| 195 CHECK(WaitForSingleObject(overlapped_.hEvent, 0) == WAIT_OBJECT_0); | 198 CHECK(WaitForSingleObject(overlapped_.hEvent, 0) == WAIT_OBJECT_0); |
| 196 BOOL ok = WSAResetEvent(overlapped_.hEvent); | 199 BOOL ok = WSAResetEvent(overlapped_.hEvent); |
| 197 CHECK(ok); | 200 CHECK(ok); |
| 201 TRACE_EVENT_END("socket.write", this, StringPrintf("%d bytes", num)); |
| 198 return static_cast<int>(num); | 202 return static_cast<int>(num); |
| 199 } | 203 } |
| 200 int err = WSAGetLastError(); | 204 int err = WSAGetLastError(); |
| 201 if (err == WSA_IO_PENDING) { | 205 if (err == WSA_IO_PENDING) { |
| 202 watcher_.StartWatching(overlapped_.hEvent, this); | 206 watcher_.StartWatching(overlapped_.hEvent, this); |
| 203 wait_state_ = WAITING_WRITE; | 207 wait_state_ = WAITING_WRITE; |
| 204 callback_ = callback; | 208 callback_ = callback; |
| 205 return ERR_IO_PENDING; | 209 return ERR_IO_PENDING; |
| 206 } | 210 } |
| 207 return MapWinsockError(err); | 211 return MapWinsockError(err); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 if (result != ERR_IO_PENDING) | 269 if (result != ERR_IO_PENDING) |
| 266 DoCallback(result); | 270 DoCallback(result); |
| 267 } | 271 } |
| 268 | 272 |
| 269 void TCPClientSocket::DidCompleteIO() { | 273 void TCPClientSocket::DidCompleteIO() { |
| 270 DWORD num_bytes, flags; | 274 DWORD num_bytes, flags; |
| 271 BOOL ok = WSAGetOverlappedResult( | 275 BOOL ok = WSAGetOverlappedResult( |
| 272 socket_, &overlapped_, &num_bytes, FALSE, &flags); | 276 socket_, &overlapped_, &num_bytes, FALSE, &flags); |
| 273 WSAResetEvent(overlapped_.hEvent); | 277 WSAResetEvent(overlapped_.hEvent); |
| 274 if (wait_state_ == WAITING_READ) { | 278 if (wait_state_ == WAITING_READ) { |
| 275 TRACE_EVENT_INSTANT("socket.read", this, | 279 TRACE_EVENT_END("socket.read", this, StringPrintf("%d bytes", num_bytes)); |
| 276 StringPrintf("%d bytes", num_bytes)); | |
| 277 } else { | 280 } else { |
| 278 TRACE_EVENT_INSTANT("socket.write", this, | 281 TRACE_EVENT_END("socket.write", this, StringPrintf("%d bytes", num_bytes)); |
| 279 StringPrintf("%d bytes", num_bytes)); | |
| 280 } | 282 } |
| 281 wait_state_ = NOT_WAITING; | 283 wait_state_ = NOT_WAITING; |
| 282 DoCallback(ok ? num_bytes : MapWinsockError(WSAGetLastError())); | 284 DoCallback(ok ? num_bytes : MapWinsockError(WSAGetLastError())); |
| 283 } | 285 } |
| 284 | 286 |
| 285 void TCPClientSocket::OnObjectSignaled(HANDLE object) { | 287 void TCPClientSocket::OnObjectSignaled(HANDLE object) { |
| 286 DCHECK(object == overlapped_.hEvent); | 288 DCHECK(object == overlapped_.hEvent); |
| 287 | 289 |
| 288 switch (wait_state_) { | 290 switch (wait_state_) { |
| 289 case WAITING_CONNECT: | 291 case WAITING_CONNECT: |
| 290 DidCompleteConnect(); | 292 DidCompleteConnect(); |
| 291 break; | 293 break; |
| 292 case WAITING_READ: | 294 case WAITING_READ: |
| 293 case WAITING_WRITE: | 295 case WAITING_WRITE: |
| 294 DidCompleteIO(); | 296 DidCompleteIO(); |
| 295 break; | 297 break; |
| 296 default: | 298 default: |
| 297 NOTREACHED(); | 299 NOTREACHED(); |
| 298 break; | 300 break; |
| 299 } | 301 } |
| 300 } | 302 } |
| 301 | 303 |
| 302 } // namespace net | 304 } // namespace net |
| 303 | 305 |
| OLD | NEW |