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 "base/sync_socket.h" | 5 #include "base/sync_socket.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/win/scoped_handle.h" | 8 #include "base/win/scoped_handle.h" |
9 | 9 |
10 namespace base { | 10 namespace base { |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 BOOL ok = operation(file, static_cast<BufferType*>(buffer) + count, chunk, | 131 BOOL ok = operation(file, static_cast<BufferType*>(buffer) + count, chunk, |
132 &len, &ol); | 132 &len, &ol); |
133 if (!ok) { | 133 if (!ok) { |
134 if (::GetLastError() == ERROR_IO_PENDING) { | 134 if (::GetLastError() == ERROR_IO_PENDING) { |
135 HANDLE events[] = { io_event->handle(), cancel_event->handle() }; | 135 HANDLE events[] = { io_event->handle(), cancel_event->handle() }; |
136 int wait_result = WaitForMultipleObjects( | 136 int wait_result = WaitForMultipleObjects( |
137 arraysize(events), events, FALSE, timeout_in_ms); | 137 arraysize(events), events, FALSE, timeout_in_ms); |
138 if (wait_result == (WAIT_OBJECT_0 + 0)) { | 138 if (wait_result == (WAIT_OBJECT_0 + 0)) { |
139 GetOverlappedResult(file, &ol, &len, TRUE); | 139 GetOverlappedResult(file, &ol, &len, TRUE); |
140 } else if (wait_result == (WAIT_OBJECT_0 + 1)) { | 140 } else if (wait_result == (WAIT_OBJECT_0 + 1)) { |
141 VLOG(1) << "Shutdown was signaled. Closing socket."; | 141 DVLOG(1) << "Shutdown was signaled. Closing socket."; |
142 CancelIo(file); | 142 CancelIo(file); |
143 socket->Close(); | 143 socket->Close(); |
144 count = 0; | 144 count = 0; |
145 break; | 145 break; |
146 } else { | 146 } else { |
147 // Timeout happened. | 147 // Timeout happened. |
148 DCHECK_EQ(WAIT_TIMEOUT, wait_result); | 148 DCHECK_EQ(WAIT_TIMEOUT, wait_result); |
149 if (!CancelIo(file)){ | 149 if (!CancelIo(file)) |
150 DLOG(WARNING) << "CancelIo() failed"; | 150 DLOG(WARNING) << "CancelIo() failed"; |
151 } | |
152 break; | 151 break; |
153 } | 152 } |
154 } else { | 153 } else { |
155 break; | 154 break; |
156 } | 155 } |
157 } | 156 } |
158 | 157 |
159 count += len; | 158 count += len; |
160 | 159 |
161 // Quit the operation if we can't write/read anymore. | 160 // Quit the operation if we can't write/read anymore. |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 DWORD chunk = GetNextChunkSize(count, length); | 199 DWORD chunk = GetNextChunkSize(count, length); |
201 if (WriteFile(handle_, static_cast<const char*>(buffer) + count, | 200 if (WriteFile(handle_, static_cast<const char*>(buffer) + count, |
202 chunk, &len, NULL) == FALSE) { | 201 chunk, &len, NULL) == FALSE) { |
203 return (0 < count) ? count : 0; | 202 return (0 < count) ? count : 0; |
204 } | 203 } |
205 count += len; | 204 count += len; |
206 } | 205 } |
207 return count; | 206 return count; |
208 } | 207 } |
209 | 208 |
| 209 size_t SyncSocket::ReceiveWithTimeout(void* buffer, |
| 210 size_t length, |
| 211 TimeDelta timeout) { |
| 212 NOTIMPLEMENTED(); |
| 213 return 0; |
| 214 } |
| 215 |
210 size_t SyncSocket::Receive(void* buffer, size_t length) { | 216 size_t SyncSocket::Receive(void* buffer, size_t length) { |
211 DCHECK_LE(length, kMaxMessageLength); | 217 DCHECK_LE(length, kMaxMessageLength); |
212 size_t count = 0; | 218 size_t count = 0; |
213 while (count < length) { | 219 while (count < length) { |
214 DWORD len; | 220 DWORD len; |
215 DWORD chunk = GetNextChunkSize(count, length); | 221 DWORD chunk = GetNextChunkSize(count, length); |
216 if (ReadFile(handle_, static_cast<char*>(buffer) + count, | 222 if (ReadFile(handle_, static_cast<char*>(buffer) + count, |
217 chunk, &len, NULL) == FALSE) { | 223 chunk, &len, NULL) == FALSE) { |
218 return (0 < count) ? count : 0; | 224 return (0 < count) ? count : 0; |
219 } | 225 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 } | 257 } |
252 | 258 |
253 size_t CancelableSyncSocket::Send(const void* buffer, size_t length) { | 259 size_t CancelableSyncSocket::Send(const void* buffer, size_t length) { |
254 static const DWORD kWaitTimeOutInMs = 500; | 260 static const DWORD kWaitTimeOutInMs = 500; |
255 return CancelableFileOperation( | 261 return CancelableFileOperation( |
256 &WriteFile, handle_, reinterpret_cast<const char*>(buffer), | 262 &WriteFile, handle_, reinterpret_cast<const char*>(buffer), |
257 length, &file_operation_, &shutdown_event_, this, kWaitTimeOutInMs); | 263 length, &file_operation_, &shutdown_event_, this, kWaitTimeOutInMs); |
258 } | 264 } |
259 | 265 |
260 size_t CancelableSyncSocket::Receive(void* buffer, size_t length) { | 266 size_t CancelableSyncSocket::Receive(void* buffer, size_t length) { |
261 return CancelableFileOperation(&ReadFile, handle_, | 267 return CancelableFileOperation( |
262 reinterpret_cast<char*>(buffer), length, &file_operation_, | 268 &ReadFile, handle_, reinterpret_cast<char*>(buffer), length, |
263 &shutdown_event_, this, INFINITE); | 269 &file_operation_, &shutdown_event_, this, INFINITE); |
| 270 } |
| 271 |
| 272 size_t CancelableSyncSocket::ReceiveWithTimeout(void* buffer, |
| 273 size_t length, |
| 274 base::TimeDelta timeout) { |
| 275 return CancelableFileOperation( |
| 276 &ReadFile, handle_, reinterpret_cast<char*>(buffer), length, |
| 277 &file_operation_, &shutdown_event_, this, timeout.InMilliseconds()); |
264 } | 278 } |
265 | 279 |
266 // static | 280 // static |
267 bool CancelableSyncSocket::CreatePair(CancelableSyncSocket* socket_a, | 281 bool CancelableSyncSocket::CreatePair(CancelableSyncSocket* socket_a, |
268 CancelableSyncSocket* socket_b) { | 282 CancelableSyncSocket* socket_b) { |
269 return CreatePairImpl(&socket_a->handle_, &socket_b->handle_, true); | 283 return CreatePairImpl(&socket_a->handle_, &socket_b->handle_, true); |
270 } | 284 } |
271 | 285 |
272 | 286 |
273 } // namespace base | 287 } // namespace base |
OLD | NEW |