OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/proxy/proxy_resolver_v8_tracing.h" | 5 #include "net/proxy/proxy_resolver_v8_tracing.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
| 9 #include <utility> |
9 #include <vector> | 10 #include <vector> |
10 | 11 |
11 #include "base/bind.h" | 12 #include "base/bind.h" |
12 #include "base/macros.h" | 13 #include "base/macros.h" |
13 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
14 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
15 #include "base/synchronization/cancellation_flag.h" | 16 #include "base/synchronization/cancellation_flag.h" |
16 #include "base/synchronization/waitable_event.h" | 17 #include "base/synchronization/waitable_event.h" |
17 #include "base/thread_task_runner_handle.h" | 18 #include "base/thread_task_runner_handle.h" |
18 #include "base/threading/thread.h" | 19 #include "base/threading/thread.h" |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 // The number of outstanding (non-cancelled) jobs. | 326 // The number of outstanding (non-cancelled) jobs. |
326 int num_outstanding_callbacks_; | 327 int num_outstanding_callbacks_; |
327 | 328 |
328 DISALLOW_COPY_AND_ASSIGN(ProxyResolverV8TracingImpl); | 329 DISALLOW_COPY_AND_ASSIGN(ProxyResolverV8TracingImpl); |
329 }; | 330 }; |
330 | 331 |
331 Job::Job(const Job::Params* params, | 332 Job::Job(const Job::Params* params, |
332 scoped_ptr<ProxyResolverV8Tracing::Bindings> bindings) | 333 scoped_ptr<ProxyResolverV8Tracing::Bindings> bindings) |
333 : origin_runner_(base::ThreadTaskRunnerHandle::Get()), | 334 : origin_runner_(base::ThreadTaskRunnerHandle::Get()), |
334 params_(params), | 335 params_(params), |
335 bindings_(bindings.Pass()), | 336 bindings_(std::move(bindings)), |
336 event_(true, false), | 337 event_(true, false), |
337 last_num_dns_(0), | 338 last_num_dns_(0), |
338 pending_dns_(NULL) { | 339 pending_dns_(NULL) { |
339 CheckIsOnOriginThread(); | 340 CheckIsOnOriginThread(); |
340 } | 341 } |
341 | 342 |
342 void Job::StartCreateV8Resolver( | 343 void Job::StartCreateV8Resolver( |
343 const scoped_refptr<ProxyResolverScriptData>& script_data, | 344 const scoped_refptr<ProxyResolverScriptData>& script_data, |
344 scoped_ptr<ProxyResolverV8>* resolver, | 345 scoped_ptr<ProxyResolverV8>* resolver, |
345 const CompletionCallback& callback) { | 346 const CompletionCallback& callback) { |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
547 } | 548 } |
548 | 549 |
549 int Job::ExecuteProxyResolver() { | 550 int Job::ExecuteProxyResolver() { |
550 int result = ERR_UNEXPECTED; // Initialized to silence warnings. | 551 int result = ERR_UNEXPECTED; // Initialized to silence warnings. |
551 | 552 |
552 switch (operation_) { | 553 switch (operation_) { |
553 case CREATE_V8_RESOLVER: { | 554 case CREATE_V8_RESOLVER: { |
554 scoped_ptr<ProxyResolverV8> resolver; | 555 scoped_ptr<ProxyResolverV8> resolver; |
555 result = ProxyResolverV8::Create(script_data_, this, &resolver); | 556 result = ProxyResolverV8::Create(script_data_, this, &resolver); |
556 if (result == OK) | 557 if (result == OK) |
557 *resolver_out_ = resolver.Pass(); | 558 *resolver_out_ = std::move(resolver); |
558 break; | 559 break; |
559 } | 560 } |
560 case GET_PROXY_FOR_URL: { | 561 case GET_PROXY_FOR_URL: { |
561 result = v8_resolver()->GetProxyForURL( | 562 result = v8_resolver()->GetProxyForURL( |
562 url_, | 563 url_, |
563 // Important: Do not write directly into |user_results_|, since if the | 564 // Important: Do not write directly into |user_results_|, since if the |
564 // request were to be cancelled from the origin thread, must guarantee | 565 // request were to be cancelled from the origin thread, must guarantee |
565 // that |user_results_| is not accessed anymore. | 566 // that |user_results_| is not accessed anymore. |
566 &results_, this); | 567 &results_, this); |
567 break; | 568 break; |
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
910 VLOG(1) << "PAC-error: " << "line: " << line_number << ": " << message; | 911 VLOG(1) << "PAC-error: " << "line: " << line_number << ": " << message; |
911 | 912 |
912 bindings_->OnError(line_number, message); | 913 bindings_->OnError(line_number, message); |
913 } | 914 } |
914 } | 915 } |
915 | 916 |
916 ProxyResolverV8TracingImpl::ProxyResolverV8TracingImpl( | 917 ProxyResolverV8TracingImpl::ProxyResolverV8TracingImpl( |
917 scoped_ptr<base::Thread> thread, | 918 scoped_ptr<base::Thread> thread, |
918 scoped_ptr<ProxyResolverV8> resolver, | 919 scoped_ptr<ProxyResolverV8> resolver, |
919 scoped_ptr<Job::Params> job_params) | 920 scoped_ptr<Job::Params> job_params) |
920 : thread_(thread.Pass()), | 921 : thread_(std::move(thread)), |
921 v8_resolver_(resolver.Pass()), | 922 v8_resolver_(std::move(resolver)), |
922 job_params_(job_params.Pass()), | 923 job_params_(std::move(job_params)), |
923 num_outstanding_callbacks_(0) { | 924 num_outstanding_callbacks_(0) { |
924 job_params_->num_outstanding_callbacks = &num_outstanding_callbacks_; | 925 job_params_->num_outstanding_callbacks = &num_outstanding_callbacks_; |
925 } | 926 } |
926 | 927 |
927 ProxyResolverV8TracingImpl::~ProxyResolverV8TracingImpl() { | 928 ProxyResolverV8TracingImpl::~ProxyResolverV8TracingImpl() { |
928 // Note, all requests should have been cancelled. | 929 // Note, all requests should have been cancelled. |
929 CHECK_EQ(0, num_outstanding_callbacks_); | 930 CHECK_EQ(0, num_outstanding_callbacks_); |
930 | 931 |
931 // Join the worker thread. See http://crbug.com/69710. | 932 // Join the worker thread. See http://crbug.com/69710. |
932 base::ThreadRestrictions::ScopedAllowIO allow_io; | 933 base::ThreadRestrictions::ScopedAllowIO allow_io; |
933 thread_.reset(); | 934 thread_.reset(); |
934 } | 935 } |
935 | 936 |
936 void ProxyResolverV8TracingImpl::GetProxyForURL( | 937 void ProxyResolverV8TracingImpl::GetProxyForURL( |
937 const GURL& url, | 938 const GURL& url, |
938 ProxyInfo* results, | 939 ProxyInfo* results, |
939 const CompletionCallback& callback, | 940 const CompletionCallback& callback, |
940 ProxyResolver::RequestHandle* request, | 941 ProxyResolver::RequestHandle* request, |
941 scoped_ptr<Bindings> bindings) { | 942 scoped_ptr<Bindings> bindings) { |
942 DCHECK(CalledOnValidThread()); | 943 DCHECK(CalledOnValidThread()); |
943 DCHECK(!callback.is_null()); | 944 DCHECK(!callback.is_null()); |
944 | 945 |
945 scoped_refptr<Job> job = new Job(job_params_.get(), bindings.Pass()); | 946 scoped_refptr<Job> job = new Job(job_params_.get(), std::move(bindings)); |
946 | 947 |
947 if (request) | 948 if (request) |
948 *request = job.get(); | 949 *request = job.get(); |
949 | 950 |
950 job->StartGetProxyForURL(url, results, callback); | 951 job->StartGetProxyForURL(url, results, callback); |
951 } | 952 } |
952 | 953 |
953 void ProxyResolverV8TracingImpl::CancelRequest( | 954 void ProxyResolverV8TracingImpl::CancelRequest( |
954 ProxyResolver::RequestHandle request) { | 955 ProxyResolver::RequestHandle request) { |
955 Job* job = reinterpret_cast<Job*>(request); | 956 Job* job = reinterpret_cast<Job*>(request); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
996 thread_(new base::Thread("Proxy Resolver")), | 997 thread_(new base::Thread("Proxy Resolver")), |
997 resolver_out_(resolver_out), | 998 resolver_out_(resolver_out), |
998 callback_(callback), | 999 callback_(callback), |
999 num_outstanding_callbacks_(0) { | 1000 num_outstanding_callbacks_(0) { |
1000 // Start up the thread. | 1001 // Start up the thread. |
1001 base::Thread::Options options; | 1002 base::Thread::Options options; |
1002 options.timer_slack = base::TIMER_SLACK_MAXIMUM; | 1003 options.timer_slack = base::TIMER_SLACK_MAXIMUM; |
1003 CHECK(thread_->StartWithOptions(options)); | 1004 CHECK(thread_->StartWithOptions(options)); |
1004 job_params_.reset( | 1005 job_params_.reset( |
1005 new Job::Params(thread_->task_runner(), &num_outstanding_callbacks_)); | 1006 new Job::Params(thread_->task_runner(), &num_outstanding_callbacks_)); |
1006 create_resolver_job_ = new Job(job_params_.get(), bindings.Pass()); | 1007 create_resolver_job_ = new Job(job_params_.get(), std::move(bindings)); |
1007 create_resolver_job_->StartCreateV8Resolver( | 1008 create_resolver_job_->StartCreateV8Resolver( |
1008 pac_script, &v8_resolver_, | 1009 pac_script, &v8_resolver_, |
1009 base::Bind( | 1010 base::Bind( |
1010 &ProxyResolverV8TracingFactoryImpl::CreateJob::OnV8ResolverCreated, | 1011 &ProxyResolverV8TracingFactoryImpl::CreateJob::OnV8ResolverCreated, |
1011 base::Unretained(this))); | 1012 base::Unretained(this))); |
1012 } | 1013 } |
1013 | 1014 |
1014 ~CreateJob() override { | 1015 ~CreateJob() override { |
1015 if (factory_) { | 1016 if (factory_) { |
1016 factory_->RemoveJob(this); | 1017 factory_->RemoveJob(this); |
(...skipping 10 matching lines...) Expand all Loading... |
1027 create_resolver_job_ = nullptr; | 1028 create_resolver_job_ = nullptr; |
1028 StopWorkerThread(); | 1029 StopWorkerThread(); |
1029 } | 1030 } |
1030 | 1031 |
1031 private: | 1032 private: |
1032 void OnV8ResolverCreated(int error) { | 1033 void OnV8ResolverCreated(int error) { |
1033 DCHECK(factory_); | 1034 DCHECK(factory_); |
1034 if (error == OK) { | 1035 if (error == OK) { |
1035 job_params_->v8_resolver = v8_resolver_.get(); | 1036 job_params_->v8_resolver = v8_resolver_.get(); |
1036 resolver_out_->reset(new ProxyResolverV8TracingImpl( | 1037 resolver_out_->reset(new ProxyResolverV8TracingImpl( |
1037 thread_.Pass(), v8_resolver_.Pass(), job_params_.Pass())); | 1038 std::move(thread_), std::move(v8_resolver_), std::move(job_params_))); |
1038 } else { | 1039 } else { |
1039 StopWorkerThread(); | 1040 StopWorkerThread(); |
1040 } | 1041 } |
1041 | 1042 |
1042 factory_->RemoveJob(this); | 1043 factory_->RemoveJob(this); |
1043 factory_ = nullptr; | 1044 factory_ = nullptr; |
1044 create_resolver_job_ = nullptr; | 1045 create_resolver_job_ = nullptr; |
1045 callback_.Run(error); | 1046 callback_.Run(error); |
1046 } | 1047 } |
1047 | 1048 |
(...skipping 24 matching lines...) Expand all Loading... |
1072 } | 1073 } |
1073 } | 1074 } |
1074 | 1075 |
1075 void ProxyResolverV8TracingFactoryImpl::CreateProxyResolverV8Tracing( | 1076 void ProxyResolverV8TracingFactoryImpl::CreateProxyResolverV8Tracing( |
1076 const scoped_refptr<ProxyResolverScriptData>& pac_script, | 1077 const scoped_refptr<ProxyResolverScriptData>& pac_script, |
1077 scoped_ptr<ProxyResolverV8Tracing::Bindings> bindings, | 1078 scoped_ptr<ProxyResolverV8Tracing::Bindings> bindings, |
1078 scoped_ptr<ProxyResolverV8Tracing>* resolver, | 1079 scoped_ptr<ProxyResolverV8Tracing>* resolver, |
1079 const CompletionCallback& callback, | 1080 const CompletionCallback& callback, |
1080 scoped_ptr<ProxyResolverFactory::Request>* request) { | 1081 scoped_ptr<ProxyResolverFactory::Request>* request) { |
1081 scoped_ptr<CreateJob> job( | 1082 scoped_ptr<CreateJob> job( |
1082 new CreateJob(this, bindings.Pass(), pac_script, resolver, callback)); | 1083 new CreateJob(this, std::move(bindings), pac_script, resolver, callback)); |
1083 jobs_.insert(job.get()); | 1084 jobs_.insert(job.get()); |
1084 *request = job.Pass(); | 1085 *request = std::move(job); |
1085 } | 1086 } |
1086 | 1087 |
1087 void ProxyResolverV8TracingFactoryImpl::RemoveJob( | 1088 void ProxyResolverV8TracingFactoryImpl::RemoveJob( |
1088 ProxyResolverV8TracingFactoryImpl::CreateJob* job) { | 1089 ProxyResolverV8TracingFactoryImpl::CreateJob* job) { |
1089 size_t erased = jobs_.erase(job); | 1090 size_t erased = jobs_.erase(job); |
1090 DCHECK_EQ(1u, erased); | 1091 DCHECK_EQ(1u, erased); |
1091 } | 1092 } |
1092 | 1093 |
1093 } // namespace | 1094 } // namespace |
1094 | 1095 |
1095 // static | 1096 // static |
1096 scoped_ptr<ProxyResolverV8TracingFactory> | 1097 scoped_ptr<ProxyResolverV8TracingFactory> |
1097 ProxyResolverV8TracingFactory::Create() { | 1098 ProxyResolverV8TracingFactory::Create() { |
1098 return make_scoped_ptr(new ProxyResolverV8TracingFactoryImpl()); | 1099 return make_scoped_ptr(new ProxyResolverV8TracingFactoryImpl()); |
1099 } | 1100 } |
1100 | 1101 |
1101 } // namespace net | 1102 } // namespace net |
OLD | NEW |