| 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/ports/node.h" | 5 #include "mojo/edk/system/ports/node.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 return rv; | 401 return rv; |
| 402 } | 402 } |
| 403 | 403 |
| 404 int Node::LostConnectionToNode(const NodeName& node_name) { | 404 int Node::LostConnectionToNode(const NodeName& node_name) { |
| 405 // We can no longer send events to the given node. We also can't expect any | 405 // We can no longer send events to the given node. We also can't expect any |
| 406 // PortAccepted events. | 406 // PortAccepted events. |
| 407 | 407 |
| 408 DVLOG(1) << "Observing lost connection from node " << name_ | 408 DVLOG(1) << "Observing lost connection from node " << name_ |
| 409 << " to node " << node_name; | 409 << " to node " << node_name; |
| 410 | 410 |
| 411 DestroyAllPortsWithPeer(node_name, kInvalidPortName); | 411 DestroyAllPortsWithPeer(node_name, constants::kInvalidPortName); |
| 412 return OK; | 412 return OK; |
| 413 } | 413 } |
| 414 | 414 |
| 415 int Node::OnUserMessage(ScopedMessage message) { | 415 int Node::OnUserMessage(ScopedMessage message) { |
| 416 PortName port_name = GetEventHeader(*message)->port_name; | 416 PortName port_name = GetEventHeader(*message)->port_name; |
| 417 const auto* event = GetEventData<UserEventData>(*message); | 417 const auto* event = GetEventData<UserEventData>(*message); |
| 418 | 418 |
| 419 #if DCHECK_IS_ON() | 419 #if DCHECK_IS_ON() |
| 420 std::ostringstream ports_buf; | 420 std::ostringstream ports_buf; |
| 421 for (size_t i = 0; i < message->num_ports(); ++i) { | 421 for (size_t i = 0; i < message->num_ports(); ++i) { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 502 | 502 |
| 503 DVLOG(2) << "PortAccepted at " << port_name << "@" << name_ | 503 DVLOG(2) << "PortAccepted at " << port_name << "@" << name_ |
| 504 << " pointing to " | 504 << " pointing to " |
| 505 << port->peer_port_name << "@" << port->peer_node_name; | 505 << port->peer_port_name << "@" << port->peer_node_name; |
| 506 | 506 |
| 507 return BeginProxying(PortRef(port_name, port)); | 507 return BeginProxying(PortRef(port_name, port)); |
| 508 } | 508 } |
| 509 | 509 |
| 510 int Node::OnObserveProxy(const PortName& port_name, | 510 int Node::OnObserveProxy(const PortName& port_name, |
| 511 const ObserveProxyEventData& event) { | 511 const ObserveProxyEventData& event) { |
| 512 if (port_name == kInvalidPortName) { | 512 if (port_name == constants::kInvalidPortName) { |
| 513 // An ObserveProxy with an invalid target port name is a broadcast used to | 513 // An ObserveProxy with an invalid target port name is a broadcast used to |
| 514 // inform ports when their peer (which was itself a proxy) has become | 514 // inform ports when their peer (which was itself a proxy) has become |
| 515 // defunct due to unexpected node disconnection. | 515 // defunct due to unexpected node disconnection. |
| 516 // | 516 // |
| 517 // Receiving ports affected by this treat it as equivalent to peer closure. | 517 // Receiving ports affected by this treat it as equivalent to peer closure. |
| 518 // Proxies affected by this can be removed and will in turn broadcast their | 518 // Proxies affected by this can be removed and will in turn broadcast their |
| 519 // own death with a similar message. | 519 // own death with a similar message. |
| 520 CHECK_EQ(event.proxy_to_node_name, kInvalidNodeName); | 520 CHECK_EQ(event.proxy_to_node_name, constants::kInvalidNodeName); |
| 521 CHECK_EQ(event.proxy_to_port_name, kInvalidPortName); | 521 CHECK_EQ(event.proxy_to_port_name, constants::kInvalidPortName); |
| 522 DestroyAllPortsWithPeer(event.proxy_node_name, event.proxy_port_name); | 522 DestroyAllPortsWithPeer(event.proxy_node_name, event.proxy_port_name); |
| 523 return OK; | 523 return OK; |
| 524 } | 524 } |
| 525 | 525 |
| 526 // The port may have already been closed locally, in which case the | 526 // The port may have already been closed locally, in which case the |
| 527 // ObserveClosure message will contain the last_sequence_num field. | 527 // ObserveClosure message will contain the last_sequence_num field. |
| 528 // We can then silently ignore this message. | 528 // We can then silently ignore this message. |
| 529 scoped_refptr<Port> port = GetPort(port_name); | 529 scoped_refptr<Port> port = GetPort(port_name); |
| 530 if (!port) { | 530 if (!port) { |
| 531 DVLOG(1) << "ObserveProxy: " << port_name << "@" << name_ << " not found"; | 531 DVLOG(1) << "ObserveProxy: " << port_name << "@" << name_ << " not found"; |
| (...skipping 754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1286 | 1286 |
| 1287 { | 1287 { |
| 1288 base::AutoLock ports_lock(ports_lock_); | 1288 base::AutoLock ports_lock(ports_lock_); |
| 1289 | 1289 |
| 1290 for (auto iter = ports_.begin(); iter != ports_.end(); ++iter) { | 1290 for (auto iter = ports_.begin(); iter != ports_.end(); ++iter) { |
| 1291 Port* port = iter->second.get(); | 1291 Port* port = iter->second.get(); |
| 1292 { | 1292 { |
| 1293 base::AutoLock port_lock(port->lock); | 1293 base::AutoLock port_lock(port->lock); |
| 1294 | 1294 |
| 1295 if (port->peer_node_name == node_name && | 1295 if (port->peer_node_name == node_name && |
| 1296 (port_name == kInvalidPortName || | 1296 (port_name == constants::kInvalidPortName || |
| 1297 port->peer_port_name == port_name)) { | 1297 port->peer_port_name == port_name)) { |
| 1298 if (!port->peer_closed) { | 1298 if (!port->peer_closed) { |
| 1299 // Treat this as immediate peer closure. It's an exceptional | 1299 // Treat this as immediate peer closure. It's an exceptional |
| 1300 // condition akin to a broken pipe, so we don't care about losing | 1300 // condition akin to a broken pipe, so we don't care about losing |
| 1301 // messages. | 1301 // messages. |
| 1302 | 1302 |
| 1303 port->peer_closed = true; | 1303 port->peer_closed = true; |
| 1304 port->last_sequence_num_to_receive = | 1304 port->last_sequence_num_to_receive = |
| 1305 port->message_queue.next_sequence_num() - 1; | 1305 port->message_queue.next_sequence_num() - 1; |
| 1306 | 1306 |
| 1307 if (port->state == Port::kReceiving) | 1307 if (port->state == Port::kReceiving) |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1331 | 1331 |
| 1332 // Wake up any receiving ports who have just observed simulated peer closure. | 1332 // Wake up any receiving ports who have just observed simulated peer closure. |
| 1333 for (const auto& port : ports_to_notify) | 1333 for (const auto& port : ports_to_notify) |
| 1334 delegate_->PortStatusChanged(port); | 1334 delegate_->PortStatusChanged(port); |
| 1335 | 1335 |
| 1336 for (const auto& proxy_name : dead_proxies_to_broadcast) { | 1336 for (const auto& proxy_name : dead_proxies_to_broadcast) { |
| 1337 // Broadcast an event signifying that this proxy is no longer functioning. | 1337 // Broadcast an event signifying that this proxy is no longer functioning. |
| 1338 ObserveProxyEventData event; | 1338 ObserveProxyEventData event; |
| 1339 event.proxy_node_name = name_; | 1339 event.proxy_node_name = name_; |
| 1340 event.proxy_port_name = proxy_name; | 1340 event.proxy_port_name = proxy_name; |
| 1341 event.proxy_to_node_name = kInvalidNodeName; | 1341 event.proxy_to_node_name = constants::kInvalidNodeName; |
| 1342 event.proxy_to_port_name = kInvalidPortName; | 1342 event.proxy_to_port_name = constants::kInvalidPortName; |
| 1343 delegate_->BroadcastMessage(NewInternalMessage( | 1343 delegate_->BroadcastMessage(NewInternalMessage( |
| 1344 kInvalidPortName, EventType::kObserveProxy, event)); | 1344 constants::kInvalidPortName, EventType::kObserveProxy, event)); |
| 1345 | 1345 |
| 1346 // Also process death locally since the port that points this closed one | 1346 // Also process death locally since the port that points this closed one |
| 1347 // could be on the current node. | 1347 // could be on the current node. |
| 1348 // Note: Although this is recursive, only a single port is involved which | 1348 // Note: Although this is recursive, only a single port is involved which |
| 1349 // limits the expected branching to 1. | 1349 // limits the expected branching to 1. |
| 1350 DestroyAllPortsWithPeer(name_, proxy_name); | 1350 DestroyAllPortsWithPeer(name_, proxy_name); |
| 1351 } | 1351 } |
| 1352 | 1352 |
| 1353 // Close any ports referenced by the closed proxies. | 1353 // Close any ports referenced by the closed proxies. |
| 1354 for (const auto& name : referenced_port_names) { | 1354 for (const auto& name : referenced_port_names) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1372 | 1372 |
| 1373 if (num_data_bytes) | 1373 if (num_data_bytes) |
| 1374 memcpy(header + 1, data, num_data_bytes); | 1374 memcpy(header + 1, data, num_data_bytes); |
| 1375 | 1375 |
| 1376 return message; | 1376 return message; |
| 1377 } | 1377 } |
| 1378 | 1378 |
| 1379 } // namespace ports | 1379 } // namespace ports |
| 1380 } // namespace edk | 1380 } // namespace edk |
| 1381 } // namespace mojo | 1381 } // namespace mojo |
| OLD | NEW |