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 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 void NodeController::SetIOTaskRunner( | 158 void NodeController::SetIOTaskRunner( |
159 scoped_refptr<base::TaskRunner> task_runner) { | 159 scoped_refptr<base::TaskRunner> task_runner) { |
160 io_task_runner_ = task_runner; | 160 io_task_runner_ = task_runner; |
161 ThreadDestructionObserver::Create( | 161 ThreadDestructionObserver::Create( |
162 io_task_runner_, | 162 io_task_runner_, |
163 base::Bind(&NodeController::DropAllPeers, base::Unretained(this))); | 163 base::Bind(&NodeController::DropAllPeers, base::Unretained(this))); |
164 } | 164 } |
165 | 165 |
166 void NodeController::ConnectToChild( | 166 void NodeController::ConnectToChild( |
167 base::ProcessHandle process_handle, | 167 base::ProcessHandle process_handle, |
168 ScopedPlatformHandle platform_handle, | 168 ConnectionParam connection_param, |
169 const std::string& child_token, | 169 const std::string& child_token, |
170 const ProcessErrorCallback& process_error_callback) { | 170 const ProcessErrorCallback& process_error_callback) { |
171 // Generate the temporary remote node name here so that it can be associated | 171 // Generate the temporary remote node name here so that it can be associated |
172 // with the embedder's child_token. If an error occurs in the child process | 172 // with the embedder's child_token. If an error occurs in the child process |
173 // after it is launched, but before any reserved ports are connected, this can | 173 // after it is launched, but before any reserved ports are connected, this can |
174 // be used to clean up any dangling ports. | 174 // be used to clean up any dangling ports. |
175 ports::NodeName node_name; | 175 ports::NodeName node_name; |
176 GenerateRandomName(&node_name); | 176 GenerateRandomName(&node_name); |
177 | 177 |
178 { | 178 { |
(...skipping 10 matching lines...) Expand all Loading... |
189 HANDLE dup_handle = INVALID_HANDLE_VALUE; | 189 HANDLE dup_handle = INVALID_HANDLE_VALUE; |
190 BOOL ok = ::DuplicateHandle( | 190 BOOL ok = ::DuplicateHandle( |
191 base::GetCurrentProcessHandle(), process_handle, | 191 base::GetCurrentProcessHandle(), process_handle, |
192 base::GetCurrentProcessHandle(), &dup_handle, | 192 base::GetCurrentProcessHandle(), &dup_handle, |
193 0, FALSE, DUPLICATE_SAME_ACCESS); | 193 0, FALSE, DUPLICATE_SAME_ACCESS); |
194 DPCHECK(ok); | 194 DPCHECK(ok); |
195 process_handle = dup_handle; | 195 process_handle = dup_handle; |
196 #endif | 196 #endif |
197 | 197 |
198 io_task_runner_->PostTask( | 198 io_task_runner_->PostTask( |
199 FROM_HERE, | 199 FROM_HERE, base::Bind(&NodeController::ConnectToChildOnIOThread, |
200 base::Bind(&NodeController::ConnectToChildOnIOThread, | 200 base::Unretained(this), process_handle, |
201 base::Unretained(this), | 201 base::Passed(&connection_param), node_name, |
202 process_handle, | 202 process_error_callback)); |
203 base::Passed(&platform_handle), | |
204 node_name, | |
205 process_error_callback)); | |
206 } | 203 } |
207 | 204 |
208 void NodeController::CloseChildPorts(const std::string& child_token) { | 205 void NodeController::CloseChildPorts(const std::string& child_token) { |
209 std::vector<ports::PortRef> ports_to_close; | 206 std::vector<ports::PortRef> ports_to_close; |
210 { | 207 { |
211 std::vector<std::string> port_tokens; | 208 std::vector<std::string> port_tokens; |
212 base::AutoLock lock(reserved_ports_lock_); | 209 base::AutoLock lock(reserved_ports_lock_); |
213 for (const auto& port : reserved_ports_) { | 210 for (const auto& port : reserved_ports_) { |
214 if (port.second.child_token == child_token) { | 211 if (port.second.child_token == child_token) { |
215 DVLOG(1) << "Closing reserved port " << port.second.port.name(); | 212 DVLOG(1) << "Closing reserved port " << port.second.port.name(); |
(...skipping 12 matching lines...) Expand all Loading... |
228 // Ensure local port closure messages are processed. | 225 // Ensure local port closure messages are processed. |
229 AcceptIncomingMessages(); | 226 AcceptIncomingMessages(); |
230 } | 227 } |
231 | 228 |
232 void NodeController::ClosePeerConnection(const std::string& peer_token) { | 229 void NodeController::ClosePeerConnection(const std::string& peer_token) { |
233 io_task_runner_->PostTask( | 230 io_task_runner_->PostTask( |
234 FROM_HERE, base::Bind(&NodeController::ClosePeerConnectionOnIOThread, | 231 FROM_HERE, base::Bind(&NodeController::ClosePeerConnectionOnIOThread, |
235 base::Unretained(this), peer_token)); | 232 base::Unretained(this), peer_token)); |
236 } | 233 } |
237 | 234 |
238 void NodeController::ConnectToParent(ScopedPlatformHandle platform_handle) { | 235 void NodeController::ConnectToParent(ConnectionParam connection_param) { |
239 #if !defined(OS_MACOSX) && !defined(OS_NACL_SFI) | 236 #if !defined(OS_MACOSX) && !defined(OS_NACL_SFI) |
240 // Use the bootstrap channel for the broker and receive the node's channel | 237 // Use the bootstrap channel for the broker and receive the node's channel |
241 // synchronously as the first message from the broker. | 238 // synchronously as the first message from the broker. |
242 base::ElapsedTimer timer; | 239 base::ElapsedTimer timer; |
243 broker_.reset(new Broker(std::move(platform_handle))); | 240 broker_.reset(new Broker(connection_param.TakeChannelHandle())); |
244 platform_handle = broker_->GetParentPlatformHandle(); | 241 ScopedPlatformHandle platform_handle = broker_->GetParentPlatformHandle(); |
245 UMA_HISTOGRAM_TIMES("Mojo.System.GetParentPlatformHandleSyncTime", | 242 UMA_HISTOGRAM_TIMES("Mojo.System.GetParentPlatformHandleSyncTime", |
246 timer.Elapsed()); | 243 timer.Elapsed()); |
247 | 244 |
248 if (!platform_handle.is_valid()) { | 245 if (!platform_handle.is_valid()) { |
249 // Most likely the browser side of the channel has already been closed and | 246 // Most likely the browser side of the channel has already been closed and |
250 // the broker was unable to negotiate a NodeChannel pipe. In this case we | 247 // the broker was unable to negotiate a NodeChannel pipe. In this case we |
251 // can cancel parent connection. | 248 // can cancel parent connection. |
252 DVLOG(1) << "Cannot connect to invalid parent channel."; | 249 DVLOG(1) << "Cannot connect to invalid parent channel."; |
253 CancelPendingPortMerges(); | 250 CancelPendingPortMerges(); |
254 return; | 251 return; |
255 } | 252 } |
| 253 connection_param = |
| 254 ConnectionParam(std::move(platform_handle) |
| 255 #if defined(OS_ANDROID) |
| 256 , |
| 257 std::move(connection_param.TakeParcelableChannelClient()), |
| 258 std::move(connection_param.TakeParcelableChannelServer()) |
| 259 #endif |
| 260 ); |
256 #endif | 261 #endif |
257 | 262 |
258 io_task_runner_->PostTask( | 263 io_task_runner_->PostTask( |
259 FROM_HERE, | 264 FROM_HERE, |
260 base::Bind(&NodeController::ConnectToParentOnIOThread, | 265 base::Bind(&NodeController::ConnectToParentOnIOThread, |
261 base::Unretained(this), | 266 base::Unretained(this), base::Passed(&connection_param))); |
262 base::Passed(&platform_handle))); | |
263 } | 267 } |
264 | 268 |
265 void NodeController::ConnectToPeer(ScopedPlatformHandle handle, | 269 void NodeController::ConnectToPeer(ConnectionParam connection_param, |
266 const ports::PortRef& port, | 270 const ports::PortRef& port, |
267 const std::string& peer_token) { | 271 const std::string& peer_token) { |
268 ports::NodeName node_name; | 272 ports::NodeName node_name; |
269 GenerateRandomName(&node_name); | 273 GenerateRandomName(&node_name); |
270 io_task_runner_->PostTask( | 274 io_task_runner_->PostTask( |
271 FROM_HERE, base::Bind(&NodeController::ConnectToPeerOnIOThread, | 275 FROM_HERE, |
272 base::Unretained(this), base::Passed(&handle), | 276 base::Bind(&NodeController::ConnectToPeerOnIOThread, |
273 node_name, port, peer_token)); | 277 base::Unretained(this), base::Passed(&connection_param), |
| 278 node_name, port, peer_token)); |
274 } | 279 } |
275 | 280 |
276 void NodeController::SetPortObserver( | 281 void NodeController::SetPortObserver( |
277 const ports::PortRef& port, | 282 const ports::PortRef& port, |
278 const scoped_refptr<PortObserver>& observer) { | 283 const scoped_refptr<PortObserver>& observer) { |
279 node_->SetUserData(port, observer); | 284 node_->SetUserData(port, observer); |
280 } | 285 } |
281 | 286 |
282 void NodeController::ClosePort(const ports::PortRef& port) { | 287 void NodeController::ClosePort(const ports::PortRef& port) { |
283 SetPortObserver(port, nullptr); | 288 SetPortObserver(port, nullptr); |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 | 393 |
389 void NodeController::NotifyBadMessageFrom(const ports::NodeName& source_node, | 394 void NodeController::NotifyBadMessageFrom(const ports::NodeName& source_node, |
390 const std::string& error) { | 395 const std::string& error) { |
391 scoped_refptr<NodeChannel> peer = GetPeerChannel(source_node); | 396 scoped_refptr<NodeChannel> peer = GetPeerChannel(source_node); |
392 if (peer) | 397 if (peer) |
393 peer->NotifyBadMessage(error); | 398 peer->NotifyBadMessage(error); |
394 } | 399 } |
395 | 400 |
396 void NodeController::ConnectToChildOnIOThread( | 401 void NodeController::ConnectToChildOnIOThread( |
397 base::ProcessHandle process_handle, | 402 base::ProcessHandle process_handle, |
398 ScopedPlatformHandle platform_handle, | 403 ConnectionParam connection_param, |
399 ports::NodeName token, | 404 ports::NodeName token, |
400 const ProcessErrorCallback& process_error_callback) { | 405 const ProcessErrorCallback& process_error_callback) { |
401 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 406 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
402 | 407 |
403 #if !defined(OS_MACOSX) && !defined(OS_NACL) | 408 #if !defined(OS_MACOSX) && !defined(OS_NACL) |
404 PlatformChannelPair node_channel; | 409 PlatformChannelPair node_channel; |
405 ScopedPlatformHandle server_handle = node_channel.PassServerHandle(); | 410 ScopedPlatformHandle server_handle = node_channel.PassServerHandle(); |
406 // BrokerHost owns itself. | 411 // BrokerHost owns itself. |
407 BrokerHost* broker_host = | 412 BrokerHost* broker_host = |
408 new BrokerHost(process_handle, std::move(platform_handle)); | 413 new BrokerHost(process_handle, connection_param.TakeChannelHandle()); |
409 bool channel_ok = broker_host->SendChannel(node_channel.PassClientHandle()); | 414 bool channel_ok = broker_host->SendChannel(node_channel.PassClientHandle()); |
410 | 415 |
411 #if defined(OS_WIN) | 416 #if defined(OS_WIN) |
412 if (!channel_ok) { | 417 if (!channel_ok) { |
413 // On Windows the above operation may fail if the channel is crossing a | 418 // On Windows the above operation may fail if the channel is crossing a |
414 // session boundary. In that case we fall back to a named pipe. | 419 // session boundary. In that case we fall back to a named pipe. |
415 NamedPlatformChannelPair named_channel; | 420 NamedPlatformChannelPair named_channel; |
416 server_handle = named_channel.PassServerHandle(); | 421 server_handle = named_channel.PassServerHandle(); |
417 broker_host->SendNamedChannel(named_channel.handle().name); | 422 broker_host->SendNamedChannel(named_channel.handle().name); |
418 } | 423 } |
419 #else | 424 #else |
420 CHECK(channel_ok); | 425 CHECK(channel_ok); |
421 #endif // defined(OS_WIN) | 426 #endif // defined(OS_WIN) |
422 | 427 |
423 scoped_refptr<NodeChannel> channel = NodeChannel::Create( | 428 #if defined(OS_ANDROID) |
424 this, std::move(server_handle), io_task_runner_, process_error_callback); | 429 DCHECK(connection_param.is_valid_parcelable_channel_client()); |
| 430 DCHECK(connection_param.is_valid_parcelable_channel_server()); |
| 431 |
| 432 ConnectionParam new_connection_param( |
| 433 std::move(server_handle), connection_param.TakeParcelableChannelClient(), |
| 434 connection_param.TakeParcelableChannelServer()); |
| 435 #else |
| 436 ConnectionParam new_connection_param(std::move(server_handle)); |
| 437 #endif |
| 438 |
| 439 scoped_refptr<NodeChannel> channel = |
| 440 NodeChannel::Create(this, std::move(new_connection_param), |
| 441 io_task_runner_, process_error_callback); |
425 | 442 |
426 #else // !defined(OS_MACOSX) && !defined(OS_NACL) | 443 #else // !defined(OS_MACOSX) && !defined(OS_NACL) |
427 scoped_refptr<NodeChannel> channel = | 444 scoped_refptr<NodeChannel> channel = |
428 NodeChannel::Create(this, std::move(platform_handle), io_task_runner_, | 445 NodeChannel::Create(this, std::move(connection_param), io_task_runner_, |
429 process_error_callback); | 446 process_error_callback); |
430 #endif // !defined(OS_MACOSX) && !defined(OS_NACL) | 447 #endif // !defined(OS_MACOSX) && !defined(OS_NACL) |
431 | 448 |
432 // We set up the child channel with a temporary name so it can be identified | 449 // We set up the child channel with a temporary name so it can be identified |
433 // as a pending child if it writes any messages to the channel. We may start | 450 // as a pending child if it writes any messages to the channel. We may start |
434 // receiving messages from it (though we shouldn't) as soon as Start() is | 451 // receiving messages from it (though we shouldn't) as soon as Start() is |
435 // called below. | 452 // called below. |
436 | 453 |
437 pending_children_.insert(std::make_pair(token, channel)); | 454 pending_children_.insert(std::make_pair(token, channel)); |
438 RecordPendingChildCount(pending_children_.size()); | 455 RecordPendingChildCount(pending_children_.size()); |
439 | 456 |
440 channel->SetRemoteNodeName(token); | 457 channel->SetRemoteNodeName(token); |
441 channel->SetRemoteProcessHandle(process_handle); | 458 channel->SetRemoteProcessHandle(process_handle); |
442 channel->Start(); | 459 channel->Start(); |
443 | 460 |
444 channel->AcceptChild(name_, token); | 461 channel->AcceptChild(name_, token); |
445 } | 462 } |
446 | 463 |
447 void NodeController::ConnectToParentOnIOThread( | 464 void NodeController::ConnectToParentOnIOThread( |
448 ScopedPlatformHandle platform_handle) { | 465 ConnectionParam connection_param) { |
449 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 466 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
450 | 467 |
451 { | 468 { |
452 base::AutoLock lock(parent_lock_); | 469 base::AutoLock lock(parent_lock_); |
453 DCHECK(parent_name_ == ports::kInvalidNodeName); | 470 DCHECK(parent_name_ == ports::kInvalidNodeName); |
454 | 471 |
455 // At this point we don't know the parent's name, so we can't yet insert it | 472 // 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 | 473 // into our |peers_| map. That will happen as soon as we receive an |
457 // AcceptChild message from them. | 474 // AcceptChild message from them. |
458 bootstrap_parent_channel_ = | 475 bootstrap_parent_channel_ = |
459 NodeChannel::Create(this, std::move(platform_handle), io_task_runner_, | 476 NodeChannel::Create(this, std::move(connection_param), io_task_runner_, |
460 ProcessErrorCallback()); | 477 ProcessErrorCallback()); |
461 // Prevent the parent pipe handle from being closed on shutdown. Pipe | 478 // 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. | 479 // 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 | 480 // Relying on message pipes to be closed is not enough because the parent |
464 // may see the message pipe closure before the child is dead, causing the | 481 // may see the message pipe closure before the child is dead, causing the |
465 // child process to be unexpectedly SIGKILL'd. | 482 // child process to be unexpectedly SIGKILL'd. |
466 bootstrap_parent_channel_->LeakHandleOnShutdown(); | 483 bootstrap_parent_channel_->LeakHandleOnShutdown(); |
467 } | 484 } |
468 bootstrap_parent_channel_->Start(); | 485 bootstrap_parent_channel_->Start(); |
469 } | 486 } |
470 | 487 |
471 void NodeController::ConnectToPeerOnIOThread(ScopedPlatformHandle handle, | 488 void NodeController::ConnectToPeerOnIOThread(ConnectionParam connection_param, |
472 ports::NodeName token, | 489 ports::NodeName token, |
473 ports::PortRef port, | 490 ports::PortRef port, |
474 const std::string& peer_token) { | 491 const std::string& peer_token) { |
475 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 492 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
476 | 493 |
477 scoped_refptr<NodeChannel> channel = | 494 scoped_refptr<NodeChannel> channel = NodeChannel::Create( |
478 NodeChannel::Create(this, std::move(handle), io_task_runner_, {}); | 495 this, std::move(connection_param), io_task_runner_, {}); |
479 peer_connections_.insert( | 496 peer_connections_.insert( |
480 {token, PeerConnection{channel, port, peer_token}}); | 497 {token, PeerConnection{channel, port, peer_token}}); |
481 peers_by_token_.insert({peer_token, token}); | 498 peers_by_token_.insert({peer_token, token}); |
482 | 499 |
483 channel->SetRemoteNodeName(token); | 500 channel->SetRemoteNodeName(token); |
484 channel->Start(); | 501 channel->Start(); |
485 | 502 |
486 channel->AcceptPeer(name_, token, port.name()); | 503 channel->AcceptPeer(name_, token, port.name()); |
487 } | 504 } |
488 | 505 |
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
988 return; | 1005 return; |
989 } | 1006 } |
990 | 1007 |
991 if (GetPeerChannel(client_name)) { | 1008 if (GetPeerChannel(client_name)) { |
992 DLOG(ERROR) << "Ignoring AddBrokerClient for known client."; | 1009 DLOG(ERROR) << "Ignoring AddBrokerClient for known client."; |
993 DropPeer(from_node, nullptr); | 1010 DropPeer(from_node, nullptr); |
994 return; | 1011 return; |
995 } | 1012 } |
996 | 1013 |
997 PlatformChannelPair broker_channel; | 1014 PlatformChannelPair broker_channel; |
998 scoped_refptr<NodeChannel> client = NodeChannel::Create( | 1015 ConnectionParam connection_param(broker_channel.PassServerHandle()); |
999 this, broker_channel.PassServerHandle(), io_task_runner_, | 1016 scoped_refptr<NodeChannel> client = |
1000 ProcessErrorCallback()); | 1017 NodeChannel::Create(this, std::move(connection_param), io_task_runner_, |
| 1018 ProcessErrorCallback()); |
1001 | 1019 |
1002 #if defined(OS_WIN) | 1020 #if defined(OS_WIN) |
1003 // The broker must have a working handle to the client process in order to | 1021 // The broker must have a working handle to the client process in order to |
1004 // properly copy other handles to and from the client. | 1022 // properly copy other handles to and from the client. |
1005 if (!scoped_process_handle.is_valid()) { | 1023 if (!scoped_process_handle.is_valid()) { |
1006 DLOG(ERROR) << "Broker rejecting client with invalid process handle."; | 1024 DLOG(ERROR) << "Broker rejecting client with invalid process handle."; |
1007 return; | 1025 return; |
1008 } | 1026 } |
1009 client->SetRemoteProcessHandle(scoped_process_handle.release().handle); | 1027 client->SetRemoteProcessHandle(scoped_process_handle.release().handle); |
1010 #else | 1028 #else |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1066 DCHECK(broker_name != ports::kInvalidNodeName); | 1084 DCHECK(broker_name != ports::kInvalidNodeName); |
1067 | 1085 |
1068 // It's now possible to add both the broker and the parent as peers. | 1086 // It's now possible to add both the broker and the parent as peers. |
1069 // Note that the broker and parent may be the same node. | 1087 // Note that the broker and parent may be the same node. |
1070 scoped_refptr<NodeChannel> broker; | 1088 scoped_refptr<NodeChannel> broker; |
1071 if (broker_name == parent_name) { | 1089 if (broker_name == parent_name) { |
1072 DCHECK(!broker_channel.is_valid()); | 1090 DCHECK(!broker_channel.is_valid()); |
1073 broker = parent; | 1091 broker = parent; |
1074 } else { | 1092 } else { |
1075 DCHECK(broker_channel.is_valid()); | 1093 DCHECK(broker_channel.is_valid()); |
1076 broker = NodeChannel::Create(this, std::move(broker_channel), | 1094 ConnectionParam connection_param(std::move(broker_channel)); |
| 1095 broker = NodeChannel::Create(this, std::move(connection_param), |
1077 io_task_runner_, ProcessErrorCallback()); | 1096 io_task_runner_, ProcessErrorCallback()); |
1078 AddPeer(broker_name, broker, true /* start_channel */); | 1097 AddPeer(broker_name, broker, true /* start_channel */); |
1079 } | 1098 } |
1080 | 1099 |
1081 AddPeer(parent_name, parent, false /* start_channel */); | 1100 AddPeer(parent_name, parent, false /* start_channel */); |
1082 | 1101 |
1083 { | 1102 { |
1084 // Complete any port merge requests we have waiting for the parent. | 1103 // Complete any port merge requests we have waiting for the parent. |
1085 base::AutoLock lock(pending_port_merges_lock_); | 1104 base::AutoLock lock(pending_port_merges_lock_); |
1086 for (const auto& request : pending_port_merges_) | 1105 for (const auto& request : pending_port_merges_) |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1194 | 1213 |
1195 if (!channel_handle.is_valid()) { | 1214 if (!channel_handle.is_valid()) { |
1196 node_->LostConnectionToNode(name); | 1215 node_->LostConnectionToNode(name); |
1197 | 1216 |
1198 DVLOG(1) << "Could not be introduced to peer " << name; | 1217 DVLOG(1) << "Could not be introduced to peer " << name; |
1199 base::AutoLock lock(peers_lock_); | 1218 base::AutoLock lock(peers_lock_); |
1200 pending_peer_messages_.erase(name); | 1219 pending_peer_messages_.erase(name); |
1201 return; | 1220 return; |
1202 } | 1221 } |
1203 | 1222 |
| 1223 ConnectionParam connection_param(std::move(channel_handle)); |
1204 scoped_refptr<NodeChannel> channel = | 1224 scoped_refptr<NodeChannel> channel = |
1205 NodeChannel::Create(this, std::move(channel_handle), io_task_runner_, | 1225 NodeChannel::Create(this, std::move(connection_param), io_task_runner_, |
1206 ProcessErrorCallback()); | 1226 ProcessErrorCallback()); |
1207 | 1227 |
1208 DVLOG(1) << "Adding new peer " << name << " via parent introduction."; | 1228 DVLOG(1) << "Adding new peer " << name << " via parent introduction."; |
1209 AddPeer(name, channel, true /* start_channel */); | 1229 AddPeer(name, channel, true /* start_channel */); |
1210 } | 1230 } |
1211 | 1231 |
1212 void NodeController::OnBroadcast(const ports::NodeName& from_node, | 1232 void NodeController::OnBroadcast(const ports::NodeName& from_node, |
1213 Channel::MessagePtr message) { | 1233 Channel::MessagePtr message) { |
1214 DCHECK(!message->has_handles()); | 1234 DCHECK(!message->has_handles()); |
1215 | 1235 |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1448 NodeController::PeerConnection::~PeerConnection() = default; | 1468 NodeController::PeerConnection::~PeerConnection() = default; |
1449 | 1469 |
1450 NodeController::PeerConnection& NodeController::PeerConnection:: | 1470 NodeController::PeerConnection& NodeController::PeerConnection:: |
1451 operator=(const PeerConnection& other) = default; | 1471 operator=(const PeerConnection& other) = default; |
1452 | 1472 |
1453 NodeController::PeerConnection& NodeController::PeerConnection:: | 1473 NodeController::PeerConnection& NodeController::PeerConnection:: |
1454 operator=(PeerConnection&& other) = default; | 1474 operator=(PeerConnection&& other) = default; |
1455 | 1475 |
1456 } // namespace edk | 1476 } // namespace edk |
1457 } // namespace mojo | 1477 } // namespace mojo |
OLD | NEW |