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

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

Issue 11464028: Introduce ERR_NETWORK_CHANGED and allow URLFetcher to automatically retry on that error. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed nits Created 8 years 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
« 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) 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 "net/socket/client_socket_pool_base.h" 5 #include "net/socket/client_socket_pool_base.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 #include "base/compiler_specific.h" 8 #include "base/compiler_specific.h"
9 #include "base/format_macros.h" 9 #include "base/format_macros.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 DCHECK_LE(0, max_sockets_per_group); 182 DCHECK_LE(0, max_sockets_per_group);
183 DCHECK_LE(max_sockets_per_group, max_sockets); 183 DCHECK_LE(max_sockets_per_group, max_sockets);
184 184
185 NetworkChangeNotifier::AddIPAddressObserver(this); 185 NetworkChangeNotifier::AddIPAddressObserver(this);
186 } 186 }
187 187
188 ClientSocketPoolBaseHelper::~ClientSocketPoolBaseHelper() { 188 ClientSocketPoolBaseHelper::~ClientSocketPoolBaseHelper() {
189 // Clean up any idle sockets and pending connect jobs. Assert that we have no 189 // Clean up any idle sockets and pending connect jobs. Assert that we have no
190 // remaining active sockets or pending requests. They should have all been 190 // remaining active sockets or pending requests. They should have all been
191 // cleaned up prior to |this| being destroyed. 191 // cleaned up prior to |this| being destroyed.
192 Flush(); 192 FlushWithError(ERR_ABORTED);
193 DCHECK(group_map_.empty()); 193 DCHECK(group_map_.empty());
194 DCHECK(pending_callback_map_.empty()); 194 DCHECK(pending_callback_map_.empty());
195 DCHECK_EQ(0, connecting_socket_count_); 195 DCHECK_EQ(0, connecting_socket_count_);
196 CHECK(higher_layer_pools_.empty()); 196 CHECK(higher_layer_pools_.empty());
197 197
198 NetworkChangeNotifier::RemoveIPAddressObserver(this); 198 NetworkChangeNotifier::RemoveIPAddressObserver(this);
199 } 199 }
200 200
201 ClientSocketPoolBaseHelper::CallbackResultPair::CallbackResultPair() 201 ClientSocketPoolBaseHelper::CallbackResultPair::CallbackResultPair()
202 : result(OK) { 202 : result(OK) {
(...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 RemoveConnectJob(job, group); 896 RemoveConnectJob(job, group);
897 } 897 }
898 if (!handed_out_socket) { 898 if (!handed_out_socket) {
899 OnAvailableSocketSlot(group_name, group); 899 OnAvailableSocketSlot(group_name, group);
900 CheckForStalledSocketGroups(); 900 CheckForStalledSocketGroups();
901 } 901 }
902 } 902 }
903 } 903 }
904 904
905 void ClientSocketPoolBaseHelper::OnIPAddressChanged() { 905 void ClientSocketPoolBaseHelper::OnIPAddressChanged() {
906 Flush(); 906 FlushWithError(ERR_NETWORK_CHANGED);
907 } 907 }
908 908
909 void ClientSocketPoolBaseHelper::Flush() { 909 void ClientSocketPoolBaseHelper::FlushWithError(int error) {
910 pool_generation_number_++; 910 pool_generation_number_++;
911 CancelAllConnectJobs(); 911 CancelAllConnectJobs();
912 CloseIdleSockets(); 912 CloseIdleSockets();
913 AbortAllRequests(); 913 CancelAllRequestsWithError(error);
914 } 914 }
915 915
916 bool ClientSocketPoolBaseHelper::IsStalled() const { 916 bool ClientSocketPoolBaseHelper::IsStalled() const {
917 // If we are not using |max_sockets_|, then clearly we are not stalled 917 // If we are not using |max_sockets_|, then clearly we are not stalled
918 if ((handed_out_socket_count_ + connecting_socket_count_) < max_sockets_) 918 if ((handed_out_socket_count_ + connecting_socket_count_) < max_sockets_)
919 return false; 919 return false;
920 // So in order to be stalled we need to be using |max_sockets_| AND 920 // So in order to be stalled we need to be using |max_sockets_| AND
921 // we need to have a request that is actually stalled on the global 921 // we need to have a request that is actually stalled on the global
922 // socket limit. To find such a request, we look for a group that 922 // socket limit. To find such a request, we look for a group that
923 // a has more requests that jobs AND where the number of jobs is less 923 // a has more requests that jobs AND where the number of jobs is less
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1024 // but i will already have been incremented to a valid iterator before 1024 // but i will already have been incremented to a valid iterator before
1025 // RemoveGroup() is called. 1025 // RemoveGroup() is called.
1026 RemoveGroup(i++); 1026 RemoveGroup(i++);
1027 } else { 1027 } else {
1028 ++i; 1028 ++i;
1029 } 1029 }
1030 } 1030 }
1031 DCHECK_EQ(0, connecting_socket_count_); 1031 DCHECK_EQ(0, connecting_socket_count_);
1032 } 1032 }
1033 1033
1034 void ClientSocketPoolBaseHelper::AbortAllRequests() { 1034 void ClientSocketPoolBaseHelper::CancelAllRequestsWithError(int error) {
1035 for (GroupMap::iterator i = group_map_.begin(); i != group_map_.end();) { 1035 for (GroupMap::iterator i = group_map_.begin(); i != group_map_.end();) {
1036 Group* group = i->second; 1036 Group* group = i->second;
1037 1037
1038 RequestQueue pending_requests; 1038 RequestQueue pending_requests;
1039 pending_requests.swap(*group->mutable_pending_requests()); 1039 pending_requests.swap(*group->mutable_pending_requests());
1040 for (RequestQueue::iterator it2 = pending_requests.begin(); 1040 for (RequestQueue::iterator it2 = pending_requests.begin();
1041 it2 != pending_requests.end(); ++it2) { 1041 it2 != pending_requests.end(); ++it2) {
1042 scoped_ptr<const Request> request(*it2); 1042 scoped_ptr<const Request> request(*it2);
1043 InvokeUserCallbackLater( 1043 InvokeUserCallbackLater(
1044 request->handle(), request->callback(), ERR_ABORTED); 1044 request->handle(), request->callback(), error);
1045 } 1045 }
1046 1046
1047 // Delete group if no longer needed. 1047 // Delete group if no longer needed.
1048 if (group->IsEmpty()) { 1048 if (group->IsEmpty()) {
1049 // RemoveGroup() will call .erase() which will invalidate the iterator, 1049 // RemoveGroup() will call .erase() which will invalidate the iterator,
1050 // but i will already have been incremented to a valid iterator before 1050 // but i will already have been incremented to a valid iterator before
1051 // RemoveGroup() is called. 1051 // RemoveGroup() is called.
1052 RemoveGroup(i++); 1052 RemoveGroup(i++);
1053 } else { 1053 } else {
1054 ++i; 1054 ++i;
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1229 STLDeleteElements(&jobs_); 1229 STLDeleteElements(&jobs_);
1230 unassigned_job_count_ = 0; 1230 unassigned_job_count_ = 0;
1231 1231
1232 // Cancel pending backup job. 1232 // Cancel pending backup job.
1233 weak_factory_.InvalidateWeakPtrs(); 1233 weak_factory_.InvalidateWeakPtrs();
1234 } 1234 }
1235 1235
1236 } // namespace internal 1236 } // namespace internal
1237 1237
1238 } // namespace net 1238 } // 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