1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_BASE_HOST_RESOLVER_IMPL_H_ 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_BASE_HOST_RESOLVER_IMPL_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <vector> 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/non_thread_safe.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/capturing_net_log.h" 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/host_cache.h" 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/host_resolver.h" 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/host_resolver_proc.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_log.h" 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/network_change_notifier.h" 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net { 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// For each hostname that is requested, HostResolver creates a 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// HostResolverImpl::Job. This job gets dispatched to a thread in the global 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// WorkerPool, where it runs SystemHostResolverProc(). If requests for that same 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// host are made while the job is already outstanding, then they are attached 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// to the existing job rather than creating a new one. This avoids doing 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// parallel resolves for the same host. 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The way these classes fit together is illustrated by: 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// +----------- HostResolverImpl -------------+ 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// | | | 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Job Job Job 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// (for host1, fam1) (for host2, fam2) (for hostx, famx) 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// / | | / | | / | | 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Request ... Request Request ... Request Request ... Request 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// (port1) (port2) (port3) (port4) (port5) (portX) 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// When a HostResolverImpl::Job finishes its work in the threadpool, the 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// callbacks of each waiting request are run on the origin thread. 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Thread safety: This class is not threadsafe, and must only be called 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// from one thread! 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The HostResolverImpl enforces |max_jobs_| as the maximum number of concurrent 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// threads. 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Requests are ordered in the queue based on their priority. 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass HostResolverImpl : public HostResolver, 533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen public base::NonThreadSafe, 54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public NetworkChangeNotifier::IPAddressObserver { 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The index into |job_pools_| for the various job pools. Pools with a higher 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // index have lower priority. 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Note: This is currently unused, since there is a single pool 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // for all requests. 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott enum JobPoolIndex { 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott POOL_NORMAL = 0, 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott POOL_COUNT, 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Creates a HostResolver that first uses the local cache |cache|, and then 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // falls back to |resolver_proc|. 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // If |cache| is NULL, then no caching is used. Otherwise we take 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ownership of the |cache| pointer, and will free it during destructor. 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // |resolver_proc| is used to perform the actual resolves; it must be 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // thread-safe since it is run from multiple worker threads. If 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // |resolver_proc| is NULL then the default host resolver procedure is 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // used (which is SystemHostResolverProc except if overridden). 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // |max_jobs| specifies the maximum number of threads that the host resolver 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // will use. Use SetPoolConstraints() to specify finer-grain settings. 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // |net_log| must remain valid for the life of the HostResolverImpl. 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HostResolverImpl(HostResolverProc* resolver_proc, 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HostCache* cache, 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick size_t max_jobs, 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NetLog* net_log); 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // If any completion callbacks are pending when the resolver is destroyed, 86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // the host resolutions are cancelled, and the completion callbacks will not 87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // be called. 88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual ~HostResolverImpl(); 89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Continuously observe whether IPv6 is supported, and set the allowable 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // address family to IPv4 iff IPv6 is not supported. 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ProbeIPv6Support(); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns the cache this resolver uses, or NULL if caching is disabled. 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HostCache* cache() { return cache_.get(); } 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Applies a set of constraints for requests that belong to the specified 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // pool. NOTE: Don't call this after requests have been already been started. 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // |pool_index| -- Specifies which pool these constraints should be applied 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // to. 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // |max_outstanding_jobs| -- How many concurrent jobs are allowed for this 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // pool. 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // |max_pending_requests| -- How many requests can be enqueued for this pool 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // before we start dropping requests. Dropped 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // requests fail with 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ERR_HOST_RESOLVER_QUEUE_TOO_LARGE. 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void SetPoolConstraints(JobPoolIndex pool_index, 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott size_t max_outstanding_jobs, 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott size_t max_pending_requests); 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // HostResolver methods: 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual int Resolve(const RequestInfo& info, 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AddressList* addresses, 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CompletionCallback* callback, 11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RequestHandle* out_req, 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const BoundNetLog& source_net_log); 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void CancelRequest(RequestHandle req); 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void AddObserver(HostResolver::Observer* observer); 12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void RemoveObserver(HostResolver::Observer* observer); 12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Set address family, and disable IPv6 probe support. 12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void SetDefaultAddressFamily(AddressFamily address_family); 12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual AddressFamily GetDefaultAddressFamily() const; 12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual HostResolverImpl* GetAsHostResolverImpl(); 12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // TODO(eroman): hack for http://crbug.com/15513 12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void Shutdown(); 13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott class Job; 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott class JobPool; 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch class IPv6ProbeJob; 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott class Request; 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott typedef std::vector<Request*> RequestsList; 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott typedef HostCache::Key Key; 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott typedef std::map<Key, scoped_refptr<Job> > JobMap; 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott typedef std::vector<HostResolver::Observer*> ObserversList; 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns the HostResolverProc to use for this instance. 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HostResolverProc* effective_resolver_proc() const { 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return resolver_proc_ ? 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott resolver_proc_.get() : HostResolverProc::GetDefault(); 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Adds a job to outstanding jobs list. 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void AddOutstandingJob(Job* job); 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns the outstanding job for |key|, or NULL if there is none. 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Job* FindOutstandingJob(const Key& key); 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Removes |job| from the outstanding jobs list. 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void RemoveOutstandingJob(Job* job); 155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Callback for when |job| has completed with |net_error| and |addrlist|. 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnJobComplete(Job* job, int net_error, int os_error, 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const AddressList& addrlist); 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Aborts |job|. Same as OnJobComplete() except does not remove |job| 1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // from |jobs_| and does not cache the result (ERR_ABORTED). 1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void AbortJob(Job* job); 1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Used by both OnJobComplete() and AbortJob(); 1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void OnJobCompleteInternal(Job* job, int net_error, int os_error, 1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const AddressList& addrlist); 1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Called when a request has just been started. 1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void OnStartRequest(const BoundNetLog& source_net_log, 1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const BoundNetLog& request_net_log, 171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int request_id, 172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const RequestInfo& info); 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Called when a request has just completed (before its callback is run). 1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void OnFinishRequest(const BoundNetLog& source_net_log, 1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const BoundNetLog& request_net_log, 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int request_id, 178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const RequestInfo& info, 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int net_error, 1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int os_error); 181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Called when a request has been cancelled. 1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void OnCancelRequest(const BoundNetLog& source_net_log, 1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const BoundNetLog& request_net_log, 185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int request_id, 186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const RequestInfo& info); 187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Notify IPv6ProbeJob not to call back, and discard reference to the job. 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void DiscardIPv6ProbeJob(); 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Callback from IPv6 probe activity. 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void IPv6ProbeSetDefaultAddressFamily(AddressFamily address_family); 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns true if the constraints for |pool| are met, and a new job can be 195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // created for this pool. 196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool CanCreateJobForPool(const JobPool& pool) const; 197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns the index of the pool that request |req| maps to. 199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static JobPoolIndex GetJobPoolIndexForRequest(const Request* req); 200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott JobPool* GetPoolForRequest(const Request* req) { 202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return job_pools_[GetJobPoolIndexForRequest(req)]; 203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Starts up to 1 job given the current pool constraints. This job 206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // may have multiple requests attached to it. 207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void ProcessQueuedRequests(); 208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the (hostname, address_family) key to use for |info|, choosing an 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "effective" address family by inheriting the resolver's default address 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // family when the request leaves it unspecified. 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Key GetEffectiveKeyForRequest(const RequestInfo& info) const; 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Attaches |req| to a new job, and starts it. Returns that job. 215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Job* CreateAndStartJob(Request* req); 216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Adds a pending request |req| to |pool|. 218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int EnqueueRequest(JobPool* pool, Request* req); 219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Cancels all jobs. 2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void CancelAllJobs(); 2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Aborts all in progress jobs (but might start new ones). 2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void AbortAllInProgressJobs(); 2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 226dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // NetworkChangeNotifier::IPAddressObserver methods: 22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void OnIPAddressChanged(); 22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Cache of host resolution results. 230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott scoped_ptr<HostCache> cache_; 231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Map from hostname to outstanding job. 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott JobMap jobs_; 234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Maximum number of concurrent jobs allowed, across all pools. 236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott size_t max_jobs_; 237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The information to track pending requests for a JobPool, as well as 239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // how many outstanding jobs the pool already has, and its constraints. 240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott JobPool* job_pools_[POOL_COUNT]; 241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The job that OnJobComplete() is currently processing (needed in case 243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // HostResolver gets deleted from within the callback). 244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott scoped_refptr<Job> cur_completing_job_; 245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The observers to notify when a request starts/ends. 247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ObserversList observers_; 248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Monotonically increasing ID number to assign to the next request. 250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Observers are the only consumers of this ID number. 251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int next_request_id_; 252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Monotonically increasing ID number to assign to the next job. 254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The only consumer of this ID is the requests tracing code. 255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int next_job_id_; 256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The procedure to use for resolving host names. This will be NULL, except 258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // in the case of unit-tests which inject custom host resolving behaviors. 259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott scoped_refptr<HostResolverProc> resolver_proc_; 260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Address family to use when the request doesn't specify one. 262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AddressFamily default_address_family_; 263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(eroman): hack for http://crbug.com/15513 265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool shutdown_; 266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Indicate if probing is done after each network change event to set address 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // family. 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // When false, explicit setting of address family is used. 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool ipv6_probe_monitoring_; 271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The last un-cancelled IPv6ProbeJob (if any). 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<IPv6ProbeJob> ipv6_probe_job_; 274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 2753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Any resolver flags that should be added to a request by default. 2763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick HostResolverFlags additional_resolver_flags_; 2773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NetLog* net_log_; 2793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DISALLOW_COPY_AND_ASSIGN(HostResolverImpl); 281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace net 284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // NET_BASE_HOST_RESOLVER_IMPL_H_ 286