Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(160)

Side by Side Diff: base/sync_socket_win.cc

Issue 23875019: Add SyncSocket::ReceiveWithTimeout() and SyncSocket unit tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« base/sync_socket_unittest.cc ('K') | « base/sync_socket_unittest.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« base/sync_socket_unittest.cc ('K') | « base/sync_socket_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698