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

Side by Side Diff: net/socket/tcp_client_socket_libevent.cc

Issue 6990036: Deciding best connection to schedule requests on based on cwnd and idle time (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 9 years, 6 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/socket/tcp_client_socket.h" 5 #include "net/socket/tcp_client_socket.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <fcntl.h> 8 #include <fcntl.h>
9 #include <netdb.h> 9 #include <netdb.h>
10 #include <sys/socket.h> 10 #include <sys/socket.h>
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 212
213 next_connect_state_ = CONNECT_STATE_CONNECT_COMPLETE; 213 next_connect_state_ = CONNECT_STATE_CONNECT_COMPLETE;
214 214
215 // Create a non-blocking socket. 215 // Create a non-blocking socket.
216 connect_os_error_ = CreateSocket(current_ai_); 216 connect_os_error_ = CreateSocket(current_ai_);
217 if (connect_os_error_) 217 if (connect_os_error_)
218 return MapSystemError(connect_os_error_); 218 return MapSystemError(connect_os_error_);
219 219
220 // Connect the socket. 220 // Connect the socket.
221 if (!use_tcp_fastopen_) { 221 if (!use_tcp_fastopen_) {
222 connect_start_time_ = base::Time::Now();
222 if (!HANDLE_EINTR(connect(socket_, current_ai_->ai_addr, 223 if (!HANDLE_EINTR(connect(socket_, current_ai_->ai_addr,
223 static_cast<int>(current_ai_->ai_addrlen)))) { 224 static_cast<int>(current_ai_->ai_addrlen)))) {
224 // Connected without waiting! 225 // Connected without waiting!
225 return OK; 226 return OK;
226 } 227 }
227 } else { 228 } else {
228 // With TCP FastOpen, we pretend that the socket is connected. 229 // With TCP FastOpen, we pretend that the socket is connected.
229 DCHECK(!tcp_fastopen_connected_); 230 DCHECK(!tcp_fastopen_connected_);
230 return OK; 231 return OK;
231 } 232 }
(...skipping 21 matching lines...) Expand all
253 int os_error = connect_os_error_; 254 int os_error = connect_os_error_;
254 connect_os_error_ = 0; 255 connect_os_error_ = 0;
255 scoped_refptr<NetLog::EventParameters> params; 256 scoped_refptr<NetLog::EventParameters> params;
256 if (result != OK) 257 if (result != OK)
257 params = new NetLogIntegerParameter("os_error", os_error); 258 params = new NetLogIntegerParameter("os_error", os_error);
258 net_log_.EndEvent(NetLog::TYPE_TCP_CONNECT_ATTEMPT, params); 259 net_log_.EndEvent(NetLog::TYPE_TCP_CONNECT_ATTEMPT, params);
259 260
260 write_socket_watcher_.StopWatchingFileDescriptor(); 261 write_socket_watcher_.StopWatchingFileDescriptor();
261 262
262 if (result == OK) { 263 if (result == OK) {
264 rtt_ms_ = static_cast<double>((base::Time::Now() -
265 connect_start_time_).InMicroseconds())
266 / 1000.0;
263 use_history_.set_was_ever_connected(); 267 use_history_.set_was_ever_connected();
264 return OK; // Done! 268 return OK; // Done!
265 } 269 }
266 270
267 // Close whatever partially connected socket we currently have. 271 // Close whatever partially connected socket we currently have.
268 DoDisconnect(); 272 DoDisconnect();
269 273
270 // Try to fall back to the next address in the list. 274 // Try to fall back to the next address in the list.
271 if (current_ai_->ai_next) { 275 if (current_ai_->ai_next) {
272 next_connect_state_ = CONNECT_STATE_CONNECT; 276 next_connect_state_ = CONNECT_STATE_CONNECT;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 DCHECK(!waiting_connect()); 346 DCHECK(!waiting_connect());
343 DCHECK(!read_callback_); 347 DCHECK(!read_callback_);
344 // Synchronous operation not supported 348 // Synchronous operation not supported
345 DCHECK(callback); 349 DCHECK(callback);
346 DCHECK_GT(buf_len, 0); 350 DCHECK_GT(buf_len, 0);
347 351
348 int nread = HANDLE_EINTR(read(socket_, buf->data(), buf_len)); 352 int nread = HANDLE_EINTR(read(socket_, buf->data(), buf_len));
349 if (nread >= 0) { 353 if (nread >= 0) {
350 base::StatsCounter read_bytes("tcp.read_bytes"); 354 base::StatsCounter read_bytes("tcp.read_bytes");
351 read_bytes.Add(nread); 355 read_bytes.Add(nread);
356 num_bytes_read_ += nread;
352 if (nread > 0) 357 if (nread > 0)
353 use_history_.set_was_used_to_convey_data(); 358 use_history_.set_was_used_to_convey_data();
354 LogByteTransfer( 359 LogByteTransfer(
355 net_log_, NetLog::TYPE_SOCKET_BYTES_RECEIVED, nread, buf->data()); 360 net_log_, NetLog::TYPE_SOCKET_BYTES_RECEIVED, nread, buf->data());
356 return nread; 361 return nread;
357 } 362 }
358 if (errno != EAGAIN && errno != EWOULDBLOCK) { 363 if (errno != EAGAIN && errno != EWOULDBLOCK) {
359 DVLOG(1) << "read failed, errno " << errno; 364 DVLOG(1) << "read failed, errno " << errno;
360 return MapSystemError(errno); 365 return MapSystemError(errno);
361 } 366 }
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
650 655
651 bool TCPClientSocketLibevent::WasEverUsed() const { 656 bool TCPClientSocketLibevent::WasEverUsed() const {
652 return use_history_.was_used_to_convey_data(); 657 return use_history_.was_used_to_convey_data();
653 } 658 }
654 659
655 bool TCPClientSocketLibevent::UsingTCPFastOpen() const { 660 bool TCPClientSocketLibevent::UsingTCPFastOpen() const {
656 return use_tcp_fastopen_; 661 return use_tcp_fastopen_;
657 } 662 }
658 663
659 } // namespace net 664 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698