Index: ipc/ipc_channel_mojo.cc |
diff --git a/ipc/ipc_channel_mojo.cc b/ipc/ipc_channel_mojo.cc |
index 4189b9c06f1a58bfa4ebc28b3c9a10442aaada9c..3d5e8553a658bb84c27dbf04bcdcfb5662c35644 100644 |
--- a/ipc/ipc_channel_mojo.cc |
+++ b/ipc/ipc_channel_mojo.cc |
@@ -274,25 +274,49 @@ ChannelMojo::ChannelMojo( |
Mode mode, |
Listener* listener, |
const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner) |
- : pipe_(handle.get()), listener_(listener), weak_factory_(this) { |
- // Create MojoBootstrap after all members are set as it touches |
- // ChannelMojo from a different thread. |
- bootstrap_ = |
- MojoBootstrap::Create(std::move(handle), mode, this, ipc_task_runner); |
+ : task_runner_(ipc_task_runner), |
+ pipe_(handle.get()), |
+ listener_(listener), |
+ weak_factory_(this) { |
+ bootstrap_ = MojoBootstrap::Create(std::move(handle), mode, ipc_task_runner); |
+} |
+ |
+void ChannelMojo::ForwardMessageFromThreadSafePtr(mojo::Message message) { |
+ DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
+ if (!message_reader_) |
+ return; |
+ message_reader_->sender().internal_state()->ForwardMessage( |
+ std::move(message)); |
+} |
+ |
+void ChannelMojo::ForwardMessageWithResponderFromThreadSafePtr( |
+ mojo::Message message, |
+ std::unique_ptr<mojo::MessageReceiver> responder) { |
+ DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
+ if (!message_reader_) |
+ return; |
+ message_reader_->sender().internal_state()->ForwardMessageWithResponder( |
+ std::move(message), std::move(responder)); |
} |
ChannelMojo::~ChannelMojo() { |
+ DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
Close(); |
} |
bool ChannelMojo::Connect() { |
+ DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
+ |
WillConnect(); |
- DCHECK(!task_runner_); |
- task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
- DCHECK(!message_reader_); |
+ mojom::ChannelAssociatedPtr sender; |
+ mojom::ChannelAssociatedRequest receiver; |
+ bootstrap_->Connect(&sender, &receiver); |
- bootstrap_->Connect(); |
+ DCHECK(!message_reader_); |
+ sender->SetPeerPid(GetSelfPID()); |
+ message_reader_.reset(new internal::MessagePipeReader( |
+ pipe_, std::move(sender), std::move(receiver), this)); |
return true; |
} |
@@ -321,14 +345,6 @@ void ChannelMojo::Close() { |
associated_interfaces_.clear(); |
} |
-// MojoBootstrap::Delegate implementation |
-void ChannelMojo::OnPipesAvailable(mojom::ChannelAssociatedPtr sender, |
- mojom::ChannelAssociatedRequest receiver) { |
- sender->SetPeerPid(GetSelfPID()); |
- message_reader_.reset(new internal::MessagePipeReader( |
- pipe_, std::move(sender), std::move(receiver), this)); |
-} |
- |
void ChannelMojo::OnPipeError() { |
DCHECK(task_runner_); |
if (task_runner_->RunsTasksOnCurrentThread()) { |
@@ -377,6 +393,15 @@ bool ChannelMojo::Send(Message* message) { |
Channel::AssociatedInterfaceSupport* |
ChannelMojo::GetAssociatedInterfaceSupport() { return this; } |
+std::unique_ptr<mojo::ThreadSafeForwarder<mojom::Channel>> |
+ChannelMojo::CreateThreadSafeChannel() { |
+ return base::MakeUnique<mojo::ThreadSafeForwarder<mojom::Channel>>( |
+ task_runner_, base::Bind(&ChannelMojo::ForwardMessageFromThreadSafePtr, |
+ weak_factory_.GetWeakPtr()), |
+ base::Bind(&ChannelMojo::ForwardMessageWithResponderFromThreadSafePtr, |
+ weak_factory_.GetWeakPtr())); |
+} |
+ |
void ChannelMojo::OnPeerPidReceived(int32_t peer_pid) { |
listener_->OnChannelConnected(peer_pid); |
} |