diff options
Diffstat (limited to 'mojo')
-rw-r--r-- | mojo/edk/system/node_controller.cc | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/mojo/edk/system/node_controller.cc b/mojo/edk/system/node_controller.cc index 3733c6c..30b331f 100644 --- a/mojo/edk/system/node_controller.cc +++ b/mojo/edk/system/node_controller.cc @@ -500,15 +500,20 @@ void NodeController::AcceptIncomingMessages() { void NodeController::DropAllPeers() { DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); + std::vector<scoped_refptr<NodeChannel>> all_peers; { base::AutoLock lock(parent_lock_); if (bootstrap_parent_channel_) { - bootstrap_parent_channel_->ShutDown(); - bootstrap_parent_channel_ = nullptr; + // |bootstrap_parent_channel_| isn't null'd here becuase we rely on its + // existence to determine whether or not this is the root node. Once + // bootstrap_parent_channel_->ShutDown() has been called, + // |bootstrap_parent_channel_| is essentially a dead object and it doesn't + // matter if it's deleted now or when |this| is deleted. + // Note: |bootstrap_parent_channel_| is only modified on the IO thread. + all_peers.push_back(bootstrap_parent_channel_); } } - std::vector<scoped_refptr<NodeChannel>> all_peers; { base::AutoLock lock(peers_lock_); for (const auto& peer : peers_) |