Chromium Code Reviews| Index: remoting/client/chromoting_client_runtime.cc |
| diff --git a/remoting/client/chromoting_client_runtime.cc b/remoting/client/chromoting_client_runtime.cc |
| index a603eea0ec39440c6ffdfc009cc2e00bcca0d59b..a726389a634f7417d8dcd60df3aeb988dddfe084 100644 |
| --- a/remoting/client/chromoting_client_runtime.cc |
| +++ b/remoting/client/chromoting_client_runtime.cc |
| @@ -7,50 +7,112 @@ |
| #include "base/bind.h" |
| #include "base/logging.h" |
| #include "base/memory/ptr_util.h" |
| +#include "base/memory/singleton.h" |
| #include "base/message_loop/message_loop.h" |
| +#include "base/task_scheduler/task_scheduler.h" |
| +#include "remoting/base/chromium_url_request.h" |
| +#include "remoting/base/telemetry_log_writer.h" |
| #include "remoting/base/url_request_context_getter.h" |
| +namespace { |
| + |
| +const char kTelemetryBaseUrl[] = "https://remoting-pa.googleapis.com/v1/events"; |
| + |
| +} // namespace |
| + |
| namespace remoting { |
| -std::unique_ptr<ChromotingClientRuntime> ChromotingClientRuntime::Create( |
| - base::MessageLoopForUI* ui_loop) { |
| - DCHECK(ui_loop); |
| +// static |
| +ChromotingClientRuntime* ChromotingClientRuntime::GetInstance() { |
| + return base::Singleton<ChromotingClientRuntime>::get(); |
| +} |
| + |
| +ChromotingClientRuntime::ChromotingClientRuntime() { |
| + // TODO(sergeyu): Consider adding separate pools for different task classes. |
| + const int kMaxBackgroundThreads = 5; |
| + if (!base::TaskScheduler::GetInstance()) { |
| + // Make sure TaskScheduler is initialized. |
| + base::TaskScheduler::CreateAndSetSimpleTaskScheduler(kMaxBackgroundThreads); |
| + } |
| + |
| + if (!base::MessageLoop::current()) { |
| + VLOG(1) << "Starting main message loop"; |
| + ui_loop_.reset(new base::MessageLoopForUI()); |
| +#if defined(OS_ANDROID) |
| + // On Android, the UI thread is managed by Java, so we need to attach and |
| + // start a special type of message loop to allow Chromium code to run tasks. |
| + ui_loop_->Start(); |
| +#endif // OS_ANDROID |
| +#if defined(OS_IOS) |
| + base::MessageLoopForUI::current()->Attach(); |
| +#endif // OS_IOS |
| + } else { |
| + ui_loop_.reset(base::MessageLoopForUI::current()); |
|
Yuwei
2017/03/10 20:18:53
I personally think the UI loop should be an implem
nicholss
2017/03/10 20:53:11
If I move it out then every type of client needs t
|
| + } |
| + |
| +#if defined(DEBUG) |
| + net::URLFetcher::SetIgnoreCertificateRequests(true); |
| +#endif // DEBUG |
| // |ui_loop_| runs on the main thread, so |ui_task_runner_| will run on the |
| // main thread. We can not kill the main thread when the message loop becomes |
| // idle so the callback function does nothing (as opposed to the typical |
| // base::MessageLoop::QuitClosure()) |
| - scoped_refptr<AutoThreadTaskRunner> ui_task_runner = new AutoThreadTaskRunner( |
| - ui_loop->task_runner(), base::Bind(&base::DoNothing)); |
| - |
| - scoped_refptr<AutoThreadTaskRunner> display_task_runner = |
| - AutoThread::Create("native_disp", ui_task_runner); |
| - scoped_refptr<AutoThreadTaskRunner> network_task_runner = |
| - AutoThread::CreateWithType("native_net", ui_task_runner, |
| - base::MessageLoop::TYPE_IO); |
| - scoped_refptr<AutoThreadTaskRunner> file_task_runner = |
| - AutoThread::CreateWithType("native_file", ui_task_runner, |
| - base::MessageLoop::TYPE_IO); |
| - scoped_refptr<net::URLRequestContextGetter> url_requester = |
| - new URLRequestContextGetter(network_task_runner, file_task_runner); |
| - |
| - return base::WrapUnique(new ChromotingClientRuntime( |
| - ui_task_runner, display_task_runner, network_task_runner, |
| - file_task_runner, url_requester)); |
| + ui_task_runner_ = new AutoThreadTaskRunner(ui_loop_->task_runner(), |
| + base::Bind(&base::DoNothing)); |
| + |
| + display_task_runner_ = AutoThread::Create("native_disp", ui_task_runner_); |
| + network_task_runner_ = AutoThread::CreateWithType( |
| + "native_net", ui_task_runner_, base::MessageLoop::TYPE_IO); |
| + file_task_runner_ = AutoThread::CreateWithType("native_file", ui_task_runner_, |
| + base::MessageLoop::TYPE_IO); |
| + url_requester_ = |
| + new URLRequestContextGetter(network_task_runner_, file_task_runner_); |
| + |
| + CreateLogWriter(); |
| +} |
| + |
| +ChromotingClientRuntime::~ChromotingClientRuntime() { |
| + if (delegate_) { |
| + delegate_->RuntimeWillShutdown(); |
| + } else { |
| + DLOG(ERROR) << "ClientRuntime Delegate is null."; |
| + } |
| +} |
| + |
| +void ChromotingClientRuntime::SetDelegate( |
| + ChromotingClientRuntime::Delegate* delegate) { |
| + delegate_ = delegate; |
| + delegate_->RequestAuthTokenForLogger(); |
| +} |
| + |
| +void ChromotingClientRuntime::CreateLogWriter() { |
| + if (!network_task_runner()->BelongsToCurrentThread()) { |
| + network_task_runner()->PostTask( |
| + FROM_HERE, base::Bind(&ChromotingClientRuntime::CreateLogWriter, |
| + base::Unretained(this))); |
| + return; |
| + } |
| + log_writer_.reset(new TelemetryLogWriter( |
| + kTelemetryBaseUrl, |
| + base::MakeUnique<ChromiumUrlRequestFactory>(url_requester()))); |
| + log_writer_->SetAuthClosure( |
| + base::Bind(&ChromotingClientRuntime::RequestAuthTokenForLogger, |
| + base::Unretained(this))); |
| +} |
| + |
| +void ChromotingClientRuntime::RequestAuthTokenForLogger() { |
| + if (delegate_) { |
| + delegate_->RequestAuthTokenForLogger(); |
| + } else { |
| + DLOG(ERROR) << "ClientRuntime Delegate is null."; |
| + } |
| +} |
| + |
| +TelemetryLogWriter* ChromotingClientRuntime::GetLogWriter() { |
| + DCHECK(network_task_runner()->BelongsToCurrentThread()); |
| + return log_writer_.get(); |
| } |
| -ChromotingClientRuntime::ChromotingClientRuntime( |
| - scoped_refptr<AutoThreadTaskRunner> ui_task_runner, |
| - scoped_refptr<AutoThreadTaskRunner> display_task_runner, |
| - scoped_refptr<AutoThreadTaskRunner> network_task_runner, |
| - scoped_refptr<AutoThreadTaskRunner> file_task_runner, |
| - scoped_refptr<net::URLRequestContextGetter> url_requester) |
| - : ui_task_runner_(ui_task_runner), |
| - display_task_runner_(display_task_runner), |
| - network_task_runner_(network_task_runner), |
| - file_task_runner_(file_task_runner), |
| - url_requester_(url_requester) {} |
| - |
| -ChromotingClientRuntime::~ChromotingClientRuntime() {} |
| } // namespace remoting |