OLD | NEW |
| (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_ | |
OLD | NEW |