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

Side by Side Diff: net/proxy/single_threaded_proxy_resolver.h

Issue 2822043: Add the capability to run multiple proxy PAC scripts in parallel.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Re-upload after revert Created 10 years, 5 months 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/proxy/proxy_service.cc ('k') | net/proxy/single_threaded_proxy_resolver.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef NET_PROXY_SINGLE_THREADED_PROXY_RESOLVER_H_
6 #define NET_PROXY_SINGLE_THREADED_PROXY_RESOLVER_H_
7
8 #include <deque>
9 #include <string>
10
11 #include "base/ref_counted.h"
12 #include "base/scoped_ptr.h"
13 #include "net/proxy/proxy_resolver.h"
14
15 namespace base {
16 class Thread;
17 } // namespace base
18
19 namespace net {
20
21 // ProxyResolver implementation that wraps a synchronous ProxyResolver, and
22 // runs it on a single worker thread. If multiple requests accumulate, they
23 // are serviced in FIFO order.
24 class SingleThreadedProxyResolver : public ProxyResolver {
25 public:
26 // |resolver| is a synchronous ProxyResolver implementation. It doesn't
27 // have to be thread-safe, since it is run on exactly one thread. The
28 // constructor takes ownership of |resolver|.
29 explicit SingleThreadedProxyResolver(ProxyResolver* resolver);
30
31 virtual ~SingleThreadedProxyResolver();
32
33 // ProxyResolver implementation:
34 virtual int GetProxyForURL(const GURL& url,
35 ProxyInfo* results,
36 CompletionCallback* callback,
37 RequestHandle* request,
38 const BoundNetLog& net_log);
39 virtual void CancelRequest(RequestHandle request);
40 virtual void CancelSetPacScript();
41 virtual void PurgeMemory();
42
43 protected:
44 // The wrapped (synchronous) ProxyResolver.
45 ProxyResolver* resolver() { return resolver_.get(); }
46
47 private:
48 // Refcounted helper class that bridges between origin thread and worker
49 // thread.
50 class Job;
51 friend class Job;
52 class SetPacScriptTask;
53 friend class SetPacScriptTask;
54 // FIFO queue that contains the in-progress job, and any pending jobs.
55 typedef std::deque<scoped_refptr<Job> > PendingJobsQueue;
56
57 base::Thread* thread() { return thread_.get(); }
58
59 // ProxyResolver implementation:
60 virtual int SetPacScript(const GURL& pac_url,
61 const string16& pac_script,
62 CompletionCallback* callback);
63
64 // Starts the worker thread if it isn't already running.
65 void EnsureThreadStarted();
66
67 // Starts the next job from |pending_jobs_| if possible.
68 void ProcessPendingJobs();
69
70 // Removes the front entry of the jobs queue. |expected_job| is our
71 // expectation of what the front of the job queue is; it is only used by
72 // DCHECK for verification purposes.
73 void RemoveFrontOfJobsQueueAndStartNext(Job* expected_job);
74
75 // Clears |outstanding_set_pac_script_task_|.
76 // Called when |task| has just finished.
77 void RemoveOutstandingSetPacScriptTask(SetPacScriptTask* task);
78
79 // The synchronous resolver implementation.
80 scoped_ptr<ProxyResolver> resolver_;
81
82 // The thread where |resolver_| is run on.
83 // Note that declaration ordering is important here. |thread_| needs to be
84 // destroyed *before* |resolver_|, in case |resolver_| is currently
85 // executing on |thread_|.
86 scoped_ptr<base::Thread> thread_;
87
88 PendingJobsQueue pending_jobs_;
89 scoped_refptr<SetPacScriptTask> outstanding_set_pac_script_task_;
90 };
91
92 } // namespace net
93
94 #endif // NET_PROXY_SINGLE_THREADED_PROXY_RESOLVER_H_
OLDNEW
« no previous file with comments | « net/proxy/proxy_service.cc ('k') | net/proxy/single_threaded_proxy_resolver.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698