Commit c884b972 authored by Yi Fan's avatar Yi Fan Committed by Commit Bot

Add health checker for CMA mixer thread

Mixer thread somehow gets stuck forever, not able to recover.
Using ThreadHealthChecker to workaround

Bug: b/136353019
Test: build & run
Change-Id: Ifbc0bd1bca1da88124e5fc326e8db296f825a6d1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1697317Reviewed-by: default avatarKenneth MacKay <kmackay@chromium.org>
Commit-Queue: Yi Fan <yfa@chromium.org>
Cr-Commit-Position: refs/heads/master@{#676548}
parent 7d6cee11
...@@ -258,6 +258,7 @@ cast_source_set("for_mixer_audio") { ...@@ -258,6 +258,7 @@ cast_source_set("for_mixer_audio") {
":volume_map", ":volume_map",
"//base", "//base",
"//chromecast/base", "//chromecast/base",
"//chromecast/base:thread_health_checker",
"//chromecast/media/audio:libcast_external_audio_pipeline_1.0", "//chromecast/media/audio:libcast_external_audio_pipeline_1.0",
"//chromecast/media/base", "//chromecast/media/base",
"//chromecast/media/cma/base", "//chromecast/media/cma/base",
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "build/build_config.h" #include "build/build_config.h"
#include "chromecast/base/chromecast_switches.h" #include "chromecast/base/chromecast_switches.h"
#include "chromecast/base/serializers.h" #include "chromecast/base/serializers.h"
#include "chromecast/base/thread_health_checker.h"
#include "chromecast/media/base/audio_device_ids.h" #include "chromecast/media/base/audio_device_ids.h"
#include "chromecast/media/cma/backend/audio_output_redirector.h" #include "chromecast/media/cma/backend/audio_output_redirector.h"
#include "chromecast/media/cma/backend/cast_audio_json.h" #include "chromecast/media/cma/backend/cast_audio_json.h"
...@@ -56,6 +57,11 @@ ...@@ -56,6 +57,11 @@
namespace chromecast { namespace chromecast {
namespace media { namespace media {
constexpr base::TimeDelta kMixerThreadCheckTimeout =
base::TimeDelta::FromSeconds(10);
constexpr base::TimeDelta kHealthCheckInterval =
base::TimeDelta::FromSeconds(5);
class StreamMixer::ExternalLoopbackAudioObserver class StreamMixer::ExternalLoopbackAudioObserver
: public CastMediaShlib::LoopbackAudioObserver { : public CastMediaShlib::LoopbackAudioObserver {
public: public:
...@@ -221,6 +227,13 @@ StreamMixer::StreamMixer( ...@@ -221,6 +227,13 @@ StreamMixer::StreamMixer(
loopback_options.priority = base::ThreadPriority::REALTIME_AUDIO; loopback_options.priority = base::ThreadPriority::REALTIME_AUDIO;
loopback_thread_->StartWithOptions(loopback_options); loopback_thread_->StartWithOptions(loopback_options);
loopback_task_runner_ = loopback_thread_->task_runner(); loopback_task_runner_ = loopback_thread_->task_runner();
health_checker_ = std::make_unique<ThreadHealthChecker>(
mixer_task_runner_, loopback_task_runner_, kHealthCheckInterval,
kMixerThreadCheckTimeout,
base::BindRepeating(&StreamMixer::OnHealthCheckFailed,
base::Unretained(this)));
LOG(INFO) << "Mixer health checker started";
} else { } else {
loopback_task_runner_ = mixer_task_runner_; loopback_task_runner_ = mixer_task_runner_;
} }
...@@ -249,6 +262,10 @@ StreamMixer::StreamMixer( ...@@ -249,6 +262,10 @@ StreamMixer::StreamMixer(
} }
} }
void StreamMixer::OnHealthCheckFailed() {
LOG(FATAL) << "Crash on mixer thread health check failure!";
}
void StreamMixer::ResetPostProcessors(CastMediaShlib::ResultCallback callback) { void StreamMixer::ResetPostProcessors(CastMediaShlib::ResultCallback callback) {
RUN_ON_MIXER_THREAD(ResetPostProcessorsOnThread, std::move(callback), ""); RUN_ON_MIXER_THREAD(ResetPostProcessorsOnThread, std::move(callback), "");
} }
......
...@@ -28,6 +28,8 @@ ...@@ -28,6 +28,8 @@
#include "chromecast/public/volume_control.h" #include "chromecast/public/volume_control.h"
namespace chromecast { namespace chromecast {
class ThreadHealthChecker;
namespace media { namespace media {
class AudioOutputRedirector; class AudioOutputRedirector;
...@@ -195,6 +197,9 @@ class StreamMixer { ...@@ -195,6 +197,9 @@ class StreamMixer {
scoped_refptr<base::SingleThreadTaskRunner> mixer_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> mixer_task_runner_;
std::unique_ptr<base::Thread> loopback_thread_; std::unique_ptr<base::Thread> loopback_thread_;
scoped_refptr<base::SingleThreadTaskRunner> loopback_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> loopback_task_runner_;
std::unique_ptr<ThreadHealthChecker> health_checker_;
void OnHealthCheckFailed();
int num_output_channels_; int num_output_channels_;
const int low_sample_rate_cutoff_; const int low_sample_rate_cutoff_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment