Chromium Code Reviews| Index: ipc/mojo/ipc_channel_mojo_host.cc |
| diff --git a/ipc/mojo/ipc_channel_mojo_host.cc b/ipc/mojo/ipc_channel_mojo_host.cc |
| index 4318a15f54379e5fb568ebd15735eb313b2ebf14..6901a4ae8bbcdb6fda6f93f13dff1914e8872050 100644 |
| --- a/ipc/mojo/ipc_channel_mojo_host.cc |
| +++ b/ipc/mojo/ipc_channel_mojo_host.cc |
| @@ -10,38 +10,102 @@ |
| namespace IPC { |
| -ChannelMojoHost::ChannelMojoHost(scoped_refptr<base::TaskRunner> task_runner) |
| - : weak_factory_(this), task_runner_(task_runner), channel_(NULL) { |
| +// The delete class lives in IO thread to talk to ChannelMojo on |
|
viettrungluu
2014/09/25 22:09:07
"delete" -> "delegate"
"in" -> "on the"
Hajime Morrita
2014/09/25 22:15:12
Done.
|
| +// behalf of ChannelMojoHost. |
| +// |
| +// The object must be touched only in IO thread. |
|
viettrungluu
2014/09/25 22:09:07
"in" -> "on the"
Hajime Morrita
2014/09/25 22:15:12
Done.
|
| +class ChannelMojoHost::ChannelDelegate : public ChannelMojo::Delegate { |
| + public: |
| + explicit ChannelDelegate(scoped_refptr<base::TaskRunner> io_task_runner); |
| + virtual ~ChannelDelegate(); |
| + |
| + // ChannelMojo::Delegate |
| + virtual base::WeakPtr<Delegate> ToWeakPtr() OVERRIDE; |
| + virtual void OnChannelCreated(base::WeakPtr<ChannelMojo> channel) OVERRIDE; |
| + |
| + // Returns an weak ptr of ChannelDelegate instead of Delegate |
| + base::WeakPtr<ChannelDelegate> GetWeakPtr(); |
| + void OnClientLaunched(base::ProcessHandle process); |
| + void DeleteThisSoon(); |
| + |
| + private: |
| + scoped_refptr<base::TaskRunner> io_task_runner_; |
| + base::WeakPtrFactory<ChannelDelegate> weak_factory_; |
| + base::WeakPtr<ChannelMojo> channel_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ChannelDelegate); |
| +}; |
| + |
| +ChannelMojoHost::ChannelDelegate::ChannelDelegate( |
| + scoped_refptr<base::TaskRunner> io_task_runner) |
| + : io_task_runner_(io_task_runner), weak_factory_(this) { |
| +} |
| + |
| +ChannelMojoHost::ChannelDelegate::~ChannelDelegate() { |
| + DCHECK_EQ(io_task_runner_, |
| + base::MessageLoop::current()->message_loop_proxy()); |
| +} |
| + |
| +base::WeakPtr<ChannelMojo::Delegate> |
| +ChannelMojoHost::ChannelDelegate::ToWeakPtr() { |
| + return weak_factory_.GetWeakPtr(); |
| +} |
| + |
| +base::WeakPtr<ChannelMojoHost::ChannelDelegate> |
| +ChannelMojoHost::ChannelDelegate::GetWeakPtr() { |
| + return weak_factory_.GetWeakPtr(); |
| +} |
| + |
| +void ChannelMojoHost::ChannelDelegate::OnChannelCreated( |
| + base::WeakPtr<ChannelMojo> channel) { |
| + DCHECK(!channel_); |
| + channel_ = channel; |
| +} |
| + |
| +void ChannelMojoHost::ChannelDelegate::OnClientLaunched( |
| + base::ProcessHandle process) { |
| + if (channel_) |
| + channel_->OnClientLaunched(process); |
| +} |
| + |
| +void ChannelMojoHost::ChannelDelegate::DeleteThisSoon() { |
| + io_task_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&base::DeletePointer<ChannelMojoHost::ChannelDelegate>, |
| + base::Unretained(this))); |
| +} |
| + |
| +// |
| +// ChannelMojoHost |
| +// |
| + |
| +ChannelMojoHost::ChannelMojoHost(scoped_refptr<base::TaskRunner> io_task_runner) |
| + : weak_factory_(this), |
| + io_task_runner_(io_task_runner), |
| + channel_delegate_(new ChannelDelegate(io_task_runner)) { |
| } |
| ChannelMojoHost::~ChannelMojoHost() { |
| } |
| void ChannelMojoHost::OnClientLaunched(base::ProcessHandle process) { |
| - if (task_runner_ == base::MessageLoop::current()->message_loop_proxy()) { |
| - InvokeOnClientLaunched(process); |
| + if (io_task_runner_ == base::MessageLoop::current()->message_loop_proxy()) { |
| + channel_delegate_->OnClientLaunched(process); |
| } else { |
| - task_runner_->PostTask(FROM_HERE, |
| - base::Bind(&ChannelMojoHost::InvokeOnClientLaunched, |
| - weak_factory_.GetWeakPtr(), |
| - process)); |
| + io_task_runner_->PostTask(FROM_HERE, |
| + base::Bind(&ChannelDelegate::OnClientLaunched, |
| + channel_delegate_->GetWeakPtr(), |
| + process)); |
| } |
| } |
| -void ChannelMojoHost::InvokeOnClientLaunched(base::ProcessHandle process) { |
| - if (!channel_) |
| - return; |
| - channel_->OnClientLaunched(process); |
| -} |
| - |
| -void ChannelMojoHost::OnChannelCreated(ChannelMojo* channel) { |
| - DCHECK(channel_ == NULL); |
| - channel_ = channel; |
| +ChannelMojo::Delegate* ChannelMojoHost::channel_delegate() const { |
| + return channel_delegate_.get(); |
| } |
| -void ChannelMojoHost::OnChannelDestroyed() { |
| - DCHECK(channel_ != NULL); |
| - channel_ = NULL; |
| +void ChannelMojoHost::DelegateDeleter::operator()( |
| + ChannelMojoHost::ChannelDelegate* ptr) const { |
| + ptr->DeleteThisSoon(); |
| } |
| } // namespace IPC |