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