Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(86)

Side by Side Diff: mojo/edk/system/node_controller.cc

Issue 2735113003: Changing SpawnChild to return a struct.
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « mojo/edk/system/node_controller.h ('k') | mojo/edk/test/multiprocess_test_helper.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « mojo/edk/system/node_controller.h ('k') | mojo/edk/test/multiprocess_test_helper.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698