Index: net/proxy/multi_threaded_proxy_resolver.cc |
diff --git a/net/proxy/multi_threaded_proxy_resolver.cc b/net/proxy/multi_threaded_proxy_resolver.cc |
index 5eae4f744e8d7d79915c8afe3f157da5161fcdf7..e593ee07efbd256fb1d4355c56c7a955bd9db4c3 100644 |
--- a/net/proxy/multi_threaded_proxy_resolver.cc |
+++ b/net/proxy/multi_threaded_proxy_resolver.cc |
@@ -117,13 +117,19 @@ class MultiThreadedProxyResolver : public ProxyResolver, |
int GetProxyForURL(const GURL& url, |
ProxyInfo* results, |
const CompletionCallback& callback, |
- RequestHandle* request, |
+ scoped_ptr<Request>* request, |
const BoundNetLog& net_log) override; |
- void CancelRequest(RequestHandle request) override; |
- LoadState GetLoadState(RequestHandle request) const override; |
+ |
+ void RemovePendingJob(base::WeakPtr<Job> job) { |
eroman
2016/01/23 02:17:01
I believe this can be deleted based on my later su
|
+ PendingJobsQueue::iterator it = |
+ std::find(pending_jobs_.begin(), pending_jobs_.end(), job.get()); |
+ DCHECK(it != pending_jobs_.end()); |
+ pending_jobs_.erase(it); |
+ } |
private: |
class GetProxyForURLJob; |
+ class RequestImpl; |
// FIFO queue of pending jobs waiting to be started. |
// TODO(eroman): Make this priority queue. |
typedef std::deque<scoped_refptr<Job>> PendingJobsQueue; |
@@ -148,7 +154,8 @@ class MultiThreadedProxyResolver : public ProxyResolver, |
// Job --------------------------------------------- |
-class Job : public base::RefCountedThreadSafe<Job> { |
+class Job : public base::SupportsWeakPtr<Job>, |
eroman
2016/01/23 02:17:01
I don't believe this should expose a weak pointer.
|
+ public base::RefCountedThreadSafe<Job> { |
public: |
// Identifies the subclass of Job (only being used for debugging purposes). |
enum Type { |
@@ -231,6 +238,35 @@ class Job : public base::RefCountedThreadSafe<Job> { |
bool was_cancelled_; |
}; |
+class MultiThreadedProxyResolver::RequestImpl : public ProxyResolver::Request { |
+ public: |
+ RequestImpl(base::WeakPtr<Job> job, MultiThreadedProxyResolver* resolver) |
eroman
2016/01/23 02:17:01
Rather than a WeakPtr, can this instead just hold
|
+ : job_(job), resolver_(resolver) {} |
+ |
+ ~RequestImpl() override { |
eroman
2016/01/23 02:17:01
We can simplify this to a single line:
job_->Canc
|
+ DCHECK(resolver_->CalledOnValidThread()); |
+ if (job_) { |
+ if (job_->executor()) { |
+ // If the job was already submitted to the executor, just mark it |
+ // as cancelled so the user callback isn't run on completion. |
+ job_->Cancel(); |
+ } else { |
+ // Otherwise the job is just sitting in a queue. |
+ resolver_->RemovePendingJob(job_); |
+ } |
+ } |
+ } |
+ |
+ LoadState GetLoadState() override { |
+ DCHECK(resolver_->CalledOnValidThread()); |
+ return LOAD_STATE_RESOLVING_PROXY_FOR_URL; |
+ } |
+ |
+ private: |
+ base::WeakPtr<Job> job_; |
+ MultiThreadedProxyResolver* resolver_; |
eroman
2016/01/23 02:17:01
With the suggestion above, this member is no longe
|
+}; |
+ |
// CreateResolverJob ----------------------------------------------------------- |
// Runs on the worker thread to call ProxyResolverFactory::CreateProxyResolver. |
@@ -442,8 +478,11 @@ MultiThreadedProxyResolver::~MultiThreadedProxyResolver() { |
} |
int MultiThreadedProxyResolver::GetProxyForURL( |
- const GURL& url, ProxyInfo* results, const CompletionCallback& callback, |
- RequestHandle* request, const BoundNetLog& net_log) { |
+ const GURL& url, |
+ ProxyInfo* results, |
+ const CompletionCallback& callback, |
+ scoped_ptr<Request>* request, |
+ const BoundNetLog& net_log) { |
DCHECK(CalledOnValidThread()); |
DCHECK(!callback.is_null()); |
@@ -453,7 +492,7 @@ int MultiThreadedProxyResolver::GetProxyForURL( |
// Completion will be notified through |callback|, unless the caller cancels |
// the request using |request|. |
if (request) |
- *request = reinterpret_cast<RequestHandle>(job.get()); |
+ request->reset(new RequestImpl(job->AsWeakPtr(), this)); |
// If there is an executor that is ready to run this request, submit it! |
Executor* executor = FindIdleExecutor(); |
@@ -476,31 +515,6 @@ int MultiThreadedProxyResolver::GetProxyForURL( |
return ERR_IO_PENDING; |
} |
-void MultiThreadedProxyResolver::CancelRequest(RequestHandle req) { |
- DCHECK(CalledOnValidThread()); |
- DCHECK(req); |
- |
- Job* job = reinterpret_cast<Job*>(req); |
- DCHECK_EQ(Job::TYPE_GET_PROXY_FOR_URL, job->type()); |
- |
- if (job->executor()) { |
- // If the job was already submitted to the executor, just mark it |
- // as cancelled so the user callback isn't run on completion. |
- job->Cancel(); |
- } else { |
- // Otherwise the job is just sitting in a queue. |
- PendingJobsQueue::iterator it = |
- std::find(pending_jobs_.begin(), pending_jobs_.end(), job); |
- DCHECK(it != pending_jobs_.end()); |
- pending_jobs_.erase(it); |
- } |
-} |
- |
-LoadState MultiThreadedProxyResolver::GetLoadState(RequestHandle req) const { |
- DCHECK(CalledOnValidThread()); |
- DCHECK(req); |
- return LOAD_STATE_RESOLVING_PROXY_FOR_URL; |
-} |
Executor* MultiThreadedProxyResolver::FindIdleExecutor() { |
DCHECK(CalledOnValidThread()); |