Chromium Code Reviews| Index: media/mojo/services/mojo_media_application.cc |
| diff --git a/media/mojo/services/mojo_media_application.cc b/media/mojo/services/mojo_media_application.cc |
| index 814be21fcc2b013b1f40f2a3f27de2f2f38d8092..178314465e9257ea795dea768735808b8afbfc72 100644 |
| --- a/media/mojo/services/mojo_media_application.cc |
| +++ b/media/mojo/services/mojo_media_application.cc |
| @@ -5,6 +5,7 @@ |
| #include "media/mojo/services/mojo_media_application.h" |
| #include "base/logging.h" |
| +#include "base/thread_task_runner_handle.h" |
| #include "media/mojo/services/mojo_cdm_service.h" |
| #include "media/mojo/services/mojo_renderer_service.h" |
| #include "mojo/application/public/cpp/application_connection.h" |
| @@ -13,6 +14,7 @@ |
| namespace media { |
| const char kMojoMediaAppUrl[] = "mojo:media"; |
| +const int kIdleTimeoutInSeconds = 30; |
| // static |
| GURL MojoMediaApplication::AppUrl() { |
| @@ -31,11 +33,16 @@ MojoMediaApplication::~MojoMediaApplication() { |
| } |
| void MojoMediaApplication::Initialize(mojo::ApplicationImpl* app) { |
| + app_impl_ = app; |
|
sky
2015/06/24 03:03:31
Add to member initializers and set to null.
xhwang
2015/06/26 16:30:07
Added Class Member Initializers.
|
| + |
| + // Enable logging. |
| logging::LoggingSettings settings; |
| settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; |
| logging::InitLogging(settings); |
| // Display process ID, thread ID and timestamp in logs. |
| logging::SetLogItems(true, true, true, false); |
| + |
| + StartIdleTimer(); |
| } |
| bool MojoMediaApplication::ConfigureIncomingConnection( |
| @@ -49,14 +56,57 @@ void MojoMediaApplication::Create( |
| mojo::ApplicationConnection* connection, |
| mojo::InterfaceRequest<mojo::ContentDecryptionModule> request) { |
| // The created object is owned by the pipe. |
| - new MojoCdmService(&cdm_service_context_, request.Pass()); |
| + MojoCdmService* mojo_cdm_service = |
| + new MojoCdmService(&cdm_service_context_, request.Pass()); |
| + |
| + // Passing unretained |this| is safe here because the app is guaranteed to |
| + // outlive all services. |
| + mojo_cdm_service->set_connection_error_handler(base::Bind( |
| + &MojoMediaApplication::OnConnectionError, base::Unretained(this))); |
|
sky
2015/06/24 03:03:31
I'm not familiar with this code. Who owns mojo_cmd
xhwang
2015/06/25 18:09:52
mojo_cmd_service is owned by the pipe since it use
|
| + |
| + active_service_count_++; |
| + idle_timeout_callback_.Cancel(); |
| } |
| void MojoMediaApplication::Create( |
| mojo::ApplicationConnection* connection, |
| mojo::InterfaceRequest<mojo::MediaRenderer> request) { |
| // The created object is owned by the pipe. |
| - new MojoRendererService(request.Pass()); |
| + MojoRendererService* mojo_renderer_service = |
| + new MojoRendererService(request.Pass()); |
| + |
| + // Passing unretained |this| is safe here because the app is guaranteed to |
| + // outlive all services. |
| + mojo_renderer_service->set_connection_error_handler(base::Bind( |
| + &MojoMediaApplication::OnConnectionError, base::Unretained(this))); |
| + |
| + active_service_count_++; |
| + idle_timeout_callback_.Cancel(); |
| +} |
| + |
| +void MojoMediaApplication::Quit() { |
| + app_impl_ = nullptr; |
| +} |
| + |
| +void MojoMediaApplication::StartIdleTimer() { |
| + // Passing unretained |app_impl_| is safe here because |app_impl_| is |
| + // guaranteed to outlive |this|, and the callback is canceled if |this| is |
| + // destroyed. |
| + idle_timeout_callback_.Reset(base::Bind(&mojo::ApplicationImpl::Terminate, |
| + base::Unretained(app_impl_))); |
| + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| + FROM_HERE, idle_timeout_callback_.callback(), |
| + base::TimeDelta::FromSeconds(kIdleTimeoutInSeconds)); |
| +} |
| + |
| +void MojoMediaApplication::OnConnectionError() { |
| + DCHECK_GT(active_service_count_, 0u); |
| + active_service_count_--; |
| + if (active_service_count_ == 0) { |
| + // If the last service connection has been dropped, kick off an idle timeout |
| + // to shut ourselves down. |
| + StartIdleTimer(); |
| + } |
| } |
| } // namespace media |