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

Side by Side Diff: base/sync_socket_posix.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
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 <errno.h> 7 #include <errno.h>
8 #include <limits.h> 8 #include <limits.h>
9 #include <fcntl.h> 9 #include <fcntl.h>
10 #include <stdio.h> 10 #include <stdio.h>
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 } 101 }
102 102
103 size_t SyncSocket::Receive(void* buffer, size_t length) { 103 size_t SyncSocket::Receive(void* buffer, size_t length) {
104 DCHECK_LE(length, kMaxMessageLength); 104 DCHECK_LE(length, kMaxMessageLength);
105 char* charbuffer = static_cast<char*>(buffer); 105 char* charbuffer = static_cast<char*>(buffer);
106 if (file_util::ReadFromFD(handle_, charbuffer, length)) 106 if (file_util::ReadFromFD(handle_, charbuffer, length))
107 return length; 107 return length;
108 return 0; 108 return 0;
109 } 109 }
110 110
111 size_t SyncSocket::ReceiveWithTimeout(void* buffer,
112 size_t length,
113 TimeDelta timeout) {
114 fd_set rfds;
115 FD_ZERO(&rfds);
116 FD_SET(handle_, &rfds);
117
118 DCHECK(timeout.InMicroseconds() < Time::kMicrosecondsPerSecond);
awong 2013/09/17 18:54:12 nit: DCHECK_LT?
DaleCurtis 2013/09/17 19:00:25 Doesn't work for some reason, ends up with a link
awong 2013/09/17 19:57:11 Oh right. It's cause there isn't a definition for
119 struct timeval timeout_struct = { 0, timeout.InMicroseconds() };
120
121 int select_result = HANDLE_EINTR(
122 select(handle_ + 1, &rfds, NULL, NULL, &timeout_struct));
123
124 if (select_result > 0) {
125 DCHECK(FD_ISSET(handle_, &rfds));
126 DCHECK_GE(Peek(), length);
awong 2013/09/17 18:54:12 Why do we think Peek() can't be less than length?
DaleCurtis 2013/09/17 19:00:25 Correct, I'll remove the condition. For its inten
awong 2013/09/17 19:57:11 Do you want to read the amount from Peek() or the
DaleCurtis 2013/09/17 20:13:44 To be perfect this should be a while loop which ru
127 return Receive(buffer, length);
128 }
129
130 return 0;
131 }
132
111 size_t SyncSocket::Peek() { 133 size_t SyncSocket::Peek() {
112 int number_chars; 134 int number_chars;
113 if (-1 == ioctl(handle_, FIONREAD, &number_chars)) { 135 if (-1 == ioctl(handle_, FIONREAD, &number_chars)) {
114 // If there is an error in ioctl, signal that the channel would block. 136 // If there is an error in ioctl, signal that the channel would block.
115 return 0; 137 return 0;
116 } 138 }
117 return (size_t) number_chars; 139 return (size_t) number_chars;
118 } 140 }
119 141
120 CancelableSyncSocket::CancelableSyncSocket() {} 142 CancelableSyncSocket::CancelableSyncSocket() {}
(...skipping 24 matching lines...) Expand all
145 return len; 167 return len;
146 } 168 }
147 169
148 // static 170 // static
149 bool CancelableSyncSocket::CreatePair(CancelableSyncSocket* socket_a, 171 bool CancelableSyncSocket::CreatePair(CancelableSyncSocket* socket_a,
150 CancelableSyncSocket* socket_b) { 172 CancelableSyncSocket* socket_b) {
151 return SyncSocket::CreatePair(socket_a, socket_b); 173 return SyncSocket::CreatePair(socket_a, socket_b);
152 } 174 }
153 175
154 } // namespace base 176 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698