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

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

Issue 1615005: Flush socket pools and SPDY session pool properly on explicit requests and network changes. (Closed)
Patch Set: Fix minor leak. Created 10 years, 8 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
« no previous file with comments | « net/socket/client_socket_pool_base.h ('k') | net/socket/client_socket_pool_base_unittest.cc » ('j') | 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) 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 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 : handle_(handle), callback_(callback), priority_(priority), 103 : handle_(handle), callback_(callback), priority_(priority),
104 net_log_(net_log) {} 104 net_log_(net_log) {}
105 105
106 ClientSocketPoolBaseHelper::Request::~Request() {} 106 ClientSocketPoolBaseHelper::Request::~Request() {}
107 107
108 ClientSocketPoolBaseHelper::ClientSocketPoolBaseHelper( 108 ClientSocketPoolBaseHelper::ClientSocketPoolBaseHelper(
109 int max_sockets, 109 int max_sockets,
110 int max_sockets_per_group, 110 int max_sockets_per_group,
111 base::TimeDelta unused_idle_socket_timeout, 111 base::TimeDelta unused_idle_socket_timeout,
112 base::TimeDelta used_idle_socket_timeout, 112 base::TimeDelta used_idle_socket_timeout,
113 ConnectJobFactory* connect_job_factory, 113 ConnectJobFactory* connect_job_factory)
114 NetworkChangeNotifier* network_change_notifier)
115 : idle_socket_count_(0), 114 : idle_socket_count_(0),
116 connecting_socket_count_(0), 115 connecting_socket_count_(0),
117 handed_out_socket_count_(0), 116 handed_out_socket_count_(0),
118 max_sockets_(max_sockets), 117 max_sockets_(max_sockets),
119 max_sockets_per_group_(max_sockets_per_group), 118 max_sockets_per_group_(max_sockets_per_group),
120 unused_idle_socket_timeout_(unused_idle_socket_timeout), 119 unused_idle_socket_timeout_(unused_idle_socket_timeout),
121 used_idle_socket_timeout_(used_idle_socket_timeout), 120 used_idle_socket_timeout_(used_idle_socket_timeout),
122 may_have_stalled_group_(false), 121 may_have_stalled_group_(false),
123 connect_job_factory_(connect_job_factory), 122 connect_job_factory_(connect_job_factory),
124 network_change_notifier_(network_change_notifier),
125 backup_jobs_enabled_(false), 123 backup_jobs_enabled_(false),
126 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { 124 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
127 DCHECK_LE(0, max_sockets_per_group); 125 DCHECK_LE(0, max_sockets_per_group);
128 DCHECK_LE(max_sockets_per_group, max_sockets); 126 DCHECK_LE(max_sockets_per_group, max_sockets);
129
130 if (network_change_notifier_)
131 network_change_notifier_->AddObserver(this);
132 } 127 }
133 128
134 ClientSocketPoolBaseHelper::~ClientSocketPoolBaseHelper() { 129 ClientSocketPoolBaseHelper::~ClientSocketPoolBaseHelper() {
135 CancelAllConnectJobs(); 130 CancelAllConnectJobs();
136 131
137 // Clean up any idle sockets. Assert that we have no remaining active 132 // Clean up any idle sockets. Assert that we have no remaining active
138 // sockets or pending requests. They should have all been cleaned up prior 133 // sockets or pending requests. They should have all been cleaned up prior
139 // to the manager being destroyed. 134 // to the manager being destroyed.
140 CloseIdleSockets(); 135 CloseIdleSockets();
141 CHECK(group_map_.empty()); 136 CHECK(group_map_.empty());
142 DCHECK_EQ(0, connecting_socket_count_); 137 DCHECK_EQ(0, connecting_socket_count_);
143
144 if (network_change_notifier_)
145 network_change_notifier_->RemoveObserver(this);
146 } 138 }
147 139
148 // InsertRequestIntoQueue inserts the request into the queue based on 140 // InsertRequestIntoQueue inserts the request into the queue based on
149 // priority. Highest priorities are closest to the front. Older requests are 141 // priority. Highest priorities are closest to the front. Older requests are
150 // prioritized over requests of equal priority. 142 // prioritized over requests of equal priority.
151 // 143 //
152 // static 144 // static
153 void ClientSocketPoolBaseHelper::InsertRequestIntoQueue( 145 void ClientSocketPoolBaseHelper::InsertRequestIntoQueue(
154 const Request* r, RequestQueue* pending_requests) { 146 const Request* r, RequestQueue* pending_requests) {
155 RequestQueue::iterator it = pending_requests->begin(); 147 RequestQueue::iterator it = pending_requests->begin();
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after
580 group.pending_requests.begin(), &group.pending_requests)); 572 group.pending_requests.begin(), &group.pending_requests));
581 r->net_log().AddEventWithInteger(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_ID, 573 r->net_log().AddEventWithInteger(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_ID,
582 job_log.source().id); 574 job_log.source().id);
583 r->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL); 575 r->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL);
584 r->callback()->Run(result); 576 r->callback()->Run(result);
585 } 577 }
586 MaybeOnAvailableSocketSlot(group_name); 578 MaybeOnAvailableSocketSlot(group_name);
587 } 579 }
588 } 580 }
589 581
590 void ClientSocketPoolBaseHelper::OnIPAddressChanged() {
591 CloseIdleSockets();
592 }
593
594 void ClientSocketPoolBaseHelper::RemoveConnectJob(const ConnectJob *job, 582 void ClientSocketPoolBaseHelper::RemoveConnectJob(const ConnectJob *job,
595 Group* group) { 583 Group* group) {
596 CHECK_GT(connecting_socket_count_, 0); 584 CHECK_GT(connecting_socket_count_, 0);
597 connecting_socket_count_--; 585 connecting_socket_count_--;
598 586
599 DCHECK(job); 587 DCHECK(job);
600 delete job; 588 delete job;
601 589
602 if (group) { 590 if (group) {
603 DCHECK(ContainsKey(group->jobs, job)); 591 DCHECK(ContainsKey(group->jobs, job));
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 bool ClientSocketPoolBaseHelper::ReachedMaxSocketsLimit() const { 702 bool ClientSocketPoolBaseHelper::ReachedMaxSocketsLimit() const {
715 // Each connecting socket will eventually connect and be handed out. 703 // Each connecting socket will eventually connect and be handed out.
716 int total = handed_out_socket_count_ + connecting_socket_count_; 704 int total = handed_out_socket_count_ + connecting_socket_count_;
717 DCHECK_LE(total, max_sockets_); 705 DCHECK_LE(total, max_sockets_);
718 return total == max_sockets_; 706 return total == max_sockets_;
719 } 707 }
720 708
721 } // namespace internal 709 } // namespace internal
722 710
723 } // namespace net 711 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/client_socket_pool_base.h ('k') | net/socket/client_socket_pool_base_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698