| // Copyright 2017 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/embedder/pending_process_connection.h" |
| |
| #include "mojo/edk/embedder/embedder.h" |
| #include "mojo/edk/embedder/embedder_internal.h" |
| #include "mojo/edk/system/core.h" |
| |
| namespace mojo { |
| namespace edk { |
| |
| PendingProcessConnection::PendingProcessConnection() |
| : process_token_(GenerateRandomToken()) { |
| DCHECK(internal::g_core); |
| } |
| |
| PendingProcessConnection::~PendingProcessConnection() { |
| if (has_message_pipes_ && !connected_) { |
| DCHECK(internal::g_core); |
| internal::g_core->ChildLaunchFailed(process_token_); |
| } |
| } |
| |
| ScopedMessagePipeHandle PendingProcessConnection::CreateMessagePipe( |
| std::string* token) { |
| has_message_pipes_ = true; |
| DCHECK(internal::g_core); |
| *token = GenerateRandomToken(); |
| return internal::g_core->CreateParentMessagePipe(*token, process_token_); |
| } |
| |
| void PendingProcessConnection::Connect( |
| base::ProcessHandle process, |
| ConnectionParams connection_params, |
| const ProcessErrorCallback& error_callback) { |
| // It's now safe to avoid cleanup in the destructor, as the lifetime of any |
| // associated resources is effectively bound to the |channel| passed to |
| // AddChild() below. |
| DCHECK(!connected_); |
| connected_ = true; |
| |
| DCHECK(internal::g_core); |
| internal::g_core->AddChild(process, std::move(connection_params), |
| process_token_, error_callback); |
| } |
| |
| } // namespace edk |
| } // namespace mojo |