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/base/host_resolver_impl.h" | 5 #include "net/base/host_resolver_impl.h" |
6 | 6 |
7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
8 #include <Winsock2.h> | 8 #include <Winsock2.h> |
9 #elif defined(OS_POSIX) | 9 #elif defined(OS_POSIX) |
10 #include <netdb.h> | 10 #include <netdb.h> |
(...skipping 926 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
937 if (cur_completing_job_) | 937 if (cur_completing_job_) |
938 cur_completing_job_->Cancel(); | 938 cur_completing_job_->Cancel(); |
939 | 939 |
940 NetworkChangeNotifier::RemoveObserver(this); | 940 NetworkChangeNotifier::RemoveObserver(this); |
941 | 941 |
942 // Delete the job pools. | 942 // Delete the job pools. |
943 for (size_t i = 0u; i < arraysize(job_pools_); ++i) | 943 for (size_t i = 0u; i < arraysize(job_pools_); ++i) |
944 delete job_pools_[i]; | 944 delete job_pools_[i]; |
945 } | 945 } |
946 | 946 |
| 947 void HostResolverImpl::ProbeIPv6Support() { |
| 948 DCHECK(CalledOnValidThread()); |
| 949 DCHECK(!ipv6_probe_monitoring_); |
| 950 ipv6_probe_monitoring_ = true; |
| 951 OnIPAddressChanged(); // Give initial setup call. |
| 952 } |
| 953 |
| 954 void HostResolverImpl::SetPoolConstraints(JobPoolIndex pool_index, |
| 955 size_t max_outstanding_jobs, |
| 956 size_t max_pending_requests) { |
| 957 DCHECK(CalledOnValidThread()); |
| 958 CHECK_GE(pool_index, 0); |
| 959 CHECK_LT(pool_index, POOL_COUNT); |
| 960 CHECK(jobs_.empty()) << "Can only set constraints during setup"; |
| 961 JobPool* pool = job_pools_[pool_index]; |
| 962 pool->SetConstraints(max_outstanding_jobs, max_pending_requests); |
| 963 } |
| 964 |
947 int HostResolverImpl::Resolve(const RequestInfo& info, | 965 int HostResolverImpl::Resolve(const RequestInfo& info, |
948 AddressList* addresses, | 966 AddressList* addresses, |
949 CompletionCallback* callback, | 967 CompletionCallback* callback, |
950 RequestHandle* out_req, | 968 RequestHandle* out_req, |
951 const BoundNetLog& source_net_log) { | 969 const BoundNetLog& source_net_log) { |
952 DCHECK(CalledOnValidThread()); | 970 DCHECK(CalledOnValidThread()); |
953 | 971 |
954 if (shutdown_) | 972 if (shutdown_) |
955 return ERR_UNEXPECTED; | 973 return ERR_UNEXPECTED; |
956 | 974 |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1118 DCHECK(CalledOnValidThread()); | 1136 DCHECK(CalledOnValidThread()); |
1119 ipv6_probe_monitoring_ = false; | 1137 ipv6_probe_monitoring_ = false; |
1120 DiscardIPv6ProbeJob(); | 1138 DiscardIPv6ProbeJob(); |
1121 default_address_family_ = address_family; | 1139 default_address_family_ = address_family; |
1122 } | 1140 } |
1123 | 1141 |
1124 AddressFamily HostResolverImpl::GetDefaultAddressFamily() const { | 1142 AddressFamily HostResolverImpl::GetDefaultAddressFamily() const { |
1125 return default_address_family_; | 1143 return default_address_family_; |
1126 } | 1144 } |
1127 | 1145 |
1128 void HostResolverImpl::ProbeIPv6Support() { | |
1129 DCHECK(CalledOnValidThread()); | |
1130 DCHECK(!ipv6_probe_monitoring_); | |
1131 ipv6_probe_monitoring_ = true; | |
1132 OnIPAddressChanged(); // Give initial setup call. | |
1133 } | |
1134 | |
1135 HostResolverImpl* HostResolverImpl::GetAsHostResolverImpl() { | 1146 HostResolverImpl* HostResolverImpl::GetAsHostResolverImpl() { |
1136 return this; | 1147 return this; |
1137 } | 1148 } |
1138 | 1149 |
1139 void HostResolverImpl::Shutdown() { | 1150 void HostResolverImpl::Shutdown() { |
1140 DCHECK(CalledOnValidThread()); | 1151 DCHECK(CalledOnValidThread()); |
1141 | 1152 |
1142 // Cancel the outstanding jobs. | 1153 // Cancel the outstanding jobs. |
1143 CancelAllJobs(); | 1154 CancelAllJobs(); |
1144 DiscardIPv6ProbeJob(); | 1155 DiscardIPv6ProbeJob(); |
1145 | 1156 |
1146 shutdown_ = true; | 1157 shutdown_ = true; |
1147 } | 1158 } |
1148 | 1159 |
1149 void HostResolverImpl::SetPoolConstraints(JobPoolIndex pool_index, | |
1150 size_t max_outstanding_jobs, | |
1151 size_t max_pending_requests) { | |
1152 DCHECK(CalledOnValidThread()); | |
1153 CHECK_GE(pool_index, 0); | |
1154 CHECK_LT(pool_index, POOL_COUNT); | |
1155 CHECK(jobs_.empty()) << "Can only set constraints during setup"; | |
1156 JobPool* pool = job_pools_[pool_index]; | |
1157 pool->SetConstraints(max_outstanding_jobs, max_pending_requests); | |
1158 } | |
1159 | |
1160 void HostResolverImpl::AddOutstandingJob(Job* job) { | 1160 void HostResolverImpl::AddOutstandingJob(Job* job) { |
1161 scoped_refptr<Job>& found_job = jobs_[job->key()]; | 1161 scoped_refptr<Job>& found_job = jobs_[job->key()]; |
1162 DCHECK(!found_job); | 1162 DCHECK(!found_job); |
1163 found_job = job; | 1163 found_job = job; |
1164 | 1164 |
1165 JobPool* pool = GetPoolForRequest(job->initial_request()); | 1165 JobPool* pool = GetPoolForRequest(job->initial_request()); |
1166 pool->AdjustNumOutstandingJobs(1); | 1166 pool->AdjustNumOutstandingJobs(1); |
1167 } | 1167 } |
1168 | 1168 |
1169 HostResolverImpl::Job* HostResolverImpl::FindOutstandingJob(const Key& key) { | 1169 HostResolverImpl::Job* HostResolverImpl::FindOutstandingJob(const Key& key) { |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1298 for (ObserversList::iterator it = observers_.begin(); | 1298 for (ObserversList::iterator it = observers_.begin(); |
1299 it != observers_.end(); ++it) { | 1299 it != observers_.end(); ++it) { |
1300 (*it)->OnCancelResolution(request_id, info); | 1300 (*it)->OnCancelResolution(request_id, info); |
1301 } | 1301 } |
1302 } | 1302 } |
1303 | 1303 |
1304 request_net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST, NULL); | 1304 request_net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST, NULL); |
1305 source_net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL, NULL); | 1305 source_net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL, NULL); |
1306 } | 1306 } |
1307 | 1307 |
1308 void HostResolverImpl::OnIPAddressChanged() { | |
1309 if (cache_.get()) | |
1310 cache_->clear(); | |
1311 if (ipv6_probe_monitoring_) { | |
1312 DCHECK(!shutdown_); | |
1313 if (shutdown_) | |
1314 return; | |
1315 DiscardIPv6ProbeJob(); | |
1316 ipv6_probe_job_ = new IPv6ProbeJob(this); | |
1317 ipv6_probe_job_->Start(); | |
1318 } | |
1319 #if defined(OS_LINUX) | |
1320 if (HaveOnlyLoopbackAddresses()) { | |
1321 additional_resolver_flags_ |= HOST_RESOLVER_LOOPBACK_ONLY; | |
1322 } else { | |
1323 additional_resolver_flags_ &= ~HOST_RESOLVER_LOOPBACK_ONLY; | |
1324 } | |
1325 #endif | |
1326 AbortAllInProgressJobs(); | |
1327 // |this| may be deleted inside AbortAllInProgressJobs(). | |
1328 } | |
1329 | |
1330 void HostResolverImpl::DiscardIPv6ProbeJob() { | 1308 void HostResolverImpl::DiscardIPv6ProbeJob() { |
1331 if (ipv6_probe_job_.get()) { | 1309 if (ipv6_probe_job_.get()) { |
1332 ipv6_probe_job_->Cancel(); | 1310 ipv6_probe_job_->Cancel(); |
1333 ipv6_probe_job_ = NULL; | 1311 ipv6_probe_job_ = NULL; |
1334 } | 1312 } |
1335 } | 1313 } |
1336 | 1314 |
1337 void HostResolverImpl::IPv6ProbeSetDefaultAddressFamily( | 1315 void HostResolverImpl::IPv6ProbeSetDefaultAddressFamily( |
1338 AddressFamily address_family) { | 1316 AddressFamily address_family) { |
1339 DCHECK(address_family == ADDRESS_FAMILY_UNSPECIFIED || | 1317 DCHECK(address_family == ADDRESS_FAMILY_UNSPECIFIED || |
1340 address_family == ADDRESS_FAMILY_IPV4); | 1318 address_family == ADDRESS_FAMILY_IPV4); |
1341 if (default_address_family_ != address_family) { | 1319 if (default_address_family_ != address_family) { |
1342 VLOG(1) << "IPv6Probe forced AddressFamily setting to " | 1320 VLOG(1) << "IPv6Probe forced AddressFamily setting to " |
1343 << ((address_family == ADDRESS_FAMILY_UNSPECIFIED) ? | 1321 << ((address_family == ADDRESS_FAMILY_UNSPECIFIED) ? |
1344 "ADDRESS_FAMILY_UNSPECIFIED" : "ADDRESS_FAMILY_IPV4"); | 1322 "ADDRESS_FAMILY_UNSPECIFIED" : "ADDRESS_FAMILY_IPV4"); |
1345 } | 1323 } |
1346 default_address_family_ = address_family; | 1324 default_address_family_ = address_family; |
1347 // Drop reference since the job has called us back. | 1325 // Drop reference since the job has called us back. |
1348 DiscardIPv6ProbeJob(); | 1326 DiscardIPv6ProbeJob(); |
1349 } | 1327 } |
1350 | 1328 |
1351 // static | |
1352 HostResolverImpl::JobPoolIndex HostResolverImpl::GetJobPoolIndexForRequest( | |
1353 const Request* req) { | |
1354 return POOL_NORMAL; | |
1355 } | |
1356 | |
1357 bool HostResolverImpl::CanCreateJobForPool(const JobPool& pool) const { | 1329 bool HostResolverImpl::CanCreateJobForPool(const JobPool& pool) const { |
1358 DCHECK_LE(jobs_.size(), max_jobs_); | 1330 DCHECK_LE(jobs_.size(), max_jobs_); |
1359 | 1331 |
1360 // We can't create another job if it would exceed the global total. | 1332 // We can't create another job if it would exceed the global total. |
1361 if (jobs_.size() + 1 > max_jobs_) | 1333 if (jobs_.size() + 1 > max_jobs_) |
1362 return false; | 1334 return false; |
1363 | 1335 |
1364 // Check whether the pool's constraints are met. | 1336 // Check whether the pool's constraints are met. |
1365 return pool.CanCreateJob(); | 1337 return pool.CanCreateJob(); |
1366 } | 1338 } |
1367 | 1339 |
| 1340 // static |
| 1341 HostResolverImpl::JobPoolIndex HostResolverImpl::GetJobPoolIndexForRequest( |
| 1342 const Request* req) { |
| 1343 return POOL_NORMAL; |
| 1344 } |
| 1345 |
1368 void HostResolverImpl::ProcessQueuedRequests() { | 1346 void HostResolverImpl::ProcessQueuedRequests() { |
1369 // Find the highest priority request that can be scheduled. | 1347 // Find the highest priority request that can be scheduled. |
1370 Request* top_req = NULL; | 1348 Request* top_req = NULL; |
1371 for (size_t i = 0; i < arraysize(job_pools_); ++i) { | 1349 for (size_t i = 0; i < arraysize(job_pools_); ++i) { |
1372 JobPool* pool = job_pools_[i]; | 1350 JobPool* pool = job_pools_[i]; |
1373 if (pool->HasPendingRequests() && CanCreateJobForPool(*pool)) { | 1351 if (pool->HasPendingRequests() && CanCreateJobForPool(*pool)) { |
1374 top_req = pool->RemoveTopPendingRequest(); | 1352 top_req = pool->RemoveTopPendingRequest(); |
1375 break; | 1353 break; |
1376 } | 1354 } |
1377 } | 1355 } |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1451 for (size_t i = 0; i < arraysize(job_pools_); ++i) | 1429 for (size_t i = 0; i < arraysize(job_pools_); ++i) |
1452 job_pools_[i]->ResetNumOutstandingJobs(); | 1430 job_pools_[i]->ResetNumOutstandingJobs(); |
1453 JobMap jobs; | 1431 JobMap jobs; |
1454 jobs.swap(jobs_); | 1432 jobs.swap(jobs_); |
1455 for (JobMap::iterator it = jobs.begin(); it != jobs.end(); ++it) { | 1433 for (JobMap::iterator it = jobs.begin(); it != jobs.end(); ++it) { |
1456 AbortJob(it->second); | 1434 AbortJob(it->second); |
1457 it->second->Cancel(); | 1435 it->second->Cancel(); |
1458 } | 1436 } |
1459 } | 1437 } |
1460 | 1438 |
| 1439 void HostResolverImpl::OnIPAddressChanged() { |
| 1440 if (cache_.get()) |
| 1441 cache_->clear(); |
| 1442 if (ipv6_probe_monitoring_) { |
| 1443 DCHECK(!shutdown_); |
| 1444 if (shutdown_) |
| 1445 return; |
| 1446 DiscardIPv6ProbeJob(); |
| 1447 ipv6_probe_job_ = new IPv6ProbeJob(this); |
| 1448 ipv6_probe_job_->Start(); |
| 1449 } |
| 1450 #if defined(OS_LINUX) |
| 1451 if (HaveOnlyLoopbackAddresses()) { |
| 1452 additional_resolver_flags_ |= HOST_RESOLVER_LOOPBACK_ONLY; |
| 1453 } else { |
| 1454 additional_resolver_flags_ &= ~HOST_RESOLVER_LOOPBACK_ONLY; |
| 1455 } |
| 1456 #endif |
| 1457 AbortAllInProgressJobs(); |
| 1458 // |this| may be deleted inside AbortAllInProgressJobs(). |
| 1459 } |
| 1460 |
1461 } // namespace net | 1461 } // namespace net |
OLD | NEW |