| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/shell/runner/host/child_process_host.h" | 5 #include "mojo/shell/runner/host/child_process_host.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 // With the new EDK, bootstrap message pipes are created asynchronously. | 106 // With the new EDK, bootstrap message pipes are created asynchronously. |
| 107 // We recieve the bound pipe (if successful) on an arbitrary thread, | 107 // We recieve the bound pipe (if successful) on an arbitrary thread, |
| 108 // stash it in the thread-safe |pipe_holder_|, and then try to call | 108 // stash it in the thread-safe |pipe_holder_|, and then try to call |
| 109 // OnMessagePipeCreated() on the host's main thread. | 109 // OnMessagePipeCreated() on the host's main thread. |
| 110 // | 110 // |
| 111 // Because of the way the launcher process shuts down, it's possible for | 111 // Because of the way the launcher process shuts down, it's possible for |
| 112 // the main thread's MessageLoop to stop running (but not yet be destroyed!) | 112 // the main thread's MessageLoop to stop running (but not yet be destroyed!) |
| 113 // while this boostrap is pending, resulting in OnMessagePipeCreated() never | 113 // while this boostrap is pending, resulting in OnMessagePipeCreated() never |
| 114 // being called. | 114 // being called. |
| 115 // | 115 // |
| 116 // A typical child process (i.e. one using ApplicationImpl to bind the other | 116 // A typical child process (i.e. one using ShellConnection to bind the other |
| 117 // end of this pipe) may hang forever waiting for an Initialize() message | 117 // end of this pipe) may hang forever waiting for an Initialize() message |
| 118 // unless the pipe is closed. This in turn means that Join() could hang | 118 // unless the pipe is closed. This in turn means that Join() could hang |
| 119 // waiting for the process to exit. Deadlock! | 119 // waiting for the process to exit. Deadlock! |
| 120 // | 120 // |
| 121 // |pipe_holder_| exists for this reason. If it's still holding onto the | 121 // |pipe_holder_| exists for this reason. If it's still holding onto the |
| 122 // pipe when Join() is called, the pipe will be closed. | 122 // pipe when Join() is called, the pipe will be closed. |
| 123 DCHECK(!primordial_pipe_token_.empty()); | 123 DCHECK(!primordial_pipe_token_.empty()); |
| 124 edk::CreateParentMessagePipe( | 124 edk::CreateParentMessagePipe( |
| 125 primordial_pipe_token_, | 125 primordial_pipe_token_, |
| 126 base::Bind(&OnParentMessagePipeCreated, pipe_holder_, | 126 base::Bind(&OnParentMessagePipeCreated, pipe_holder_, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 149 int rv = -1; | 149 int rv = -1; |
| 150 LOG_IF(ERROR, !child_process_.WaitForExit(&rv)) | 150 LOG_IF(ERROR, !child_process_.WaitForExit(&rv)) |
| 151 << "Failed to wait for child process"; | 151 << "Failed to wait for child process"; |
| 152 | 152 |
| 153 child_process_.Close(); | 153 child_process_.Close(); |
| 154 | 154 |
| 155 return rv; | 155 return rv; |
| 156 } | 156 } |
| 157 | 157 |
| 158 void ChildProcessHost::StartApp( | 158 void ChildProcessHost::StartApp( |
| 159 InterfaceRequest<mojom::Application> application_request, | 159 InterfaceRequest<mojom::ShellClient> request, |
| 160 const mojom::ChildController::StartAppCallback& on_app_complete) { | 160 const mojom::ChildController::StartAppCallback& on_app_complete) { |
| 161 DCHECK(controller_); | 161 DCHECK(controller_); |
| 162 | 162 |
| 163 on_app_complete_ = on_app_complete; | 163 on_app_complete_ = on_app_complete; |
| 164 controller_->StartApp( | 164 controller_->StartApp( |
| 165 std::move(application_request), | 165 std::move(request), |
| 166 base::Bind(&ChildProcessHost::AppCompleted, weak_factory_.GetWeakPtr())); | 166 base::Bind(&ChildProcessHost::AppCompleted, weak_factory_.GetWeakPtr())); |
| 167 } | 167 } |
| 168 | 168 |
| 169 void ChildProcessHost::ExitNow(int32_t exit_code) { | 169 void ChildProcessHost::ExitNow(int32_t exit_code) { |
| 170 DCHECK(controller_); | 170 DCHECK(controller_); |
| 171 | 171 |
| 172 controller_->ExitNow(exit_code); | 172 controller_->ExitNow(exit_code); |
| 173 } | 173 } |
| 174 | 174 |
| 175 void ChildProcessHost::DidStart() { | 175 void ChildProcessHost::DidStart() { |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 scoped_refptr<PipeHolder> holder, | 302 scoped_refptr<PipeHolder> holder, |
| 303 scoped_refptr<base::TaskRunner> callback_task_runner, | 303 scoped_refptr<base::TaskRunner> callback_task_runner, |
| 304 const base::Closure& callback, | 304 const base::Closure& callback, |
| 305 ScopedMessagePipeHandle pipe) { | 305 ScopedMessagePipeHandle pipe) { |
| 306 holder->SetPipe(std::move(pipe)); | 306 holder->SetPipe(std::move(pipe)); |
| 307 callback_task_runner->PostTask(FROM_HERE, callback); | 307 callback_task_runner->PostTask(FROM_HERE, callback); |
| 308 } | 308 } |
| 309 | 309 |
| 310 } // namespace shell | 310 } // namespace shell |
| 311 } // namespace mojo | 311 } // namespace mojo |
| OLD | NEW |