Index: mojo/edk/system/remote_message_pipe_bootstrap.cc |
diff --git a/mojo/edk/system/remote_message_pipe_bootstrap.cc b/mojo/edk/system/remote_message_pipe_bootstrap.cc |
deleted file mode 100644 |
index d376cca58387ef148fda28b211faa4b371e4f4fb..0000000000000000000000000000000000000000 |
--- a/mojo/edk/system/remote_message_pipe_bootstrap.cc |
+++ /dev/null |
@@ -1,149 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "mojo/edk/system/remote_message_pipe_bootstrap.h" |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/macros.h" |
-#include "base/threading/thread_task_runner_handle.h" |
-#include "mojo/edk/embedder/embedder.h" |
-#include "mojo/edk/system/node_controller.h" |
-#include "mojo/edk/system/ports/name.h" |
- |
-namespace mojo { |
-namespace edk { |
- |
-namespace { |
- |
-struct BootstrapData { |
- // The node name of the sender. |
- ports::NodeName node_name; |
- |
- // The port name of the sender's local bootstrap port. |
- ports::PortName port_name; |
-}; |
- |
-} // namespace |
- |
-// static |
-void RemoteMessagePipeBootstrap::Create( |
- NodeController* node_controller, |
- ScopedPlatformHandle platform_handle, |
- const ports::PortRef& port) { |
- CHECK(node_controller); |
- CHECK(node_controller->io_task_runner()); |
- if (node_controller->io_task_runner()->RunsTasksOnCurrentThread()) { |
- // Owns itself. |
- new RemoteMessagePipeBootstrap( |
- node_controller, std::move(platform_handle), port); |
- } else { |
- node_controller->io_task_runner()->PostTask( |
- FROM_HERE, |
- base::Bind(&RemoteMessagePipeBootstrap::Create, |
- base::Unretained(node_controller), |
- base::Passed(&platform_handle), port)); |
- } |
-} |
- |
-RemoteMessagePipeBootstrap::~RemoteMessagePipeBootstrap() { |
- DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
- base::MessageLoop::current()->RemoveDestructionObserver(this); |
- if (channel_) |
- channel_->ShutDown(); |
-} |
- |
-RemoteMessagePipeBootstrap::RemoteMessagePipeBootstrap( |
- NodeController* node_controller, |
- ScopedPlatformHandle platform_handle, |
- const ports::PortRef& port) |
- : node_controller_(node_controller), |
- local_port_(port), |
- io_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
- channel_(Channel::Create(this, std::move(platform_handle), |
- io_task_runner_)) { |
- base::MessageLoop::current()->AddDestructionObserver(this); |
- channel_->Start(); |
- |
- Channel::MessagePtr message(new Channel::Message(sizeof(BootstrapData), 0)); |
- BootstrapData* data = static_cast<BootstrapData*>(message->mutable_payload()); |
- data->node_name = node_controller_->name(); |
- data->port_name = local_port_.name(); |
- channel_->Write(std::move(message)); |
-} |
- |
-void RemoteMessagePipeBootstrap::ShutDown() { |
- DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
- |
- if (shutting_down_) |
- return; |
- |
- shutting_down_ = true; |
- |
- // Shut down asynchronously so ShutDown() can be called from within |
- // OnChannelMessage and OnChannelError. |
- io_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&RemoteMessagePipeBootstrap::ShutDownNow, |
- base::Unretained(this))); |
-} |
- |
-void RemoteMessagePipeBootstrap::WillDestroyCurrentMessageLoop() { |
- DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
- ShutDownNow(); |
-} |
- |
-void RemoteMessagePipeBootstrap::OnChannelMessage( |
- const void* payload, |
- size_t payload_size, |
- ScopedPlatformHandleVectorPtr handles) { |
- DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
- DCHECK(!handles || !handles->size()); |
- |
- const BootstrapData* data = static_cast<const BootstrapData*>(payload); |
- if (peer_info_received_) { |
- // This should only be a confirmation from the other end, which tells us |
- // it's now safe to shut down. |
- if (payload_size != 0) |
- DLOG(ERROR) << "Unexpected message received in message pipe bootstrap."; |
- ShutDown(); |
- return; |
- } |
- |
- if (payload_size != sizeof(BootstrapData)) { |
- DLOG(ERROR) << "Invalid bootstrap payload."; |
- ShutDown(); |
- return; |
- } |
- |
- peer_info_received_ = true; |
- |
- // We need to choose one side to initiate the port merge. It doesn't matter |
- // who does it as long as they don't both try. Simple solution: pick the one |
- // with the "smaller" port name. |
- if (local_port_.name() < data->port_name) { |
- node_controller_->node()->MergePorts(local_port_, data->node_name, |
- data->port_name); |
- } |
- |
- // Send another ping to the other end to trigger shutdown. This may race with |
- // the other end sending its own ping, but it doesn't matter. Whoever wins |
- // will cause the other end to tear down, and the ensuing channel error will |
- // in turn clean up the remaining end. |
- |
- Channel::MessagePtr message(new Channel::Message(0, 0)); |
- channel_->Write(std::move(message)); |
-} |
- |
-void RemoteMessagePipeBootstrap::OnChannelError() { |
- DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
- ShutDown(); |
-} |
- |
-void RemoteMessagePipeBootstrap::ShutDownNow() { |
- delete this; |
-} |
- |
-} // namespace edk |
-} // namespace mojo |