| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/child/child_thread_impl.h" | 5 #include "content/child/child_thread_impl.h" |
| 6 | 6 |
| 7 #include <signal.h> | 7 #include <signal.h> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 DISALLOW_COPY_AND_ASSIGN(ChannelBootstrapFilter); | 283 DISALLOW_COPY_AND_ASSIGN(ChannelBootstrapFilter); |
| 284 }; | 284 }; |
| 285 | 285 |
| 286 } // namespace | 286 } // namespace |
| 287 | 287 |
| 288 ChildThread* ChildThread::Get() { | 288 ChildThread* ChildThread::Get() { |
| 289 return ChildThreadImpl::current(); | 289 return ChildThreadImpl::current(); |
| 290 } | 290 } |
| 291 | 291 |
| 292 ChildThreadImpl::Options::Options() | 292 ChildThreadImpl::Options::Options() |
| 293 : auto_start_service_manager_connection(true), connect_to_browser(false) {} | 293 : auto_start_service_manager_connection(true), |
| 294 connect_to_browser(false), |
| 295 init_discardable_memory(false) {} |
| 294 | 296 |
| 295 ChildThreadImpl::Options::Options(const Options& other) = default; | 297 ChildThreadImpl::Options::Options(const Options& other) = default; |
| 296 | 298 |
| 297 ChildThreadImpl::Options::~Options() { | 299 ChildThreadImpl::Options::~Options() { |
| 298 } | 300 } |
| 299 | 301 |
| 300 ChildThreadImpl::Options::Builder::Builder() { | 302 ChildThreadImpl::Options::Builder::Builder() { |
| 301 } | 303 } |
| 302 | 304 |
| 303 ChildThreadImpl::Options::Builder& | 305 ChildThreadImpl::Options::Builder& |
| 304 ChildThreadImpl::Options::Builder::InBrowserProcess( | 306 ChildThreadImpl::Options::Builder::InBrowserProcess( |
| 305 const InProcessChildThreadParams& params) { | 307 const InProcessChildThreadParams& params) { |
| 306 options_.browser_process_io_runner = params.io_runner(); | 308 options_.browser_process_io_runner = params.io_runner(); |
| 307 options_.in_process_service_request_token = params.service_request_token(); | 309 options_.in_process_service_request_token = params.service_request_token(); |
| 308 return *this; | 310 return *this; |
| 309 } | 311 } |
| 310 | 312 |
| 311 ChildThreadImpl::Options::Builder& | 313 ChildThreadImpl::Options::Builder& |
| 312 ChildThreadImpl::Options::Builder::AutoStartServiceManagerConnection( | 314 ChildThreadImpl::Options::Builder::AutoStartServiceManagerConnection( |
| 313 bool auto_start) { | 315 bool auto_start) { |
| 314 options_.auto_start_service_manager_connection = auto_start; | 316 options_.auto_start_service_manager_connection = auto_start; |
| 315 return *this; | 317 return *this; |
| 316 } | 318 } |
| 317 | 319 |
| 318 ChildThreadImpl::Options::Builder& | 320 ChildThreadImpl::Options::Builder& |
| 319 ChildThreadImpl::Options::Builder::ConnectToBrowser( | 321 ChildThreadImpl::Options::Builder::InitDiscardableMemory( |
| 320 bool connect_to_browser) { | 322 bool discardable_memory) { |
| 323 options_.init_discardable_memory = discardable_memory; |
| 324 return *this; |
| 325 } |
| 326 |
| 327 ChildThreadImpl::Options::Builder& |
| 328 ChildThreadImpl::Options::Builder::ConnectToBrowser(bool connect_to_browser) { |
| 321 options_.connect_to_browser = connect_to_browser; | 329 options_.connect_to_browser = connect_to_browser; |
| 322 return *this; | 330 return *this; |
| 323 } | 331 } |
| 324 | 332 |
| 325 ChildThreadImpl::Options::Builder& | 333 ChildThreadImpl::Options::Builder& |
| 326 ChildThreadImpl::Options::Builder::AddStartupFilter( | 334 ChildThreadImpl::Options::Builder::AddStartupFilter( |
| 327 IPC::MessageFilter* filter) { | 335 IPC::MessageFilter* filter) { |
| 328 options_.startup_filters.push_back(filter); | 336 options_.startup_filters.push_back(filter); |
| 329 return *this; | 337 return *this; |
| 330 } | 338 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 347 #if defined(OS_ANDROID) | 355 #if defined(OS_ANDROID) |
| 348 if (!handled && msg.is_sync()) { | 356 if (!handled && msg.is_sync()) { |
| 349 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg); | 357 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg); |
| 350 reply->set_reply_error(); | 358 reply->set_reply_error(); |
| 351 Send(reply); | 359 Send(reply); |
| 352 } | 360 } |
| 353 #endif | 361 #endif |
| 354 return handled; | 362 return handled; |
| 355 } | 363 } |
| 356 | 364 |
| 357 class ChildThreadImpl::ClientDiscardableSharedMemoryManagerDelegate | |
| 358 : public discardable_memory::ClientDiscardableSharedMemoryManager:: | |
| 359 Delegate { | |
| 360 public: | |
| 361 explicit ClientDiscardableSharedMemoryManagerDelegate( | |
| 362 scoped_refptr<ThreadSafeSender> sender) | |
| 363 : sender_(sender) {} | |
| 364 ~ClientDiscardableSharedMemoryManagerDelegate() override {} | |
| 365 | |
| 366 void AllocateLockedDiscardableSharedMemory( | |
| 367 size_t size, | |
| 368 discardable_memory::DiscardableSharedMemoryId id, | |
| 369 base::SharedMemoryHandle* handle) override { | |
| 370 sender_->Send( | |
| 371 new ChildProcessHostMsg_SyncAllocateLockedDiscardableSharedMemory( | |
| 372 size, id, handle)); | |
| 373 } | |
| 374 | |
| 375 void DeletedDiscardableSharedMemory( | |
| 376 discardable_memory::DiscardableSharedMemoryId id) override { | |
| 377 sender_->Send(new ChildProcessHostMsg_DeletedDiscardableSharedMemory(id)); | |
| 378 } | |
| 379 | |
| 380 private: | |
| 381 scoped_refptr<ThreadSafeSender> sender_; | |
| 382 }; | |
| 383 | |
| 384 ChildThreadImpl::ChildThreadImpl() | 365 ChildThreadImpl::ChildThreadImpl() |
| 385 : route_provider_binding_(this), | 366 : route_provider_binding_(this), |
| 386 associated_interface_provider_bindings_( | 367 associated_interface_provider_bindings_( |
| 387 mojo::BindingSetDispatchMode::WITH_CONTEXT), | 368 mojo::BindingSetDispatchMode::WITH_CONTEXT), |
| 388 router_(this), | 369 router_(this), |
| 389 channel_connected_factory_( | 370 channel_connected_factory_( |
| 390 new base::WeakPtrFactory<ChildThreadImpl>(this)), | 371 new base::WeakPtrFactory<ChildThreadImpl>(this)), |
| 391 weak_factory_(this) { | 372 weak_factory_(this) { |
| 392 Init(Options::Builder().Build()); | 373 Init(Options::Builder().Build()); |
| 393 } | 374 } |
| 394 | 375 |
| 395 ChildThreadImpl::ChildThreadImpl(const Options& options) | 376 ChildThreadImpl::ChildThreadImpl(const Options& options) |
| 396 : route_provider_binding_(this), | 377 : route_provider_binding_(this), |
| 397 associated_interface_provider_bindings_( | 378 associated_interface_provider_bindings_( |
| 398 mojo::BindingSetDispatchMode::WITH_CONTEXT), | 379 mojo::BindingSetDispatchMode::WITH_CONTEXT), |
| 399 router_(this), | 380 router_(this), |
| 400 browser_process_io_runner_(options.browser_process_io_runner), | 381 browser_process_io_runner_(options.browser_process_io_runner), |
| 401 channel_connected_factory_( | 382 channel_connected_factory_( |
| 402 new base::WeakPtrFactory<ChildThreadImpl>(this)), | 383 new base::WeakPtrFactory<ChildThreadImpl>(this)), |
| 403 weak_factory_(this) { | 384 weak_factory_(this) { |
| 404 Init(options); | 385 Init(options); |
| 405 } | 386 } |
| 406 | 387 |
| 407 scoped_refptr<base::SequencedTaskRunner> ChildThreadImpl::GetIOTaskRunner() { | 388 scoped_refptr<base::SingleThreadTaskRunner> ChildThreadImpl::GetIOTaskRunner() { |
| 408 if (IsInBrowserProcess()) | 389 if (IsInBrowserProcess()) |
| 409 return browser_process_io_runner_; | 390 return browser_process_io_runner_; |
| 410 return ChildProcess::current()->io_task_runner(); | 391 return ChildProcess::current()->io_task_runner(); |
| 411 } | 392 } |
| 412 | 393 |
| 413 void ChildThreadImpl::ConnectChannel() { | 394 void ChildThreadImpl::ConnectChannel() { |
| 414 std::string channel_token; | 395 std::string channel_token; |
| 415 mojo::ScopedMessagePipeHandle handle; | 396 mojo::ScopedMessagePipeHandle handle; |
| 416 if (!IsInBrowserProcess()) { | 397 if (!IsInBrowserProcess()) { |
| 417 channel_token = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 398 channel_token = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 584 channel_connected_factory_->GetWeakPtr()), | 565 channel_connected_factory_->GetWeakPtr()), |
| 585 base::TimeDelta::FromSeconds(connection_timeout)); | 566 base::TimeDelta::FromSeconds(connection_timeout)); |
| 586 | 567 |
| 587 #if defined(OS_ANDROID) | 568 #if defined(OS_ANDROID) |
| 588 g_quit_closure.Get().BindToMainThread(); | 569 g_quit_closure.Get().BindToMainThread(); |
| 589 #endif | 570 #endif |
| 590 | 571 |
| 591 shared_bitmap_manager_.reset( | 572 shared_bitmap_manager_.reset( |
| 592 new ChildSharedBitmapManager(thread_safe_sender())); | 573 new ChildSharedBitmapManager(thread_safe_sender())); |
| 593 | 574 |
| 594 client_discardable_shared_memory_manager_delegate_ = | 575 if (options.init_discardable_memory) { |
| 595 base::MakeUnique<ClientDiscardableSharedMemoryManagerDelegate>( | 576 discardable_memory::mojom::DiscardableSharedMemoryManagerPtr manager; |
| 596 thread_safe_sender()); | 577 ChildThread::Get()->GetRemoteInterfaces()->GetInterface( |
| 597 discardable_shared_memory_manager_ = base::MakeUnique< | 578 mojo::GetProxy(&manager)); |
| 598 discardable_memory::ClientDiscardableSharedMemoryManager>( | 579 discardable_shared_memory_manager_ = base::MakeUnique< |
| 599 client_discardable_shared_memory_manager_delegate_.get()); | 580 discardable_memory::ClientDiscardableSharedMemoryManager>( |
| 581 manager.PassInterface(), GetIOTaskRunner()); |
| 582 } |
| 600 } | 583 } |
| 601 | 584 |
| 602 ChildThreadImpl::~ChildThreadImpl() { | 585 ChildThreadImpl::~ChildThreadImpl() { |
| 603 #ifdef IPC_MESSAGE_LOG_ENABLED | 586 #ifdef IPC_MESSAGE_LOG_ENABLED |
| 604 IPC::Logging::GetInstance()->SetIPCSender(NULL); | 587 IPC::Logging::GetInstance()->SetIPCSender(NULL); |
| 605 #endif | 588 #endif |
| 606 | 589 |
| 607 channel_->RemoveFilter(histogram_message_filter_.get()); | 590 channel_->RemoveFilter(histogram_message_filter_.get()); |
| 608 channel_->RemoveFilter(sync_message_filter_.get()); | 591 channel_->RemoveFilter(sync_message_filter_.get()); |
| 609 | 592 |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 917 connected_to_browser_ = true; | 900 connected_to_browser_ = true; |
| 918 child_info_ = local_info; | 901 child_info_ = local_info; |
| 919 browser_info_ = remote_info; | 902 browser_info_ = remote_info; |
| 920 } | 903 } |
| 921 | 904 |
| 922 bool ChildThreadImpl::IsInBrowserProcess() const { | 905 bool ChildThreadImpl::IsInBrowserProcess() const { |
| 923 return static_cast<bool>(browser_process_io_runner_); | 906 return static_cast<bool>(browser_process_io_runner_); |
| 924 } | 907 } |
| 925 | 908 |
| 926 } // namespace content | 909 } // namespace content |
| OLD | NEW |