Index: media/audio/audio_manager.cc |
diff --git a/media/audio/audio_manager.cc b/media/audio/audio_manager.cc |
index 87a2b121e5ca0f73d0e8199f59cc16e25b296013..298a5b523a59acedc983781a367f58d17fc72145 100644 |
--- a/media/audio/audio_manager.cc |
+++ b/media/audio/audio_manager.cc |
@@ -81,6 +81,11 @@ class AudioManagerHelper : public base::PowerObserver { |
base::Unretained(this))); |
} |
+ bool IsAudioThreadHung() const { |
+ base::AutoLock lock(hang_lock_); |
+ return audio_thread_status_ == THREAD_HUNG; |
+ } |
+ |
base::SingleThreadTaskRunner* monitor_task_runner() const { |
return monitor_task_runner_.get(); |
} |
@@ -204,6 +209,7 @@ class AudioManagerHelper : public base::PowerObserver { |
void HistogramThreadStatus(ThreadStatus status) { |
DCHECK(monitor_task_runner_->BelongsToCurrentThread()); |
+ hang_lock_.AssertAcquired(); |
audio_thread_status_ = status; |
UMA_HISTOGRAM_ENUMERATION("Media.AudioThreadStatus", audio_thread_status_, |
THREAD_MAX + 1); |
@@ -215,7 +221,7 @@ class AudioManagerHelper : public base::PowerObserver { |
scoped_refptr<base::SingleThreadTaskRunner> monitor_task_runner_; |
scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner_; |
- base::Lock hang_lock_; |
+ mutable base::Lock hang_lock_; |
DaleCurtis
2017/06/13 23:43:15
Just don't make the method const.
alokp
2017/06/14 17:34:34
Done.
|
bool hang_detection_enabled_ = true; |
base::TimeTicks last_audio_thread_timer_tick_; |
uint32_t failed_pings_ = 0; |
@@ -332,8 +338,6 @@ AudioManager* AudioManager::Get() { |
void AudioManager::Shutdown() { |
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
- // TODO(alokp): Suspend hang monitor. |
- |
if (audio_thread_->GetTaskRunner()->BelongsToCurrentThread()) { |
ShutdownOnAudioThread(); |
} else { |
@@ -341,7 +345,13 @@ void AudioManager::Shutdown() { |
FROM_HERE, base::Bind(&AudioManager::ShutdownOnAudioThread, |
base::Unretained(this))); |
} |
- audio_thread_->Stop(); |
+ |
+ // Do not attempt to stop the audio thread if it is hung. |
+ // Otherwise the current thread will hang too: crbug.com/729494 |
+ if (!GetHelper()->IsAudioThreadHung()) |
+ audio_thread_->Stop(); |
DaleCurtis
2017/06/13 23:43:15
~audio_thread_ will still call stop now. You need
alokp
2017/06/14 17:34:35
Good catch. I followed your suggestion of leaking
|
+ // TODO(alokp): Suspend hang monitor. |
+ |
shutdown_ = true; |
} |