| 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 <utility> |
| 8 |
| 7 #include "base/base_switches.h" | 9 #include "base/base_switches.h" |
| 8 #include "base/bind.h" | 10 #include "base/bind.h" |
| 9 #include "base/callback_helpers.h" | 11 #include "base/callback_helpers.h" |
| 10 #include "base/command_line.h" | 12 #include "base/command_line.h" |
| 11 #include "base/debug/stack_trace.h" | 13 #include "base/debug/stack_trace.h" |
| 12 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
| 13 #include "base/i18n/icu_util.h" | 15 #include "base/i18n/icu_util.h" |
| 14 #include "base/location.h" | 16 #include "base/location.h" |
| 15 #include "base/logging.h" | 17 #include "base/logging.h" |
| 16 #include "base/macros.h" | 18 #include "base/macros.h" |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 | 151 |
| 150 base::SingleThreadTaskRunner* io_runner() const { return io_runner_.get(); } | 152 base::SingleThreadTaskRunner* io_runner() const { return io_runner_.get(); } |
| 151 | 153 |
| 152 base::SingleThreadTaskRunner* controller_runner() const { | 154 base::SingleThreadTaskRunner* controller_runner() const { |
| 153 return controller_runner_.get(); | 155 return controller_runner_.get(); |
| 154 } | 156 } |
| 155 | 157 |
| 156 ChildControllerImpl* controller() const { return controller_.get(); } | 158 ChildControllerImpl* controller() const { return controller_.get(); } |
| 157 | 159 |
| 158 void set_controller(scoped_ptr<ChildControllerImpl> controller) { | 160 void set_controller(scoped_ptr<ChildControllerImpl> controller) { |
| 159 controller_ = controller.Pass(); | 161 controller_ = std::move(controller); |
| 160 } | 162 } |
| 161 | 163 |
| 162 private: | 164 private: |
| 163 void ShutdownOnControllerThread() { | 165 void ShutdownOnControllerThread() { |
| 164 // First, destroy the controller. | 166 // First, destroy the controller. |
| 165 controller_.reset(); | 167 controller_.reset(); |
| 166 | 168 |
| 167 // Next shutdown IPC. We'll unblock the main thread in OnShutdownComplete(). | 169 // Next shutdown IPC. We'll unblock the main thread in OnShutdownComplete(). |
| 168 embedder::ShutdownIPCSupport(); | 170 embedder::ShutdownIPCSupport(); |
| 169 } | 171 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 ScopedMessagePipeHandle host_message_pipe, | 208 ScopedMessagePipeHandle host_message_pipe, |
| 207 const Blocker::Unblocker& unblocker) { | 209 const Blocker::Unblocker& unblocker) { |
| 208 DCHECK(app_context); | 210 DCHECK(app_context); |
| 209 DCHECK(host_message_pipe.is_valid()); | 211 DCHECK(host_message_pipe.is_valid()); |
| 210 | 212 |
| 211 DCHECK(!app_context->controller()); | 213 DCHECK(!app_context->controller()); |
| 212 | 214 |
| 213 scoped_ptr<ChildControllerImpl> impl( | 215 scoped_ptr<ChildControllerImpl> impl( |
| 214 new ChildControllerImpl(app_context, app_library, unblocker)); | 216 new ChildControllerImpl(app_context, app_library, unblocker)); |
| 215 | 217 |
| 216 impl->Bind(host_message_pipe.Pass()); | 218 impl->Bind(std::move(host_message_pipe)); |
| 217 | 219 |
| 218 app_context->set_controller(impl.Pass()); | 220 app_context->set_controller(std::move(impl)); |
| 219 } | 221 } |
| 220 | 222 |
| 221 void Bind(ScopedMessagePipeHandle handle) { | 223 void Bind(ScopedMessagePipeHandle handle) { |
| 222 binding_.Bind(handle.Pass()); | 224 binding_.Bind(std::move(handle)); |
| 223 binding_.set_connection_error_handler([this]() { OnConnectionError(); }); | 225 binding_.set_connection_error_handler([this]() { OnConnectionError(); }); |
| 224 } | 226 } |
| 225 | 227 |
| 226 void OnConnectionError() { | 228 void OnConnectionError() { |
| 227 // A connection error means the connection to the shell is lost. This is not | 229 // A connection error means the connection to the shell is lost. This is not |
| 228 // recoverable. | 230 // recoverable. |
| 229 LOG(ERROR) << "Connection error to the shell."; | 231 LOG(ERROR) << "Connection error to the shell."; |
| 230 _exit(1); | 232 _exit(1); |
| 231 } | 233 } |
| 232 | 234 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 252 const Blocker::Unblocker& unblocker) | 254 const Blocker::Unblocker& unblocker) |
| 253 : app_context_(app_context), | 255 : app_context_(app_context), |
| 254 app_library_(app_library), | 256 app_library_(app_library), |
| 255 unblocker_(unblocker), | 257 unblocker_(unblocker), |
| 256 channel_info_(nullptr), | 258 channel_info_(nullptr), |
| 257 binding_(this) {} | 259 binding_(this) {} |
| 258 | 260 |
| 259 static void StartAppOnMainThread( | 261 static void StartAppOnMainThread( |
| 260 base::NativeLibrary app_library, | 262 base::NativeLibrary app_library, |
| 261 InterfaceRequest<Application> application_request) { | 263 InterfaceRequest<Application> application_request) { |
| 262 if (!RunNativeApplication(app_library, application_request.Pass())) { | 264 if (!RunNativeApplication(app_library, std::move(application_request))) { |
| 263 LOG(ERROR) << "Failure to RunNativeApplication()"; | 265 LOG(ERROR) << "Failure to RunNativeApplication()"; |
| 264 } | 266 } |
| 265 } | 267 } |
| 266 | 268 |
| 267 base::ThreadChecker thread_checker_; | 269 base::ThreadChecker thread_checker_; |
| 268 AppContext* const app_context_; | 270 AppContext* const app_context_; |
| 269 base::NativeLibrary app_library_; | 271 base::NativeLibrary app_library_; |
| 270 Blocker::Unblocker unblocker_; | 272 Blocker::Unblocker unblocker_; |
| 271 StartAppCallback on_app_complete_; | 273 StartAppCallback on_app_complete_; |
| 272 | 274 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 291 // support integrated into mojo. | 293 // support integrated into mojo. |
| 292 std::vector<BrokerFilePermission> permissions; | 294 std::vector<BrokerFilePermission> permissions; |
| 293 permissions.push_back( | 295 permissions.push_back( |
| 294 BrokerFilePermission::ReadWriteCreateUnlinkRecursive("/dev/shm/")); | 296 BrokerFilePermission::ReadWriteCreateUnlinkRecursive("/dev/shm/")); |
| 295 scoped_ptr<mojo::runner::LinuxSandbox> sandbox( | 297 scoped_ptr<mojo::runner::LinuxSandbox> sandbox( |
| 296 new mojo::runner::LinuxSandbox(permissions)); | 298 new mojo::runner::LinuxSandbox(permissions)); |
| 297 sandbox->Warmup(); | 299 sandbox->Warmup(); |
| 298 sandbox->EngageNamespaceSandbox(); | 300 sandbox->EngageNamespaceSandbox(); |
| 299 sandbox->EngageSeccompSandbox(); | 301 sandbox->EngageSeccompSandbox(); |
| 300 sandbox->Seal(); | 302 sandbox->Seal(); |
| 301 return sandbox.Pass(); | 303 return sandbox; |
| 302 } | 304 } |
| 303 #endif | 305 #endif |
| 304 | 306 |
| 305 ScopedMessagePipeHandle InitializeHostMessagePipe( | 307 ScopedMessagePipeHandle InitializeHostMessagePipe( |
| 306 embedder::ScopedPlatformHandle platform_channel, | 308 embedder::ScopedPlatformHandle platform_channel, |
| 307 scoped_refptr<base::TaskRunner> io_task_runner) { | 309 scoped_refptr<base::TaskRunner> io_task_runner) { |
| 308 ScopedMessagePipeHandle host_message_pipe(embedder::CreateChannel( | 310 ScopedMessagePipeHandle host_message_pipe( |
| 309 platform_channel.Pass(), base::Bind(&DidCreateChannel), io_task_runner)); | 311 embedder::CreateChannel(std::move(platform_channel), |
| 312 base::Bind(&DidCreateChannel), io_task_runner)); |
| 310 | 313 |
| 311 if (base::CommandLine::ForCurrentProcess()->HasSwitch("use-new-edk")) { | 314 if (base::CommandLine::ForCurrentProcess()->HasSwitch("use-new-edk")) { |
| 312 // When using the new Mojo EDK, each message pipe is backed by a platform | 315 // When using the new Mojo EDK, each message pipe is backed by a platform |
| 313 // handle. The one platform handle that comes on the command line is used | 316 // handle. The one platform handle that comes on the command line is used |
| 314 // to bind to the ChildController interface. However we also want a | 317 // to bind to the ChildController interface. However we also want a |
| 315 // platform handle to setup the communication channel by which we exchange | 318 // platform handle to setup the communication channel by which we exchange |
| 316 // handles to/from tokens, which is needed for sandboxed Windows | 319 // handles to/from tokens, which is needed for sandboxed Windows |
| 317 // processes. | 320 // processes. |
| 318 char broker_handle[10]; | 321 char broker_handle[10]; |
| 319 MojoHandleSignalsState state; | 322 MojoHandleSignalsState state; |
| 320 MojoResult rv = | 323 MojoResult rv = |
| 321 MojoWait(host_message_pipe.get().value(), MOJO_HANDLE_SIGNAL_READABLE, | 324 MojoWait(host_message_pipe.get().value(), MOJO_HANDLE_SIGNAL_READABLE, |
| 322 MOJO_DEADLINE_INDEFINITE, &state); | 325 MOJO_DEADLINE_INDEFINITE, &state); |
| 323 CHECK_EQ(MOJO_RESULT_OK, rv); | 326 CHECK_EQ(MOJO_RESULT_OK, rv); |
| 324 uint32_t num_bytes = arraysize(broker_handle); | 327 uint32_t num_bytes = arraysize(broker_handle); |
| 325 rv = MojoReadMessage(host_message_pipe.get().value(), | 328 rv = MojoReadMessage(host_message_pipe.get().value(), |
| 326 broker_handle, &num_bytes, nullptr, 0, | 329 broker_handle, &num_bytes, nullptr, 0, |
| 327 MOJO_READ_MESSAGE_FLAG_NONE); | 330 MOJO_READ_MESSAGE_FLAG_NONE); |
| 328 CHECK_EQ(MOJO_RESULT_OK, rv); | 331 CHECK_EQ(MOJO_RESULT_OK, rv); |
| 329 | 332 |
| 330 edk::ScopedPlatformHandle broker_channel = | 333 edk::ScopedPlatformHandle broker_channel = |
| 331 edk::PlatformChannelPair::PassClientHandleFromParentProcessFromString( | 334 edk::PlatformChannelPair::PassClientHandleFromParentProcessFromString( |
| 332 std::string(broker_handle, num_bytes)); | 335 std::string(broker_handle, num_bytes)); |
| 333 CHECK(broker_channel.is_valid()); | 336 CHECK(broker_channel.is_valid()); |
| 334 embedder::SetParentPipeHandle( | 337 embedder::SetParentPipeHandle( |
| 335 mojo::embedder::ScopedPlatformHandle(mojo::embedder::PlatformHandle( | 338 mojo::embedder::ScopedPlatformHandle(mojo::embedder::PlatformHandle( |
| 336 broker_channel.release().handle))); | 339 broker_channel.release().handle))); |
| 337 } | 340 } |
| 338 | 341 |
| 339 return host_message_pipe.Pass(); | 342 return host_message_pipe; |
| 340 } | 343 } |
| 341 | 344 |
| 342 } // namespace | 345 } // namespace |
| 343 | 346 |
| 344 int ChildProcessMain() { | 347 int ChildProcessMain() { |
| 345 DVLOG(2) << "ChildProcessMain()"; | 348 DVLOG(2) << "ChildProcessMain()"; |
| 346 const base::CommandLine& command_line = | 349 const base::CommandLine& command_line = |
| 347 *base::CommandLine::ForCurrentProcess(); | 350 *base::CommandLine::ForCurrentProcess(); |
| 348 | 351 |
| 349 #if defined(OS_LINUX) && !defined(OS_ANDROID) | 352 #if defined(OS_LINUX) && !defined(OS_ANDROID) |
| (...skipping 19 matching lines...) Expand all Loading... |
| 369 embedder::ScopedPlatformHandle platform_channel = | 372 embedder::ScopedPlatformHandle platform_channel = |
| 370 embedder::PlatformChannelPair::PassClientHandleFromParentProcess( | 373 embedder::PlatformChannelPair::PassClientHandleFromParentProcess( |
| 371 command_line); | 374 command_line); |
| 372 CHECK(platform_channel.is_valid()); | 375 CHECK(platform_channel.is_valid()); |
| 373 | 376 |
| 374 DCHECK(!base::MessageLoop::current()); | 377 DCHECK(!base::MessageLoop::current()); |
| 375 | 378 |
| 376 AppContext app_context; | 379 AppContext app_context; |
| 377 app_context.Init(); | 380 app_context.Init(); |
| 378 ScopedMessagePipeHandle host_message_pipe = InitializeHostMessagePipe( | 381 ScopedMessagePipeHandle host_message_pipe = InitializeHostMessagePipe( |
| 379 platform_channel.Pass(), app_context.io_runner()); | 382 std::move(platform_channel), app_context.io_runner()); |
| 380 app_context.StartControllerThread(); | 383 app_context.StartControllerThread(); |
| 381 Blocker blocker; | 384 Blocker blocker; |
| 382 app_context.controller_runner()->PostTask( | 385 app_context.controller_runner()->PostTask( |
| 383 FROM_HERE, | 386 FROM_HERE, |
| 384 base::Bind(&ChildControllerImpl::Init, base::Unretained(&app_context), | 387 base::Bind(&ChildControllerImpl::Init, base::Unretained(&app_context), |
| 385 base::Unretained(app_library), | 388 base::Unretained(app_library), |
| 386 base::Passed(&host_message_pipe), blocker.GetUnblocker())); | 389 base::Passed(&host_message_pipe), blocker.GetUnblocker())); |
| 387 // This will block, then run whatever the controller wants. | 390 // This will block, then run whatever the controller wants. |
| 388 blocker.Block(); | 391 blocker.Block(); |
| 389 | 392 |
| 390 app_context.Shutdown(); | 393 app_context.Shutdown(); |
| 391 | 394 |
| 392 return 0; | 395 return 0; |
| 393 } | 396 } |
| 394 | 397 |
| 395 } // namespace runner | 398 } // namespace runner |
| 396 } // namespace mojo | 399 } // namespace mojo |
| OLD | NEW |