| 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 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 } | 183 } |
| 184 | 184 |
| 185 void NodeController::ReservePort(const std::string& token, | 185 void NodeController::ReservePort(const std::string& token, |
| 186 const ports::PortRef& port) { | 186 const ports::PortRef& port) { |
| 187 DVLOG(2) << "Reserving port " << port.name() << "@" << name_ << " for token " | 187 DVLOG(2) << "Reserving port " << port.name() << "@" << name_ << " for token " |
| 188 << token; | 188 << token; |
| 189 | 189 |
| 190 base::AutoLock lock(reserved_ports_lock_); | 190 base::AutoLock lock(reserved_ports_lock_); |
| 191 auto result = reserved_ports_.insert(std::make_pair(token, port)); | 191 auto result = reserved_ports_.insert(std::make_pair(token, port)); |
| 192 DCHECK(result.second); | 192 DCHECK(result.second); |
| 193 | |
| 194 // Safeguard against unpredictable and exceptional cases where a reservation | |
| 195 // holder may disappear without ever claiming their reservation. | |
| 196 io_task_runner_->PostDelayedTask( | |
| 197 FROM_HERE, | |
| 198 base::Bind(&NodeController::CancelReservation, | |
| 199 base::Unretained(this), token), | |
| 200 base::TimeDelta::FromMinutes(1)); | |
| 201 } | 193 } |
| 202 | 194 |
| 203 void NodeController::MergePortIntoParent(const std::string& token, | 195 void NodeController::MergePortIntoParent(const std::string& token, |
| 204 const ports::PortRef& port) { | 196 const ports::PortRef& port) { |
| 205 bool was_merged = false; | 197 bool was_merged = false; |
| 206 { | 198 { |
| 207 // This request may be coming from within the process that reserved the | 199 // This request may be coming from within the process that reserved the |
| 208 // "parent" side (e.g. for Chrome single-process mode), so if this token is | 200 // "parent" side (e.g. for Chrome single-process mode), so if this token is |
| 209 // reserved locally, merge locally instead. | 201 // reserved locally, merge locally instead. |
| 210 base::AutoLock lock(reserved_ports_lock_); | 202 base::AutoLock lock(reserved_ports_lock_); |
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 540 pending_peer_messages_.clear(); | 532 pending_peer_messages_.clear(); |
| 541 } | 533 } |
| 542 | 534 |
| 543 for (const auto& peer : all_peers) | 535 for (const auto& peer : all_peers) |
| 544 peer->ShutDown(); | 536 peer->ShutDown(); |
| 545 | 537 |
| 546 if (destroy_on_io_thread_shutdown_) | 538 if (destroy_on_io_thread_shutdown_) |
| 547 delete this; | 539 delete this; |
| 548 } | 540 } |
| 549 | 541 |
| 550 void NodeController::CancelReservation(const std::string& token) { | |
| 551 ports::PortRef reserved_port; | |
| 552 { | |
| 553 base::AutoLock lock(reserved_ports_lock_); | |
| 554 auto iter = reserved_ports_.find(token); | |
| 555 if (iter == reserved_ports_.end()) // Already claimed! | |
| 556 return; | |
| 557 reserved_port = iter->second; | |
| 558 reserved_ports_.erase(iter); | |
| 559 } | |
| 560 node_->ClosePort(reserved_port); | |
| 561 } | |
| 562 | |
| 563 void NodeController::GenerateRandomPortName(ports::PortName* port_name) { | 542 void NodeController::GenerateRandomPortName(ports::PortName* port_name) { |
| 564 GenerateRandomName(port_name); | 543 GenerateRandomName(port_name); |
| 565 } | 544 } |
| 566 | 545 |
| 567 void NodeController::AllocMessage(size_t num_header_bytes, | 546 void NodeController::AllocMessage(size_t num_header_bytes, |
| 568 ports::ScopedMessage* message) { | 547 ports::ScopedMessage* message) { |
| 569 message->reset(new PortsMessage(num_header_bytes, 0, 0, nullptr)); | 548 message->reset(new PortsMessage(num_header_bytes, 0, 0, nullptr)); |
| 570 } | 549 } |
| 571 | 550 |
| 572 void NodeController::ForwardMessage(const ports::NodeName& node, | 551 void NodeController::ForwardMessage(const ports::NodeName& node, |
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1030 shutdown_callback_flag_.Set(false); | 1009 shutdown_callback_flag_.Set(false); |
| 1031 } | 1010 } |
| 1032 | 1011 |
| 1033 DCHECK(!callback.is_null()); | 1012 DCHECK(!callback.is_null()); |
| 1034 | 1013 |
| 1035 callback.Run(); | 1014 callback.Run(); |
| 1036 } | 1015 } |
| 1037 | 1016 |
| 1038 } // namespace edk | 1017 } // namespace edk |
| 1039 } // namespace mojo | 1018 } // namespace mojo |
| OLD | NEW |