Chromium Code Reviews| 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 // A ClientSocketPoolBase is used to restrict the number of sockets open at | 5 // A ClientSocketPoolBase is used to restrict the number of sockets open at |
| 6 // a time. It also maintains a list of idle persistent sockets for reuse. | 6 // a time. It also maintains a list of idle persistent sockets for reuse. |
| 7 // Subclasses of ClientSocketPool should compose ClientSocketPoolBase to handle | 7 // Subclasses of ClientSocketPool should compose ClientSocketPoolBase to handle |
| 8 // the core logic of (1) restricting the number of active (connected or | 8 // the core logic of (1) restricting the number of active (connected or |
| 9 // connecting) sockets per "group" (generally speaking, the hostname), (2) | 9 // connecting) sockets per "group" (generally speaking, the hostname), (2) |
| 10 // maintaining a per-group list of idle, persistent sockets for reuse, and (3) | 10 // maintaining a per-group list of idle, persistent sockets for reuse, and (3) |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 105 // result) this method will be called, allowing the pool to add | 105 // result) this method will be called, allowing the pool to add |
| 106 // additional error state to the ClientSocketHandle (post late-binding). | 106 // additional error state to the ClientSocketHandle (post late-binding). |
| 107 virtual void GetAdditionalErrorState(ClientSocketHandle* handle) {} | 107 virtual void GetAdditionalErrorState(ClientSocketHandle* handle) {} |
| 108 | 108 |
| 109 const LoadTimingInfo::ConnectTiming& connect_timing() const { | 109 const LoadTimingInfo::ConnectTiming& connect_timing() const { |
| 110 return connect_timing_; | 110 return connect_timing_; |
| 111 } | 111 } |
| 112 | 112 |
| 113 const BoundNetLog& net_log() const { return net_log_; } | 113 const BoundNetLog& net_log() const { return net_log_; } |
| 114 | 114 |
| 115 // Used to order ConnectJob in a set with ascending connect time. | |
| 116 struct CompareJobConnectStartTime { | |
| 117 bool operator()(const ConnectJob* lhs, const ConnectJob* rhs) const { | |
| 118 return lhs->connect_timing().connect_start < | |
| 119 rhs->connect_timing().connect_start; | |
| 120 } | |
|
mmenke
2015/04/17 15:32:39
Also, should probably have two tests for this (In
mmenke
2015/04/17 15:32:40
If two ConnectJob are created at the same time, do
haavardm
2015/04/18 07:24:16
Agree. Using something else than a set here is pro
haavardm
2015/04/18 07:24:16
Yes, I discovered yesterday that that's exactly wh
mmenke
2015/04/18 13:49:57
That's probably because connect_start times can ch
haavardm
2015/04/20 13:03:48
Not sure I get this test. As I understand it, sock
haavardm
2015/04/20 13:03:48
I removed the compare function since list is now u
mmenke
2015/04/20 14:49:16
I was thinking SSL sockets, where more is needed a
| |
| 121 }; | |
| 122 | |
| 115 protected: | 123 protected: |
| 116 RequestPriority priority() const { return priority_; } | 124 RequestPriority priority() const { return priority_; } |
| 117 void SetSocket(scoped_ptr<StreamSocket> socket); | 125 void SetSocket(scoped_ptr<StreamSocket> socket); |
| 118 StreamSocket* socket() { return socket_.get(); } | 126 StreamSocket* socket() { return socket_.get(); } |
| 119 void NotifyDelegateOfCompletion(int rv); | 127 void NotifyDelegateOfCompletion(int rv); |
| 120 void ResetTimer(base::TimeDelta remainingTime); | 128 void ResetTimer(base::TimeDelta remainingTime); |
| 121 | 129 |
| 122 // Connection establishment timing information. | 130 // Connection establishment timing information. |
| 123 LoadTimingInfo::ConnectTiming connect_timing_; | 131 LoadTimingInfo::ConnectTiming connect_timing_; |
| 124 | 132 |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 443 | 451 |
| 444 // Finds the pending request for |handle| and removes it. Returns | 452 // Finds the pending request for |handle| and removes it. Returns |
| 445 // the removed pending request, or NULL if there was none. | 453 // the removed pending request, or NULL if there was none. |
| 446 scoped_ptr<const Request> FindAndRemovePendingRequest( | 454 scoped_ptr<const Request> FindAndRemovePendingRequest( |
| 447 ClientSocketHandle* handle); | 455 ClientSocketHandle* handle); |
| 448 | 456 |
| 449 void IncrementActiveSocketCount() { active_socket_count_++; } | 457 void IncrementActiveSocketCount() { active_socket_count_++; } |
| 450 void DecrementActiveSocketCount() { active_socket_count_--; } | 458 void DecrementActiveSocketCount() { active_socket_count_--; } |
| 451 | 459 |
| 452 int unassigned_job_count() const { return unassigned_job_count_; } | 460 int unassigned_job_count() const { return unassigned_job_count_; } |
| 453 const std::set<ConnectJob*>& jobs() const { return jobs_; } | 461 const std::set<ConnectJob*, ConnectJob::CompareJobConnectStartTime>& jobs() |
| 462 const { | |
| 463 return jobs_; | |
| 464 } | |
| 454 const std::list<IdleSocket>& idle_sockets() const { return idle_sockets_; } | 465 const std::list<IdleSocket>& idle_sockets() const { return idle_sockets_; } |
| 455 int active_socket_count() const { return active_socket_count_; } | 466 int active_socket_count() const { return active_socket_count_; } |
| 456 std::list<IdleSocket>* mutable_idle_sockets() { return &idle_sockets_; } | 467 std::list<IdleSocket>* mutable_idle_sockets() { return &idle_sockets_; } |
| 457 | 468 |
| 458 private: | 469 private: |
| 459 // Returns the iterator's pending request after removing it from | 470 // Returns the iterator's pending request after removing it from |
| 460 // the queue. | 471 // the queue. |
| 461 scoped_ptr<const Request> RemovePendingRequest( | 472 scoped_ptr<const Request> RemovePendingRequest( |
| 462 const RequestQueue::Pointer& pointer); | 473 const RequestQueue::Pointer& pointer); |
| 463 | 474 |
| 464 // Called when the backup socket timer fires. | 475 // Called when the backup socket timer fires. |
| 465 void OnBackupJobTimerFired( | 476 void OnBackupJobTimerFired( |
| 466 std::string group_name, | 477 std::string group_name, |
| 467 ClientSocketPoolBaseHelper* pool); | 478 ClientSocketPoolBaseHelper* pool); |
| 468 | 479 |
| 469 // Checks that |unassigned_job_count_| does not execeed the number of | 480 // Checks that |unassigned_job_count_| does not execeed the number of |
| 470 // ConnectJobs. | 481 // ConnectJobs. |
| 471 void SanityCheck(); | 482 void SanityCheck(); |
| 472 | 483 |
| 473 // Total number of ConnectJobs that have never been assigned to a Request. | 484 // Total number of ConnectJobs that have never been assigned to a Request. |
| 474 // Since jobs use late binding to requests, which ConnectJobs have or have | 485 // Since jobs use late binding to requests, which ConnectJobs have or have |
| 475 // not been assigned to a request are not tracked. This is incremented on | 486 // not been assigned to a request are not tracked. This is incremented on |
| 476 // preconnect and decremented when a preconnect is assigned, or when there | 487 // preconnect and decremented when a preconnect is assigned, or when there |
| 477 // are fewer than |unassigned_job_count_| ConnectJobs. Not incremented | 488 // are fewer than |unassigned_job_count_| ConnectJobs. Not incremented |
| 478 // when a request is cancelled. | 489 // when a request is cancelled. |
| 479 size_t unassigned_job_count_; | 490 size_t unassigned_job_count_; |
| 480 | 491 |
| 481 std::list<IdleSocket> idle_sockets_; | 492 std::list<IdleSocket> idle_sockets_; |
| 482 std::set<ConnectJob*> jobs_; | 493 std::set<ConnectJob*, ConnectJob::CompareJobConnectStartTime> jobs_; |
| 483 RequestQueue pending_requests_; | 494 RequestQueue pending_requests_; |
| 484 int active_socket_count_; // number of active sockets used by clients | 495 int active_socket_count_; // number of active sockets used by clients |
| 485 // A timer for when to start the backup job. | 496 // A timer for when to start the backup job. |
| 486 base::OneShotTimer<Group> backup_job_timer_; | 497 base::OneShotTimer<Group> backup_job_timer_; |
| 487 }; | 498 }; |
| 488 | 499 |
| 489 typedef std::map<std::string, Group*> GroupMap; | 500 typedef std::map<std::string, Group*> GroupMap; |
| 490 | 501 |
| 491 typedef std::set<ConnectJob*> ConnectJobSet; | 502 typedef std::set<ConnectJob*> ConnectJobSet; |
| 492 | 503 |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 865 }; | 876 }; |
| 866 | 877 |
| 867 internal::ClientSocketPoolBaseHelper helper_; | 878 internal::ClientSocketPoolBaseHelper helper_; |
| 868 | 879 |
| 869 DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolBase); | 880 DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolBase); |
| 870 }; | 881 }; |
| 871 | 882 |
| 872 } // namespace net | 883 } // namespace net |
| 873 | 884 |
| 874 #endif // NET_SOCKET_CLIENT_SOCKET_POOL_BASE_H_ | 885 #endif // NET_SOCKET_CLIENT_SOCKET_POOL_BASE_H_ |
| OLD | NEW |