| 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/runner/host/child_process.h" | 5 #include "mojo/runner/host/child_process.h" |
| 6 | 6 |
| 7 #include "base/base_switches.h" | 7 #include "base/base_switches.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 base::Thread::Options io_thread_options(base::MessageLoop::TYPE_IO, 0); | 117 base::Thread::Options io_thread_options(base::MessageLoop::TYPE_IO, 0); |
| 118 CHECK(io_thread_.StartWithOptions(io_thread_options)); | 118 CHECK(io_thread_.StartWithOptions(io_thread_options)); |
| 119 io_runner_ = io_thread_.task_runner().get(); | 119 io_runner_ = io_thread_.task_runner().get(); |
| 120 CHECK(io_runner_.get()); | 120 CHECK(io_runner_.get()); |
| 121 | 121 |
| 122 // TODO(vtl): This should be SLAVE, not NONE. | 122 // TODO(vtl): This should be SLAVE, not NONE. |
| 123 // This must be created before controller_thread_ since MessagePumpMojo will | 123 // This must be created before controller_thread_ since MessagePumpMojo will |
| 124 // create a message pipe which requires this code to be run first. | 124 // create a message pipe which requires this code to be run first. |
| 125 embedder::InitIPCSupport(embedder::ProcessType::NONE, this, io_runner_, | 125 embedder::InitIPCSupport(embedder::ProcessType::NONE, this, io_runner_, |
| 126 embedder::ScopedPlatformHandle()); | 126 embedder::ScopedPlatformHandle()); |
| 127 } |
| 127 | 128 |
| 129 void StartControllerThread() { |
| 128 // Create and start our controller thread. | 130 // Create and start our controller thread. |
| 129 base::Thread::Options controller_thread_options; | 131 base::Thread::Options controller_thread_options; |
| 130 controller_thread_options.message_loop_type = | 132 controller_thread_options.message_loop_type = |
| 131 base::MessageLoop::TYPE_CUSTOM; | 133 base::MessageLoop::TYPE_CUSTOM; |
| 132 controller_thread_options.message_pump_factory = | 134 controller_thread_options.message_pump_factory = |
| 133 base::Bind(&common::MessagePumpMojo::Create); | 135 base::Bind(&common::MessagePumpMojo::Create); |
| 134 CHECK(controller_thread_.StartWithOptions(controller_thread_options)); | 136 CHECK(controller_thread_.StartWithOptions(controller_thread_options)); |
| 135 controller_runner_ = controller_thread_.task_runner().get(); | 137 controller_runner_ = controller_thread_.task_runner().get(); |
| 136 CHECK(controller_runner_.get()); | 138 CHECK(controller_runner_.get()); |
| 137 } | 139 } |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 return sandbox.Pass(); | 300 return sandbox.Pass(); |
| 299 } | 301 } |
| 300 #endif | 302 #endif |
| 301 | 303 |
| 302 ScopedMessagePipeHandle InitializeHostMessagePipe( | 304 ScopedMessagePipeHandle InitializeHostMessagePipe( |
| 303 embedder::ScopedPlatformHandle platform_channel, | 305 embedder::ScopedPlatformHandle platform_channel, |
| 304 scoped_refptr<base::TaskRunner> io_task_runner) { | 306 scoped_refptr<base::TaskRunner> io_task_runner) { |
| 305 ScopedMessagePipeHandle host_message_pipe(embedder::CreateChannel( | 307 ScopedMessagePipeHandle host_message_pipe(embedder::CreateChannel( |
| 306 platform_channel.Pass(), base::Bind(&DidCreateChannel), io_task_runner)); | 308 platform_channel.Pass(), base::Bind(&DidCreateChannel), io_task_runner)); |
| 307 | 309 |
| 308 #if defined(OS_WIN) | |
| 309 if (base::CommandLine::ForCurrentProcess()->HasSwitch("use-new-edk")) { | 310 if (base::CommandLine::ForCurrentProcess()->HasSwitch("use-new-edk")) { |
| 310 // When using the new Mojo EDK, each message pipe is backed by a platform | 311 // When using the new Mojo EDK, each message pipe is backed by a platform |
| 311 // handle. The one platform handle that comes on the command line is used | 312 // handle. The one platform handle that comes on the command line is used |
| 312 // to bind to the ChildController interface. However we also want a | 313 // to bind to the ChildController interface. However we also want a |
| 313 // platform handle to setup the communication channel by which we exchange | 314 // platform handle to setup the communication channel by which we exchange |
| 314 // handles to/from tokens, which is needed for sandboxed Windows | 315 // handles to/from tokens, which is needed for sandboxed Windows |
| 315 // processes. | 316 // processes. |
| 316 char broker_handle[10]; | 317 char broker_handle[10]; |
| 317 MojoHandleSignalsState state; | 318 MojoHandleSignalsState state; |
| 318 MojoResult rv = | 319 MojoResult rv = |
| (...skipping 13 matching lines...) Expand all Loading... |
| 332 embedder::SetParentPipeHandle( | 333 embedder::SetParentPipeHandle( |
| 333 mojo::embedder::ScopedPlatformHandle(mojo::embedder::PlatformHandle( | 334 mojo::embedder::ScopedPlatformHandle(mojo::embedder::PlatformHandle( |
| 334 broker_channel.release(). | 335 broker_channel.release(). |
| 335 #if defined(OS_WIN) | 336 #if defined(OS_WIN) |
| 336 handle | 337 handle |
| 337 #else | 338 #else |
| 338 fd | 339 fd |
| 339 #endif | 340 #endif |
| 340 ))); | 341 ))); |
| 341 } | 342 } |
| 342 #else | |
| 343 // TODO(jam): hook up on POSIX | |
| 344 #endif | |
| 345 | 343 |
| 346 return host_message_pipe.Pass(); | 344 return host_message_pipe.Pass(); |
| 347 } | 345 } |
| 348 | 346 |
| 349 } // namespace | 347 } // namespace |
| 350 | 348 |
| 351 int ChildProcessMain() { | 349 int ChildProcessMain() { |
| 352 DVLOG(2) << "ChildProcessMain()"; | 350 DVLOG(2) << "ChildProcessMain()"; |
| 353 const base::CommandLine& command_line = | 351 const base::CommandLine& command_line = |
| 354 *base::CommandLine::ForCurrentProcess(); | 352 *base::CommandLine::ForCurrentProcess(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 378 embedder::PlatformChannelPair::PassClientHandleFromParentProcess( | 376 embedder::PlatformChannelPair::PassClientHandleFromParentProcess( |
| 379 command_line); | 377 command_line); |
| 380 CHECK(platform_channel.is_valid()); | 378 CHECK(platform_channel.is_valid()); |
| 381 | 379 |
| 382 DCHECK(!base::MessageLoop::current()); | 380 DCHECK(!base::MessageLoop::current()); |
| 383 | 381 |
| 384 AppContext app_context; | 382 AppContext app_context; |
| 385 app_context.Init(); | 383 app_context.Init(); |
| 386 ScopedMessagePipeHandle host_message_pipe = InitializeHostMessagePipe( | 384 ScopedMessagePipeHandle host_message_pipe = InitializeHostMessagePipe( |
| 387 platform_channel.Pass(), app_context.io_runner()); | 385 platform_channel.Pass(), app_context.io_runner()); |
| 386 app_context.StartControllerThread(); |
| 388 Blocker blocker; | 387 Blocker blocker; |
| 389 app_context.controller_runner()->PostTask( | 388 app_context.controller_runner()->PostTask( |
| 390 FROM_HERE, | 389 FROM_HERE, |
| 391 base::Bind(&ChildControllerImpl::Init, base::Unretained(&app_context), | 390 base::Bind(&ChildControllerImpl::Init, base::Unretained(&app_context), |
| 392 base::Unretained(app_library), | 391 base::Unretained(app_library), |
| 393 base::Passed(&host_message_pipe), blocker.GetUnblocker())); | 392 base::Passed(&host_message_pipe), blocker.GetUnblocker())); |
| 394 // This will block, then run whatever the controller wants. | 393 // This will block, then run whatever the controller wants. |
| 395 blocker.Block(); | 394 blocker.Block(); |
| 396 | 395 |
| 397 app_context.Shutdown(); | 396 app_context.Shutdown(); |
| 398 | 397 |
| 399 return 0; | 398 return 0; |
| 400 } | 399 } |
| 401 | 400 |
| 402 } // namespace runner | 401 } // namespace runner |
| 403 } // namespace mojo | 402 } // namespace mojo |
| OLD | NEW |