| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "mojo/edk/system/node_controller.h" | 5 #include "mojo/edk/system/node_controller.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 | 443 |
| 444 channel->AcceptChild(name_, token); | 444 channel->AcceptChild(name_, token); |
| 445 } | 445 } |
| 446 | 446 |
| 447 void NodeController::ConnectToParentOnIOThread( | 447 void NodeController::ConnectToParentOnIOThread( |
| 448 ScopedPlatformHandle platform_handle) { | 448 ScopedPlatformHandle platform_handle) { |
| 449 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 449 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
| 450 | 450 |
| 451 { | 451 { |
| 452 base::AutoLock lock(parent_lock_); | 452 base::AutoLock lock(parent_lock_); |
| 453 DCHECK(parent_name_ == ports::kInvalidNodeName); | 453 DCHECK(parent_name_ == ports::constants::kInvalidNodeName); |
| 454 | 454 |
| 455 // At this point we don't know the parent's name, so we can't yet insert it | 455 // At this point we don't know the parent's name, so we can't yet insert it |
| 456 // into our |peers_| map. That will happen as soon as we receive an | 456 // into our |peers_| map. That will happen as soon as we receive an |
| 457 // AcceptChild message from them. | 457 // AcceptChild message from them. |
| 458 bootstrap_parent_channel_ = | 458 bootstrap_parent_channel_ = |
| 459 NodeChannel::Create(this, std::move(platform_handle), io_task_runner_, | 459 NodeChannel::Create(this, std::move(platform_handle), io_task_runner_, |
| 460 ProcessErrorCallback()); | 460 ProcessErrorCallback()); |
| 461 // Prevent the parent pipe handle from being closed on shutdown. Pipe | 461 // Prevent the parent pipe handle from being closed on shutdown. Pipe |
| 462 // closure is used by the parent to detect the child process has exited. | 462 // closure is used by the parent to detect the child process has exited. |
| 463 // Relying on message pipes to be closed is not enough because the parent | 463 // Relying on message pipes to be closed is not enough because the parent |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 broker_name = broker_name_; | 524 broker_name = broker_name_; |
| 525 } | 525 } |
| 526 return GetPeerChannel(broker_name); | 526 return GetPeerChannel(broker_name); |
| 527 } | 527 } |
| 528 | 528 |
| 529 void NodeController::AddPeer(const ports::NodeName& name, | 529 void NodeController::AddPeer(const ports::NodeName& name, |
| 530 scoped_refptr<NodeChannel> channel, | 530 scoped_refptr<NodeChannel> channel, |
| 531 bool start_channel) { | 531 bool start_channel) { |
| 532 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 532 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
| 533 | 533 |
| 534 DCHECK(name != ports::kInvalidNodeName); | 534 DCHECK(name != ports::constants::kInvalidNodeName); |
| 535 DCHECK(channel); | 535 DCHECK(channel); |
| 536 | 536 |
| 537 channel->SetRemoteNodeName(name); | 537 channel->SetRemoteNodeName(name); |
| 538 | 538 |
| 539 OutgoingMessageQueue pending_messages; | 539 OutgoingMessageQueue pending_messages; |
| 540 { | 540 { |
| 541 base::AutoLock lock(peers_lock_); | 541 base::AutoLock lock(peers_lock_); |
| 542 if (peers_.find(name) != peers_.end()) { | 542 if (peers_.find(name) != peers_.end()) { |
| 543 // This can happen normally if two nodes race to be introduced to each | 543 // This can happen normally if two nodes race to be introduced to each |
| 544 // other. The losing pipe will be silently closed and introduction should | 544 // other. The losing pipe will be silently closed and introduction should |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 669 } | 669 } |
| 670 } | 670 } |
| 671 #elif defined(OS_MACOSX) && !defined(OS_IOS) | 671 #elif defined(OS_MACOSX) && !defined(OS_IOS) |
| 672 if (channel_message->has_mach_ports()) { | 672 if (channel_message->has_mach_ports()) { |
| 673 // Messages containing Mach ports are always routed through the broker, even | 673 // Messages containing Mach ports are always routed through the broker, even |
| 674 // if the broker process is the intended recipient. | 674 // if the broker process is the intended recipient. |
| 675 bool use_broker = false; | 675 bool use_broker = false; |
| 676 { | 676 { |
| 677 base::AutoLock lock(parent_lock_); | 677 base::AutoLock lock(parent_lock_); |
| 678 use_broker = (bootstrap_parent_channel_ || | 678 use_broker = (bootstrap_parent_channel_ || |
| 679 parent_name_ != ports::kInvalidNodeName); | 679 parent_name_ != ports::constants::kInvalidNodeName); |
| 680 } | 680 } |
| 681 if (use_broker) { | 681 if (use_broker) { |
| 682 scoped_refptr<NodeChannel> broker = GetBrokerChannel(); | 682 scoped_refptr<NodeChannel> broker = GetBrokerChannel(); |
| 683 if (broker) { | 683 if (broker) { |
| 684 broker->RelayPortsMessage(name, std::move(channel_message)); | 684 broker->RelayPortsMessage(name, std::move(channel_message)); |
| 685 } else { | 685 } else { |
| 686 base::AutoLock lock(broker_lock_); | 686 base::AutoLock lock(broker_lock_); |
| 687 pending_relay_messages_[name].emplace(std::move(channel_message)); | 687 pending_relay_messages_[name].emplace(std::move(channel_message)); |
| 688 } | 688 } |
| 689 return; | 689 return; |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 874 } | 874 } |
| 875 | 875 |
| 876 void NodeController::OnAcceptChild(const ports::NodeName& from_node, | 876 void NodeController::OnAcceptChild(const ports::NodeName& from_node, |
| 877 const ports::NodeName& parent_name, | 877 const ports::NodeName& parent_name, |
| 878 const ports::NodeName& token) { | 878 const ports::NodeName& token) { |
| 879 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 879 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
| 880 | 880 |
| 881 scoped_refptr<NodeChannel> parent; | 881 scoped_refptr<NodeChannel> parent; |
| 882 { | 882 { |
| 883 base::AutoLock lock(parent_lock_); | 883 base::AutoLock lock(parent_lock_); |
| 884 if (bootstrap_parent_channel_ && parent_name_ == ports::kInvalidNodeName) { | 884 if (bootstrap_parent_channel_ && |
| 885 parent_name_ == ports::constants::kInvalidNodeName) { |
| 885 parent_name_ = parent_name; | 886 parent_name_ = parent_name; |
| 886 parent = bootstrap_parent_channel_; | 887 parent = bootstrap_parent_channel_; |
| 887 } | 888 } |
| 888 } | 889 } |
| 889 | 890 |
| 890 if (!parent) { | 891 if (!parent) { |
| 891 DLOG(ERROR) << "Unexpected AcceptChild message from " << from_node; | 892 DLOG(ERROR) << "Unexpected AcceptChild message from " << from_node; |
| 892 DropPeer(from_node, nullptr); | 893 DropPeer(from_node, nullptr); |
| 893 return; | 894 return; |
| 894 } | 895 } |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1035 | 1036 |
| 1036 std::queue<ports::NodeName> pending_broker_clients; | 1037 std::queue<ports::NodeName> pending_broker_clients; |
| 1037 std::unordered_map<ports::NodeName, OutgoingMessageQueue> | 1038 std::unordered_map<ports::NodeName, OutgoingMessageQueue> |
| 1038 pending_relay_messages; | 1039 pending_relay_messages; |
| 1039 { | 1040 { |
| 1040 base::AutoLock lock(broker_lock_); | 1041 base::AutoLock lock(broker_lock_); |
| 1041 broker_name_ = broker_name; | 1042 broker_name_ = broker_name; |
| 1042 std::swap(pending_broker_clients, pending_broker_clients_); | 1043 std::swap(pending_broker_clients, pending_broker_clients_); |
| 1043 std::swap(pending_relay_messages, pending_relay_messages_); | 1044 std::swap(pending_relay_messages, pending_relay_messages_); |
| 1044 } | 1045 } |
| 1045 DCHECK(broker_name != ports::kInvalidNodeName); | 1046 DCHECK(broker_name != ports::constants::kInvalidNodeName); |
| 1046 | 1047 |
| 1047 // It's now possible to add both the broker and the parent as peers. | 1048 // It's now possible to add both the broker and the parent as peers. |
| 1048 // Note that the broker and parent may be the same node. | 1049 // Note that the broker and parent may be the same node. |
| 1049 scoped_refptr<NodeChannel> broker; | 1050 scoped_refptr<NodeChannel> broker; |
| 1050 if (broker_name == parent_name) { | 1051 if (broker_name == parent_name) { |
| 1051 DCHECK(!broker_channel.is_valid()); | 1052 DCHECK(!broker_channel.is_valid()); |
| 1052 broker = parent; | 1053 broker = parent; |
| 1053 } else { | 1054 } else { |
| 1054 DCHECK(broker_channel.is_valid()); | 1055 DCHECK(broker_channel.is_valid()); |
| 1055 broker = NodeChannel::Create(this, std::move(broker_channel), | 1056 broker = NodeChannel::Create(this, std::move(broker_channel), |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1141 DLOG(ERROR) << "MergePorts failed: " << rv; | 1142 DLOG(ERROR) << "MergePorts failed: " << rv; |
| 1142 | 1143 |
| 1143 AcceptIncomingMessages(); | 1144 AcceptIncomingMessages(); |
| 1144 } | 1145 } |
| 1145 | 1146 |
| 1146 void NodeController::OnRequestIntroduction(const ports::NodeName& from_node, | 1147 void NodeController::OnRequestIntroduction(const ports::NodeName& from_node, |
| 1147 const ports::NodeName& name) { | 1148 const ports::NodeName& name) { |
| 1148 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 1149 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
| 1149 | 1150 |
| 1150 scoped_refptr<NodeChannel> requestor = GetPeerChannel(from_node); | 1151 scoped_refptr<NodeChannel> requestor = GetPeerChannel(from_node); |
| 1151 if (from_node == name || name == ports::kInvalidNodeName || !requestor) { | 1152 if (from_node == name || name == ports::constants::kInvalidNodeName || |
| 1153 !requestor) { |
| 1152 DLOG(ERROR) << "Rejecting invalid OnRequestIntroduction message from " | 1154 DLOG(ERROR) << "Rejecting invalid OnRequestIntroduction message from " |
| 1153 << from_node; | 1155 << from_node; |
| 1154 DropPeer(from_node, nullptr); | 1156 DropPeer(from_node, nullptr); |
| 1155 return; | 1157 return; |
| 1156 } | 1158 } |
| 1157 | 1159 |
| 1158 scoped_refptr<NodeChannel> new_friend = GetPeerChannel(name); | 1160 scoped_refptr<NodeChannel> new_friend = GetPeerChannel(name); |
| 1159 if (!new_friend) { | 1161 if (!new_friend) { |
| 1160 // We don't know who they're talking about! | 1162 // We don't know who they're talking about! |
| 1161 requestor->Introduce(name, ScopedPlatformHandle()); | 1163 requestor->Introduce(name, ScopedPlatformHandle()); |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1350 base::Bind(&NodeController::OnChannelError, base::Unretained(this), | 1352 base::Bind(&NodeController::OnChannelError, base::Unretained(this), |
| 1351 from_node, channel)); | 1353 from_node, channel)); |
| 1352 } | 1354 } |
| 1353 } | 1355 } |
| 1354 | 1356 |
| 1355 #if defined(OS_MACOSX) && !defined(OS_IOS) | 1357 #if defined(OS_MACOSX) && !defined(OS_IOS) |
| 1356 MachPortRelay* NodeController::GetMachPortRelay() { | 1358 MachPortRelay* NodeController::GetMachPortRelay() { |
| 1357 { | 1359 { |
| 1358 base::AutoLock lock(parent_lock_); | 1360 base::AutoLock lock(parent_lock_); |
| 1359 // Return null if we're not the root. | 1361 // Return null if we're not the root. |
| 1360 if (bootstrap_parent_channel_ || parent_name_ != ports::kInvalidNodeName) | 1362 if (bootstrap_parent_channel_ || |
| 1363 parent_name_ != ports::constants::kInvalidNodeName) |
| 1361 return nullptr; | 1364 return nullptr; |
| 1362 } | 1365 } |
| 1363 | 1366 |
| 1364 base::AutoLock lock(mach_port_relay_lock_); | 1367 base::AutoLock lock(mach_port_relay_lock_); |
| 1365 return mach_port_relay_.get(); | 1368 return mach_port_relay_.get(); |
| 1366 } | 1369 } |
| 1367 #endif | 1370 #endif |
| 1368 | 1371 |
| 1369 void NodeController::CancelPendingPortMerges() { | 1372 void NodeController::CancelPendingPortMerges() { |
| 1370 std::vector<ports::PortRef> ports_to_close; | 1373 std::vector<ports::PortRef> ports_to_close; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1427 NodeController::PeerConnection::~PeerConnection() = default; | 1430 NodeController::PeerConnection::~PeerConnection() = default; |
| 1428 | 1431 |
| 1429 NodeController::PeerConnection& NodeController::PeerConnection:: | 1432 NodeController::PeerConnection& NodeController::PeerConnection:: |
| 1430 operator=(const PeerConnection& other) = default; | 1433 operator=(const PeerConnection& other) = default; |
| 1431 | 1434 |
| 1432 NodeController::PeerConnection& NodeController::PeerConnection:: | 1435 NodeController::PeerConnection& NodeController::PeerConnection:: |
| 1433 operator=(PeerConnection&& other) = default; | 1436 operator=(PeerConnection&& other) = default; |
| 1434 | 1437 |
| 1435 } // namespace edk | 1438 } // namespace edk |
| 1436 } // namespace mojo | 1439 } // namespace mojo |
| OLD | NEW |