From 8f5fc718853a128dc2f70ec4e55db4044af64bcc Mon Sep 17 00:00:00 2001 From: "tommi@chromium.org" Date: Thu, 19 Jan 2012 09:16:58 +0000 Subject: Add thread safety to AudioManagerBase to protect access to the audio thread member variable. This is is a tentative fix for an issue where the AudioManager can crash while tearing down the audio thread. I suspect that this happens because more than one cleanup attempts were made since the class wasn't thread safe. I'm also changing direct access to the thread's MessageLoop* to use MessageLoopProxy based on the same theory. BUG=110051 TEST=Run media tests. Review URL: https://chromiumcodereview.appspot.com/9255017 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@118272 0039d316-1c4b-4281-b951-d872f2087c98 --- media/audio/audio_output_proxy.cc | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'media/audio/audio_output_proxy.cc') diff --git a/media/audio/audio_output_proxy.cc b/media/audio/audio_output_proxy.cc index e8309cf..29490db 100644 --- a/media/audio/audio_output_proxy.cc +++ b/media/audio/audio_output_proxy.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -14,17 +14,16 @@ AudioOutputProxy::AudioOutputProxy(AudioOutputDispatcher* dispatcher) state_(kCreated), physical_stream_(NULL), volume_(1.0) { - DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); } AudioOutputProxy::~AudioOutputProxy() { - DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); + DCHECK(CalledOnValidThread()); DCHECK(state_ == kCreated || state_ == kClosed); DCHECK(!physical_stream_); } bool AudioOutputProxy::Open() { - DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); + DCHECK(CalledOnValidThread()); DCHECK_EQ(state_, kCreated); if (!dispatcher_->StreamOpened()) { @@ -37,7 +36,7 @@ bool AudioOutputProxy::Open() { } void AudioOutputProxy::Start(AudioSourceCallback* callback) { - DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); + DCHECK(CalledOnValidThread()); DCHECK(physical_stream_ == NULL); DCHECK_EQ(state_, kOpened); @@ -54,7 +53,7 @@ void AudioOutputProxy::Start(AudioSourceCallback* callback) { } void AudioOutputProxy::Stop() { - DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); + DCHECK(CalledOnValidThread()); if (state_ != kPlaying) return; @@ -66,7 +65,7 @@ void AudioOutputProxy::Stop() { } void AudioOutputProxy::SetVolume(double volume) { - DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); + DCHECK(CalledOnValidThread()); volume_ = volume; if (physical_stream_) { physical_stream_->SetVolume(volume); @@ -74,12 +73,12 @@ void AudioOutputProxy::SetVolume(double volume) { } void AudioOutputProxy::GetVolume(double* volume) { - DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); + DCHECK(CalledOnValidThread()); *volume = volume_; } void AudioOutputProxy::Close() { - DCHECK_EQ(MessageLoop::current(), dispatcher_->message_loop()); + DCHECK(CalledOnValidThread()); DCHECK(state_ == kCreated || state_ == kError || state_ == kOpened); DCHECK(!physical_stream_); -- cgit v1.1