OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/client_socket_pool_base.h" | 5 #include "net/socket/client_socket_pool_base.h" |
6 | 6 |
7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
8 #include "base/format_macros.h" | 8 #include "base/format_macros.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/stats_counters.h" | 10 #include "base/stats_counters.h" |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 : handle_(handle), callback_(callback), priority_(priority), | 121 : handle_(handle), callback_(callback), priority_(priority), |
122 net_log_(net_log) {} | 122 net_log_(net_log) {} |
123 | 123 |
124 ClientSocketPoolBaseHelper::Request::~Request() {} | 124 ClientSocketPoolBaseHelper::Request::~Request() {} |
125 | 125 |
126 ClientSocketPoolBaseHelper::ClientSocketPoolBaseHelper( | 126 ClientSocketPoolBaseHelper::ClientSocketPoolBaseHelper( |
127 int max_sockets, | 127 int max_sockets, |
128 int max_sockets_per_group, | 128 int max_sockets_per_group, |
129 base::TimeDelta unused_idle_socket_timeout, | 129 base::TimeDelta unused_idle_socket_timeout, |
130 base::TimeDelta used_idle_socket_timeout, | 130 base::TimeDelta used_idle_socket_timeout, |
131 ConnectJobFactory* connect_job_factory, | 131 ConnectJobFactory* connect_job_factory) |
132 NetworkChangeNotifier* network_change_notifier) | |
133 : idle_socket_count_(0), | 132 : idle_socket_count_(0), |
134 connecting_socket_count_(0), | 133 connecting_socket_count_(0), |
135 handed_out_socket_count_(0), | 134 handed_out_socket_count_(0), |
136 num_releasing_sockets_(0), | 135 num_releasing_sockets_(0), |
137 max_sockets_(max_sockets), | 136 max_sockets_(max_sockets), |
138 max_sockets_per_group_(max_sockets_per_group), | 137 max_sockets_per_group_(max_sockets_per_group), |
139 unused_idle_socket_timeout_(unused_idle_socket_timeout), | 138 unused_idle_socket_timeout_(unused_idle_socket_timeout), |
140 used_idle_socket_timeout_(used_idle_socket_timeout), | 139 used_idle_socket_timeout_(used_idle_socket_timeout), |
141 may_have_stalled_group_(false), | 140 may_have_stalled_group_(false), |
142 connect_job_factory_(connect_job_factory), | 141 connect_job_factory_(connect_job_factory), |
143 network_change_notifier_(network_change_notifier), | |
144 backup_jobs_enabled_(false), | 142 backup_jobs_enabled_(false), |
145 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)), | 143 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)), |
146 pool_generation_number_(0) { | 144 pool_generation_number_(0) { |
147 DCHECK_LE(0, max_sockets_per_group); | 145 DCHECK_LE(0, max_sockets_per_group); |
148 DCHECK_LE(max_sockets_per_group, max_sockets); | 146 DCHECK_LE(max_sockets_per_group, max_sockets); |
149 | 147 |
150 if (network_change_notifier_) | 148 NetworkChangeNotifier::AddObserver(this); |
151 network_change_notifier_->AddObserver(this); | |
152 } | 149 } |
153 | 150 |
154 ClientSocketPoolBaseHelper::~ClientSocketPoolBaseHelper() { | 151 ClientSocketPoolBaseHelper::~ClientSocketPoolBaseHelper() { |
155 CancelAllConnectJobs(); | 152 CancelAllConnectJobs(); |
156 | 153 |
157 // Clean up any idle sockets. Assert that we have no remaining active | 154 // Clean up any idle sockets. Assert that we have no remaining active |
158 // sockets or pending requests. They should have all been cleaned up prior | 155 // sockets or pending requests. They should have all been cleaned up prior |
159 // to the manager being destroyed. | 156 // to the manager being destroyed. |
160 CloseIdleSockets(); | 157 CloseIdleSockets(); |
161 CHECK(group_map_.empty()); | 158 CHECK(group_map_.empty()); |
162 DCHECK_EQ(0, connecting_socket_count_); | 159 DCHECK_EQ(0, connecting_socket_count_); |
163 | 160 |
164 if (network_change_notifier_) | 161 NetworkChangeNotifier::RemoveObserver(this); |
165 network_change_notifier_->RemoveObserver(this); | |
166 } | 162 } |
167 | 163 |
168 // InsertRequestIntoQueue inserts the request into the queue based on | 164 // InsertRequestIntoQueue inserts the request into the queue based on |
169 // priority. Highest priorities are closest to the front. Older requests are | 165 // priority. Highest priorities are closest to the front. Older requests are |
170 // prioritized over requests of equal priority. | 166 // prioritized over requests of equal priority. |
171 // | 167 // |
172 // static | 168 // static |
173 void ClientSocketPoolBaseHelper::InsertRequestIntoQueue( | 169 void ClientSocketPoolBaseHelper::InsertRequestIntoQueue( |
174 const Request* r, RequestQueue* pending_requests) { | 170 const Request* r, RequestQueue* pending_requests) { |
175 RequestQueue::iterator it = pending_requests->begin(); | 171 RequestQueue::iterator it = pending_requests->begin(); |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 void ClientSocketPoolBaseHelper::ReleaseSocket(const std::string& group_name, | 372 void ClientSocketPoolBaseHelper::ReleaseSocket(const std::string& group_name, |
377 ClientSocket* socket, | 373 ClientSocket* socket, |
378 int id) { | 374 int id) { |
379 Group& group = group_map_[group_name]; | 375 Group& group = group_map_[group_name]; |
380 group.num_releasing_sockets++; | 376 group.num_releasing_sockets++; |
381 num_releasing_sockets_++; | 377 num_releasing_sockets_++; |
382 DCHECK_LE(group.num_releasing_sockets, group.active_socket_count); | 378 DCHECK_LE(group.num_releasing_sockets, group.active_socket_count); |
383 // Run this asynchronously to allow the caller to finish before we let | 379 // Run this asynchronously to allow the caller to finish before we let |
384 // another to begin doing work. This also avoids nasty recursion issues. | 380 // another to begin doing work. This also avoids nasty recursion issues. |
385 // NOTE: We cannot refer to the handle argument after this method returns. | 381 // NOTE: We cannot refer to the handle argument after this method returns. |
386 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( | 382 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod(this, |
387 this, &ClientSocketPoolBaseHelper::DoReleaseSocket, group_name, socket, id
)); | 383 &ClientSocketPoolBaseHelper::DoReleaseSocket, group_name, socket, id)); |
388 } | 384 } |
389 | 385 |
390 void ClientSocketPoolBaseHelper::CloseIdleSockets() { | 386 void ClientSocketPoolBaseHelper::CloseIdleSockets() { |
391 CleanupIdleSockets(true); | 387 CleanupIdleSockets(true); |
392 } | 388 } |
393 | 389 |
394 int ClientSocketPoolBaseHelper::IdleSocketCountInGroup( | 390 int ClientSocketPoolBaseHelper::IdleSocketCountInGroup( |
395 const std::string& group_name) const { | 391 const std::string& group_name) const { |
396 GroupMap::const_iterator i = group_map_.find(group_name); | 392 GroupMap::const_iterator i = group_map_.find(group_name); |
397 CHECK(i != group_map_.end()); | 393 CHECK(i != group_map_.end()); |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
633 group.pending_requests.begin(), &group.pending_requests)); | 629 group.pending_requests.begin(), &group.pending_requests)); |
634 LogBoundConnectJobToRequest(job_log.source(), r.get()); | 630 LogBoundConnectJobToRequest(job_log.source(), r.get()); |
635 r->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL, | 631 r->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL, |
636 new NetLogIntegerParameter("net_error", result)); | 632 new NetLogIntegerParameter("net_error", result)); |
637 r->callback()->Run(result); | 633 r->callback()->Run(result); |
638 } | 634 } |
639 MaybeOnAvailableSocketSlot(group_name); | 635 MaybeOnAvailableSocketSlot(group_name); |
640 } | 636 } |
641 } | 637 } |
642 | 638 |
| 639 void ClientSocketPoolBaseHelper::OnIPAddressChanged() { |
| 640 Flush(); |
| 641 } |
| 642 |
643 void ClientSocketPoolBaseHelper::Flush() { | 643 void ClientSocketPoolBaseHelper::Flush() { |
644 pool_generation_number_++; | 644 pool_generation_number_++; |
645 CancelAllConnectJobs(); | 645 CancelAllConnectJobs(); |
646 CloseIdleSockets(); | 646 CloseIdleSockets(); |
647 } | 647 } |
648 | 648 |
649 void ClientSocketPoolBaseHelper::RemoveConnectJob(const ConnectJob *job, | 649 void ClientSocketPoolBaseHelper::RemoveConnectJob(const ConnectJob *job, |
650 Group* group) { | 650 Group* group) { |
651 CHECK_GT(connecting_socket_count_, 0); | 651 CHECK_GT(connecting_socket_count_, 0); |
652 connecting_socket_count_--; | 652 connecting_socket_count_--; |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
801 return; | 801 return; |
802 } | 802 } |
803 } | 803 } |
804 | 804 |
805 LOG(DFATAL) << "No idle socket found to close!."; | 805 LOG(DFATAL) << "No idle socket found to close!."; |
806 } | 806 } |
807 | 807 |
808 } // namespace internal | 808 } // namespace internal |
809 | 809 |
810 } // namespace net | 810 } // namespace net |
OLD | NEW |