| Index: mojo/shell/runner/host/child_process_host.cc
|
| diff --git a/mojo/shell/runner/host/child_process_host.cc b/mojo/shell/runner/host/child_process_host.cc
|
| index 9a5b439fa2d8ecbbe6d4eb866f361b093d185bcc..2b3cfc943c7d5893ecb6ab3e6835d4355c37d0fb 100644
|
| --- a/mojo/shell/runner/host/child_process_host.cc
|
| +++ b/mojo/shell/runner/host/child_process_host.cc
|
| @@ -35,55 +35,24 @@
|
| namespace mojo {
|
| namespace shell {
|
|
|
| -ChildProcessHost::PipeHolder::PipeHolder() {}
|
| -
|
| -void ChildProcessHost::PipeHolder::Reject() {
|
| - base::AutoLock lock(lock_);
|
| - reject_pipe_ = true;
|
| - pipe_.reset();
|
| -}
|
| -
|
| -void ChildProcessHost::PipeHolder::SetPipe(ScopedMessagePipeHandle pipe) {
|
| - base::AutoLock lock(lock_);
|
| - DCHECK(!pipe_.is_valid());
|
| - if (!reject_pipe_)
|
| - pipe_ = std::move(pipe);
|
| -}
|
| -
|
| -ScopedMessagePipeHandle ChildProcessHost::PipeHolder::PassPipe() {
|
| - base::AutoLock lock(lock_);
|
| - DCHECK(pipe_.is_valid());
|
| - return std::move(pipe_);
|
| -}
|
| -
|
| -ChildProcessHost::PipeHolder::~PipeHolder() {}
|
| -
|
| ChildProcessHost::ChildProcessHost(base::TaskRunner* launch_process_runner,
|
| bool start_sandboxed,
|
| const base::FilePath& app_path)
|
| : launch_process_runner_(launch_process_runner),
|
| start_sandboxed_(start_sandboxed),
|
| app_path_(app_path),
|
| - channel_info_(nullptr),
|
| start_child_process_event_(false, false),
|
| weak_factory_(this) {
|
| - pipe_holder_ = new PipeHolder();
|
| - if (base::CommandLine::ForCurrentProcess()->HasSwitch("use-new-edk")) {
|
| - node_channel_.reset(new edk::PlatformChannelPair);
|
| - primordial_pipe_token_ = edk::GenerateRandomToken();
|
| - } else {
|
| - pipe_holder_->SetPipe(embedder::CreateChannel(
|
| - platform_channel_pair_.PassServerHandle(),
|
| - base::Bind(&ChildProcessHost::DidCreateChannel, base::Unretained(this)),
|
| - base::ThreadTaskRunnerHandle::Get()));
|
| - OnMessagePipeCreated();
|
| - }
|
| + node_channel_.reset(new edk::PlatformChannelPair);
|
| + primordial_pipe_token_ = edk::GenerateRandomToken();
|
| + controller_.Bind(
|
| + InterfacePtrInfo<mojom::ChildController>(
|
| + edk::CreateParentMessagePipe(primordial_pipe_token_), 0u));
|
| }
|
|
|
| ChildProcessHost::ChildProcessHost(ScopedHandle channel)
|
| : launch_process_runner_(nullptr),
|
| start_sandboxed_(false),
|
| - channel_info_(nullptr),
|
| start_child_process_event_(false, false),
|
| weak_factory_(this) {
|
| CHECK(channel.is_valid());
|
| @@ -99,40 +68,11 @@ ChildProcessHost::~ChildProcessHost() {
|
|
|
| void ChildProcessHost::Start(const ProcessReadyCallback& callback) {
|
| DCHECK(!child_process_.IsValid());
|
| - DCHECK(process_ready_callback_.is_null());
|
| -
|
| - process_ready_callback_ = callback;
|
| - if (base::CommandLine::ForCurrentProcess()->HasSwitch("use-new-edk")) {
|
| - // With the new EDK, bootstrap message pipes are created asynchronously.
|
| - // We recieve the bound pipe (if successful) on an arbitrary thread,
|
| - // stash it in the thread-safe |pipe_holder_|, and then try to call
|
| - // OnMessagePipeCreated() on the host's main thread.
|
| - //
|
| - // Because of the way the launcher process shuts down, it's possible for
|
| - // the main thread's MessageLoop to stop running (but not yet be destroyed!)
|
| - // while this boostrap is pending, resulting in OnMessagePipeCreated() never
|
| - // being called.
|
| - //
|
| - // A typical child process (i.e. one using ShellConnection to bind the other
|
| - // end of this pipe) may hang forever waiting for an Initialize() message
|
| - // unless the pipe is closed. This in turn means that Join() could hang
|
| - // waiting for the process to exit. Deadlock!
|
| - //
|
| - // |pipe_holder_| exists for this reason. If it's still holding onto the
|
| - // pipe when Join() is called, the pipe will be closed.
|
| - DCHECK(!primordial_pipe_token_.empty());
|
| - edk::CreateParentMessagePipe(
|
| - primordial_pipe_token_,
|
| - base::Bind(&OnParentMessagePipeCreated, pipe_holder_,
|
| - base::ThreadTaskRunnerHandle::Get(),
|
| - base::Bind(&ChildProcessHost::OnMessagePipeCreated,
|
| - weak_factory_.GetWeakPtr())));
|
| - }
|
| -
|
| launch_process_runner_->PostTaskAndReply(
|
| FROM_HERE,
|
| base::Bind(&ChildProcessHost::DoLaunch, base::Unretained(this)),
|
| - base::Bind(&ChildProcessHost::DidStart, weak_factory_.GetWeakPtr()));
|
| + base::Bind(&ChildProcessHost::DidStart,
|
| + weak_factory_.GetWeakPtr(), callback));
|
| }
|
|
|
| int ChildProcessHost::Join() {
|
| @@ -142,10 +82,6 @@ int ChildProcessHost::Join() {
|
| controller_ = mojom::ChildControllerPtr();
|
| DCHECK(child_process_.IsValid());
|
|
|
| - // Ensure the child pipe is closed even if it wasn't yet connected to the
|
| - // controller.
|
| - pipe_holder_->Reject();
|
| -
|
| int rv = -1;
|
| LOG_IF(ERROR, !child_process_.WaitForExit(&rv))
|
| << "Failed to wait for child process";
|
| @@ -172,11 +108,11 @@ void ChildProcessHost::ExitNow(int32_t exit_code) {
|
| controller_->ExitNow(exit_code);
|
| }
|
|
|
| -void ChildProcessHost::DidStart() {
|
| +void ChildProcessHost::DidStart(const ProcessReadyCallback& callback) {
|
| DVLOG(2) << "ChildProcessHost::DidStart()";
|
|
|
| if (child_process_.IsValid()) {
|
| - MaybeNotifyProcessReady();
|
| + callback.Run(child_process_.Pid());
|
| } else {
|
| LOG(ERROR) << "Failed to start child process";
|
| AppCompleted(MOJO_RESULT_UNKNOWN);
|
| @@ -278,34 +214,5 @@ void ChildProcessHost::AppCompleted(int32_t result) {
|
| }
|
| }
|
|
|
| -void ChildProcessHost::DidCreateChannel(embedder::ChannelInfo* channel_info) {
|
| - DVLOG(2) << "AppChildProcessHost::DidCreateChannel()";
|
| -
|
| - DCHECK(channel_info ||
|
| - base::CommandLine::ForCurrentProcess()->HasSwitch("use-new-edk"));
|
| - channel_info_ = channel_info;
|
| -}
|
| -
|
| -void ChildProcessHost::OnMessagePipeCreated() {
|
| - controller_.Bind(
|
| - InterfacePtrInfo<mojom::ChildController>(pipe_holder_->PassPipe(), 0u));
|
| - MaybeNotifyProcessReady();
|
| -}
|
| -
|
| -void ChildProcessHost::MaybeNotifyProcessReady() {
|
| - if (controller_.is_bound() && child_process_.IsValid())
|
| - process_ready_callback_.Run(child_process_.Pid());
|
| -}
|
| -
|
| -// static
|
| -void ChildProcessHost::OnParentMessagePipeCreated(
|
| - scoped_refptr<PipeHolder> holder,
|
| - scoped_refptr<base::TaskRunner> callback_task_runner,
|
| - const base::Closure& callback,
|
| - ScopedMessagePipeHandle pipe) {
|
| - holder->SetPipe(std::move(pipe));
|
| - callback_task_runner->PostTask(FROM_HERE, callback);
|
| -}
|
| -
|
| } // namespace shell
|
| } // namespace mojo
|
|
|