| Index: remoting/host/desktop_process.cc
|
| diff --git a/remoting/host/desktop_process.cc b/remoting/host/desktop_process.cc
|
| index d2d25ac9550519b1b6dd1117aaf665d50d1b8d0f..7f3d7301b2e97c93d1d55bba8d861163d2523f8f 100644
|
| --- a/remoting/host/desktop_process.cc
|
| +++ b/remoting/host/desktop_process.cc
|
| @@ -12,26 +12,33 @@
|
| #include "base/logging.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/message_loop.h"
|
| -#include "base/run_loop.h"
|
| #include "ipc/ipc_channel_proxy.h"
|
| #include "remoting/base/auto_thread.h"
|
| #include "remoting/base/auto_thread_task_runner.h"
|
| #include "remoting/host/chromoting_messages.h"
|
| #include "remoting/host/desktop_session_agent.h"
|
| -#include "remoting/host/host_exit_codes.h"
|
|
|
| const char kIoThreadName[] = "I/O thread";
|
|
|
| namespace remoting {
|
|
|
| -DesktopProcess::DesktopProcess(const std::string& daemon_channel_name)
|
| - : daemon_channel_name_(daemon_channel_name) {
|
| +DesktopProcess::DesktopProcess(
|
| + scoped_refptr<AutoThreadTaskRunner> caller_task_runner,
|
| + const std::string& daemon_channel_name)
|
| + : caller_task_runner_(caller_task_runner),
|
| + daemon_channel_name_(daemon_channel_name) {
|
| + DCHECK(caller_task_runner_->BelongsToCurrentThread());
|
| + DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI);
|
| }
|
|
|
| DesktopProcess::~DesktopProcess() {
|
| + DCHECK(!daemon_channel_);
|
| + DCHECK(!desktop_agent_);
|
| }
|
|
|
| bool DesktopProcess::OnMessageReceived(const IPC::Message& message) {
|
| + DCHECK(caller_task_runner_->BelongsToCurrentThread());
|
| +
|
| bool handled = true;
|
| IPC_BEGIN_MESSAGE_MAP(DesktopProcess, message)
|
| IPC_MESSAGE_HANDLER(ChromotingDaemonDesktopMsg_Crash, OnCrash)
|
| @@ -41,64 +48,56 @@ bool DesktopProcess::OnMessageReceived(const IPC::Message& message) {
|
| }
|
|
|
| void DesktopProcess::OnChannelConnected(int32 peer_pid) {
|
| + DCHECK(caller_task_runner_->BelongsToCurrentThread());
|
| +
|
| VLOG(1) << "IPC: desktop <- daemon (" << peer_pid << ")";
|
|
|
| NOTIMPLEMENTED();
|
| }
|
|
|
| void DesktopProcess::OnChannelError() {
|
| + DCHECK(caller_task_runner_->BelongsToCurrentThread());
|
| +
|
| // Shutdown the desktop process.
|
| daemon_channel_.reset();
|
| desktop_agent_.reset();
|
| + caller_task_runner_ = NULL;
|
| }
|
|
|
| -int DesktopProcess::Run() {
|
| - DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI);
|
| -
|
| - {
|
| - scoped_refptr<AutoThreadTaskRunner> ui_task_runner =
|
| - new remoting::AutoThreadTaskRunner(
|
| - MessageLoop::current()->message_loop_proxy(),
|
| - MessageLoop::QuitClosure());
|
| -
|
| - // Launch the I/O thread.
|
| - scoped_refptr<AutoThreadTaskRunner> io_task_runner =
|
| - AutoThread::CreateWithType(kIoThreadName, ui_task_runner,
|
| - MessageLoop::TYPE_IO);
|
| -
|
| - // Create a desktop agent.
|
| - desktop_agent_ = DesktopSessionAgent::Create(ui_task_runner,
|
| - io_task_runner);
|
| -
|
| - // Start the agent and create an IPC channel to talk to it. It is safe to
|
| - // use base::Unretained(this) here because the message loop below will run
|
| - // until |desktop_agent_| is completely destroyed.
|
| - IPC::PlatformFileForTransit desktop_pipe;
|
| - if (!desktop_agent_->Start(base::Bind(&DesktopProcess::OnChannelError,
|
| - base::Unretained(this)),
|
| - &desktop_pipe)) {
|
| - desktop_agent_.reset();
|
| - return kInitializationFailed;
|
| - }
|
| -
|
| - // Connect to the daemon.
|
| - daemon_channel_.reset(new IPC::ChannelProxy(daemon_channel_name_,
|
| - IPC::Channel::MODE_CLIENT,
|
| - this,
|
| - io_task_runner));
|
| -
|
| - // Pass |desktop_pipe| to the daemon.
|
| - daemon_channel_->Send(
|
| - new ChromotingDesktopDaemonMsg_DesktopAttached(desktop_pipe));
|
| +bool DesktopProcess::Start() {
|
| + DCHECK(caller_task_runner_->BelongsToCurrentThread());
|
| +
|
| + // Launch the I/O thread.
|
| + scoped_refptr<AutoThreadTaskRunner> io_task_runner =
|
| + AutoThread::CreateWithType(kIoThreadName, caller_task_runner_,
|
| + MessageLoop::TYPE_IO);
|
| +
|
| + // Create a desktop agent.
|
| + desktop_agent_ = DesktopSessionAgent::Create(caller_task_runner_,
|
| + io_task_runner);
|
| +
|
| + // Start the agent and create an IPC channel to talk to it. It is safe to
|
| + // use base::Unretained(this) here because the message loop below will run
|
| + // until |desktop_agent_| is completely destroyed.
|
| + IPC::PlatformFileForTransit desktop_pipe;
|
| + if (!desktop_agent_->Start(base::Bind(&DesktopProcess::OnChannelError,
|
| + base::Unretained(this)),
|
| + &desktop_pipe)) {
|
| + desktop_agent_.reset();
|
| + return false;
|
| }
|
|
|
| - // Run the UI message loop.
|
| - base::RunLoop run_loop;
|
| - run_loop.Run();
|
| + // Connect to the daemon.
|
| + daemon_channel_.reset(new IPC::ChannelProxy(daemon_channel_name_,
|
| + IPC::Channel::MODE_CLIENT,
|
| + this,
|
| + io_task_runner));
|
|
|
| - DCHECK(!daemon_channel_);
|
| - DCHECK(!desktop_agent_);
|
| - return kSuccessExitCode;
|
| + // Pass |desktop_pipe| to the daemon.
|
| + daemon_channel_->Send(
|
| + new ChromotingDesktopDaemonMsg_DesktopAttached(desktop_pipe));
|
| +
|
| + return true;
|
| }
|
|
|
| void DesktopProcess::OnCrash(const std::string& function_name,
|
|
|