Index: net/proxy/multi_threaded_proxy_resolver.h |
=================================================================== |
--- net/proxy/multi_threaded_proxy_resolver.h (revision 51891) |
+++ net/proxy/multi_threaded_proxy_resolver.h (working copy) |
@@ -1,144 +0,0 @@ |
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#ifndef NET_PROXY_MULTI_THREADED_PROXY_RESOLVER_H_ |
-#define NET_PROXY_MULTI_THREADED_PROXY_RESOLVER_H_ |
- |
-#include <deque> |
-#include <string> |
-#include <vector> |
- |
-#include "base/basictypes.h" |
-#include "base/non_thread_safe.h" |
-#include "base/ref_counted.h" |
-#include "base/scoped_ptr.h" |
-#include "net/proxy/proxy_resolver.h" |
- |
-namespace base { |
-class Thread; |
-} // namespace base |
- |
-namespace net { |
- |
-// ProxyResolverFactory is an interface for creating ProxyResolver instances. |
-class ProxyResolverFactory { |
- public: |
- explicit ProxyResolverFactory(bool resolvers_expect_pac_bytes) |
- : resolvers_expect_pac_bytes_(resolvers_expect_pac_bytes) {} |
- |
- virtual ~ProxyResolverFactory() {} |
- |
- // Creates a new ProxyResolver. The caller is responsible for freeing this |
- // object. |
- virtual ProxyResolver* CreateProxyResolver() = 0; |
- |
- bool resolvers_expect_pac_bytes() const { |
- return resolvers_expect_pac_bytes_; |
- } |
- |
- private: |
- bool resolvers_expect_pac_bytes_; |
- DISALLOW_COPY_AND_ASSIGN(ProxyResolverFactory); |
-}; |
- |
-// MultiThreadedProxyResolver is a ProxyResolver implementation that runs |
-// synchronous ProxyResolver implementations on worker threads. |
-// |
-// Threads are created lazily on demand, up to a maximum total. The advantage |
-// of having a pool of threads, is faster performance. In particular, being |
-// able to keep servicing PAC requests even if one blocks its execution. |
-// |
-// During initialization (SetPacScript), a single thread is spun up to test |
-// the script. If this succeeds, we cache the input script, and will re-use |
-// this to lazily provision any new threads as needed. |
-// |
-// For each new thread that we spawn, a corresponding new ProxyResolver is |
-// created using ProxyResolverFactory. |
-// |
-// Because we are creating multiple ProxyResolver instances, this means we |
-// are duplicating script contexts for what is ordinarily seen as being a |
-// single script. This can affect compatibility on some classes of PAC |
-// script: |
-// |
-// (a) Scripts whose initialization has external dependencies on network or |
-// time may end up successfully initializing on some threads, but not |
-// others. So depending on what thread services the request, the result |
-// may jump between several possibilities. |
-// |
-// (b) Scripts whose FindProxyForURL() depends on side-effects may now |
-// work differently. For example, a PAC script which was incrementing |
-// a global counter and using that to make a decision. In the |
-// multi-threaded model, each thread may have a different value for this |
-// counter, so it won't globally be seen as monotonically increasing! |
-class MultiThreadedProxyResolver : public ProxyResolver, public NonThreadSafe { |
- public: |
- // Creates an asynchronous ProxyResolver that runs requests on up to |
- // |max_num_threads|. |
- // |
- // For each thread that is created, an accompanying synchronous ProxyResolver |
- // will be provisioned using |resolver_factory|. All methods on these |
- // ProxyResolvers will be called on the one thread, with the exception of |
- // ProxyResolver::Shutdown() which will be called from the origin thread |
- // prior to destruction. |
- // |
- // The constructor takes ownership of |resolver_factory|. |
- MultiThreadedProxyResolver(ProxyResolverFactory* resolver_factory, |
- size_t max_num_threads); |
- |
- virtual ~MultiThreadedProxyResolver(); |
- |
- // ProxyResolver implementation: |
- virtual int GetProxyForURL(const GURL& url, |
- ProxyInfo* results, |
- CompletionCallback* callback, |
- RequestHandle* request, |
- const BoundNetLog& net_log); |
- virtual void CancelRequest(RequestHandle request); |
- virtual void CancelSetPacScript(); |
- virtual void PurgeMemory(); |
- |
- private: |
- class Executor; |
- class Job; |
- class SetPacScriptJob; |
- class GetProxyForURLJob; |
- // FIFO queue of pending jobs waiting to be started. |
- // TODO(eroman): Make this priority queue. |
- typedef std::deque<scoped_refptr<Job> > PendingJobsQueue; |
- typedef std::vector<scoped_refptr<Executor> > ExecutorList; |
- |
- // ProxyResolver implementation: |
- virtual int SetPacScript(const GURL& pac_url, |
- const string16& pac_script, |
- CompletionCallback* callback); |
- |
- // Asserts that there are no outstanding user-initiated jobs on any of the |
- // worker threads. |
- void CheckNoOutstandingUserRequests() const; |
- |
- // Stops and deletes all of the worker threads. |
- void ReleaseAllExecutors(); |
- |
- // Returns an idle worker thread which is ready to receive GetProxyForURL() |
- // requests. If all threads are occupied, returns NULL. |
- Executor* FindIdleExecutor(); |
- |
- // Creates a new worker thread, and appends it to |executors_|. |
- Executor* AddNewExecutor(); |
- |
- // Starts the next job from |pending_jobs_| if possible. |
- void OnExecutorReady(Executor* executor); |
- |
- const scoped_ptr<ProxyResolverFactory> resolver_factory_; |
- const size_t max_num_threads_; |
- PendingJobsQueue pending_jobs_; |
- ExecutorList executors_; |
- bool was_set_pac_script_called_; |
- GURL current_pac_url_; |
- string16 current_pac_script_; |
-}; |
- |
-} // namespace net |
- |
-#endif // NET_PROXY_MULTI_THREADED_PROXY_RESOLVER_H_ |