| Index: ipc/mojo/ipc_channel_mojo.cc
|
| diff --git a/ipc/mojo/ipc_channel_mojo.cc b/ipc/mojo/ipc_channel_mojo.cc
|
| index f338c6fcdd96df8656681827bbeb08054c049a42..4689e5f64ec7076d9f06b5345310d98d60c45124 100644
|
| --- a/ipc/mojo/ipc_channel_mojo.cc
|
| +++ b/ipc/mojo/ipc_channel_mojo.cc
|
| @@ -28,20 +28,26 @@ namespace {
|
| class MojoChannelFactory : public ChannelFactory {
|
| public:
|
| MojoChannelFactory(ChannelMojo::Delegate* delegate,
|
| + scoped_refptr<base::TaskRunner> io_runner,
|
| ChannelHandle channel_handle,
|
| Channel::Mode mode)
|
| - : delegate_(delegate), channel_handle_(channel_handle), mode_(mode) {}
|
| + : delegate_(delegate),
|
| + io_runner_(io_runner),
|
| + channel_handle_(channel_handle),
|
| + mode_(mode) {}
|
|
|
| std::string GetName() const override {
|
| return channel_handle_.name;
|
| }
|
|
|
| scoped_ptr<Channel> BuildChannel(Listener* listener) override {
|
| - return ChannelMojo::Create(delegate_, channel_handle_, mode_, listener);
|
| + return ChannelMojo::Create(delegate_, io_runner_, channel_handle_, mode_,
|
| + listener);
|
| }
|
|
|
| private:
|
| ChannelMojo::Delegate* delegate_;
|
| + scoped_refptr<base::TaskRunner> io_runner_;
|
| ChannelHandle channel_handle_;
|
| Channel::Mode mode_;
|
| };
|
| @@ -53,6 +59,7 @@ class ClientChannelMojo : public ChannelMojo,
|
| public mojo::ErrorHandler {
|
| public:
|
| ClientChannelMojo(ChannelMojo::Delegate* delegate,
|
| + scoped_refptr<base::TaskRunner> io_runner,
|
| const ChannelHandle& handle,
|
| Listener* listener);
|
| ~ClientChannelMojo() override;
|
| @@ -73,9 +80,10 @@ class ClientChannelMojo : public ChannelMojo,
|
| };
|
|
|
| ClientChannelMojo::ClientChannelMojo(ChannelMojo::Delegate* delegate,
|
| + scoped_refptr<base::TaskRunner> io_runner,
|
| const ChannelHandle& handle,
|
| Listener* listener)
|
| - : ChannelMojo(delegate, handle, Channel::MODE_CLIENT, listener),
|
| + : ChannelMojo(delegate, io_runner, handle, Channel::MODE_CLIENT, listener),
|
| binding_(this) {
|
| }
|
|
|
| @@ -104,6 +112,7 @@ void ClientChannelMojo::Init(
|
| class ServerChannelMojo : public ChannelMojo, public mojo::ErrorHandler {
|
| public:
|
| ServerChannelMojo(ChannelMojo::Delegate* delegate,
|
| + scoped_refptr<base::TaskRunner> io_runner,
|
| const ChannelHandle& handle,
|
| Listener* listener);
|
| ~ServerChannelMojo() override;
|
| @@ -126,9 +135,10 @@ class ServerChannelMojo : public ChannelMojo, public mojo::ErrorHandler {
|
| };
|
|
|
| ServerChannelMojo::ServerChannelMojo(ChannelMojo::Delegate* delegate,
|
| + scoped_refptr<base::TaskRunner> io_runner,
|
| const ChannelHandle& handle,
|
| Listener* listener)
|
| - : ChannelMojo(delegate, handle, Channel::MODE_SERVER, listener) {
|
| + : ChannelMojo(delegate, io_runner, handle, Channel::MODE_SERVER, listener) {
|
| }
|
|
|
| ServerChannelMojo::~ServerChannelMojo() {
|
| @@ -196,17 +206,19 @@ bool ChannelMojo::ShouldBeUsed() {
|
| }
|
|
|
| // static
|
| -scoped_ptr<ChannelMojo> ChannelMojo::Create(ChannelMojo::Delegate* delegate,
|
| - const ChannelHandle& channel_handle,
|
| - Mode mode,
|
| - Listener* listener) {
|
| +scoped_ptr<ChannelMojo> ChannelMojo::Create(
|
| + ChannelMojo::Delegate* delegate,
|
| + scoped_refptr<base::TaskRunner> io_runner,
|
| + const ChannelHandle& channel_handle,
|
| + Mode mode,
|
| + Listener* listener) {
|
| switch (mode) {
|
| case Channel::MODE_CLIENT:
|
| return make_scoped_ptr(
|
| - new ClientChannelMojo(delegate, channel_handle, listener));
|
| + new ClientChannelMojo(delegate, io_runner, channel_handle, listener));
|
| case Channel::MODE_SERVER:
|
| return make_scoped_ptr(
|
| - new ServerChannelMojo(delegate, channel_handle, listener));
|
| + new ServerChannelMojo(delegate, io_runner, channel_handle, listener));
|
| default:
|
| NOTREACHED();
|
| return nullptr;
|
| @@ -216,20 +228,23 @@ scoped_ptr<ChannelMojo> ChannelMojo::Create(ChannelMojo::Delegate* delegate,
|
| // static
|
| scoped_ptr<ChannelFactory> ChannelMojo::CreateServerFactory(
|
| ChannelMojo::Delegate* delegate,
|
| + scoped_refptr<base::TaskRunner> io_runner,
|
| const ChannelHandle& channel_handle) {
|
| - return make_scoped_ptr(
|
| - new MojoChannelFactory(delegate, channel_handle, Channel::MODE_SERVER));
|
| + return make_scoped_ptr(new MojoChannelFactory(
|
| + delegate, io_runner, channel_handle, Channel::MODE_SERVER));
|
| }
|
|
|
| // static
|
| scoped_ptr<ChannelFactory> ChannelMojo::CreateClientFactory(
|
| ChannelMojo::Delegate* delegate,
|
| + scoped_refptr<base::TaskRunner> io_runner,
|
| const ChannelHandle& channel_handle) {
|
| - return make_scoped_ptr(
|
| - new MojoChannelFactory(delegate, channel_handle, Channel::MODE_CLIENT));
|
| + return make_scoped_ptr(new MojoChannelFactory(
|
| + delegate, io_runner, channel_handle, Channel::MODE_CLIENT));
|
| }
|
|
|
| ChannelMojo::ChannelMojo(ChannelMojo::Delegate* delegate,
|
| + scoped_refptr<base::TaskRunner> io_runner,
|
| const ChannelHandle& handle,
|
| Mode mode,
|
| Listener* listener)
|
| @@ -240,16 +255,12 @@ ChannelMojo::ChannelMojo(ChannelMojo::Delegate* delegate,
|
| // Create MojoBootstrap after all members are set as it touches
|
| // ChannelMojo from a different thread.
|
| bootstrap_ = MojoBootstrap::Create(handle, mode, this);
|
| - if (delegate) {
|
| - if (delegate->GetIOTaskRunner() ==
|
| - base::MessageLoop::current()->message_loop_proxy()) {
|
| - InitDelegate(delegate);
|
| - } else {
|
| - delegate->GetIOTaskRunner()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(
|
| - &ChannelMojo::InitDelegate, base::Unretained(this), delegate));
|
| - }
|
| + if (io_runner == base::MessageLoop::current()->message_loop_proxy()) {
|
| + InitOnIOThread(delegate);
|
| + } else {
|
| + io_runner->PostTask(FROM_HERE,
|
| + base::Bind(&ChannelMojo::InitOnIOThread,
|
| + base::Unretained(this), delegate));
|
| }
|
| }
|
|
|
| @@ -257,9 +268,11 @@ ChannelMojo::~ChannelMojo() {
|
| Close();
|
| }
|
|
|
| -void ChannelMojo::InitDelegate(ChannelMojo::Delegate* delegate) {
|
| +void ChannelMojo::InitOnIOThread(ChannelMojo::Delegate* delegate) {
|
| ipc_support_.reset(
|
| new ScopedIPCSupport(base::MessageLoop::current()->task_runner()));
|
| + if (!delegate)
|
| + return;
|
| delegate_ = delegate->ToWeakPtr();
|
| delegate_->OnChannelCreated(weak_factory_.GetWeakPtr());
|
| }
|
|
|