Fix ipc::ChannelMojo not to call GetWeakPtr() from multiple threads.
ipc::ChannelMojo calls GetWeakPtr() to bind WeakPtrs into helpers
returned by CreateThreadSafeChannel(), and in OnPipeError().
Since these calls can be made concurrently from different threads, they
should create a WeakPtr at initialization to use in those calls.
Bug:
Change-Id: I8a86c4e7241314b3aa23dba9915c14d1cb078d31
Reviewed-on: https://chromium-review.googlesource.com/742498
Reviewed-by: Ken Rockot <rockot@chromium.org>
Commit-Queue: Wez <wez@chromium.org>
Cr-Commit-Position: refs/heads/master@{#512513}
CrOS-Libchrome-Original-Commit: 888ef82fea43a33ac86c4b7e2bfc554184133757
diff --git a/ipc/ipc_channel_mojo.cc b/ipc/ipc_channel_mojo.cc
index 6471d83..80bd7f9 100644
--- a/ipc/ipc_channel_mojo.cc
+++ b/ipc/ipc_channel_mojo.cc
@@ -111,6 +111,7 @@
pipe_(handle.get()),
listener_(listener),
weak_factory_(this) {
+ weak_ptr_ = weak_factory_.GetWeakPtr();
bootstrap_ = MojoBootstrap::Create(std::move(handle), mode, ipc_task_runner);
}
@@ -183,9 +184,8 @@
if (task_runner_->RunsTasksInCurrentSequence()) {
listener_->OnChannelError();
} else {
- task_runner_->PostTask(
- FROM_HERE,
- base::Bind(&ChannelMojo::OnPipeError, weak_factory_.GetWeakPtr()));
+ task_runner_->PostTask(FROM_HERE,
+ base::Bind(&ChannelMojo::OnPipeError, weak_ptr_));
}
}
@@ -230,10 +230,9 @@
ChannelMojo::CreateThreadSafeChannel() {
return std::make_unique<mojo::ThreadSafeForwarder<mojom::Channel>>(
task_runner_,
- base::Bind(&ChannelMojo::ForwardMessageFromThreadSafePtr,
- weak_factory_.GetWeakPtr()),
+ base::Bind(&ChannelMojo::ForwardMessageFromThreadSafePtr, weak_ptr_),
base::Bind(&ChannelMojo::ForwardMessageWithResponderFromThreadSafePtr,
- weak_factory_.GetWeakPtr()),
+ weak_ptr_),
*bootstrap_->GetAssociatedGroup());
}
diff --git a/ipc/ipc_channel_mojo.h b/ipc/ipc_channel_mojo.h
index 61bc0db..d5aab3f 100644
--- a/ipc/ipc_channel_mojo.h
+++ b/ipc/ipc_channel_mojo.h
@@ -114,6 +114,8 @@
const std::string& name,
mojo::ScopedInterfaceEndpointHandle handle) override;
+ base::WeakPtr<ChannelMojo> weak_ptr_;
+
// A TaskRunner which runs tasks on the ChannelMojo's owning thread.
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;