blob: d6be76e81f3910c66ecb5434abf703c4e85092c0 [file] [log] [blame]
// 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