diff options
author | fischman@chromium.org <fischman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-23 15:25:28 +0000 |
---|---|---|
committer | fischman@chromium.org <fischman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-23 15:25:28 +0000 |
commit | 36330d1074e6428e4bede815a52bb280d58787c2 (patch) | |
tree | 195e31c4bf5456e692db91edb7819151e2b83184 /media/audio/audio_input_controller_unittest.cc | |
parent | 57e17cd42c77255be13e2b8804a526413d1d12d8 (diff) | |
download | chromium_src-36330d1074e6428e4bede815a52bb280d58787c2.zip chromium_src-36330d1074e6428e4bede815a52bb280d58787c2.tar.gz chromium_src-36330d1074e6428e4bede815a52bb280d58787c2.tar.bz2 |
Fix race in AudioInputController::Close().
Before this change, a reference to AudioInputController was bound into the
Callback invoking DoClose(), which executes on the audio thread. If the
audio thread is slow to delete that callback (after dispatching |closed_task|)
then the main thread's reference to the AudioInputController might be released
first, leading to AudioInputController being destructed on the audio thread,
triggering a DCHECK in Timer::~Timer() (owned by the AudioInputController via
DelayTimer).
This race was exposed while working on http://codereview.chromium.org/9717021/
but isn't so much related to the content of that CL as to the fact that that CL
twiddles callback lifetime/timing a bit.
Review URL: http://codereview.chromium.org/9839051
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@128495 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio/audio_input_controller_unittest.cc')
-rw-r--r-- | media/audio/audio_input_controller_unittest.cc | 19 |
1 files changed, 6 insertions, 13 deletions
diff --git a/media/audio/audio_input_controller_unittest.cc b/media/audio/audio_input_controller_unittest.cc index 250f7c8..869610e 100644 --- a/media/audio/audio_input_controller_unittest.cc +++ b/media/audio/audio_input_controller_unittest.cc @@ -37,10 +37,8 @@ ACTION_P3(CheckCountAndPostQuitTask, count, limit, loop_or_proxy) { // Closes AudioOutputController synchronously. static void CloseAudioController(AudioInputController* controller) { - base::WaitableEvent closed_event(true, false); - controller->Close(base::Bind(&base::WaitableEvent::Signal, - base::Unretained(&closed_event))); - closed_event.Wait(); + controller->Close(MessageLoop::QuitClosure()); + MessageLoop::current()->Run(); } class MockAudioInputControllerEventHandler @@ -216,16 +214,11 @@ TEST_F(AudioInputControllerTest, CloseTwice) { controller->Record(); - base::WaitableEvent closed_event_1(true, false); - controller->Close(base::Bind(&base::WaitableEvent::Signal, - base::Unretained(&closed_event_1))); + controller->Close(MessageLoop::QuitClosure()); + MessageLoop::current()->Run(); - base::WaitableEvent closed_event_2(true, false); - controller->Close(base::Bind(&base::WaitableEvent::Signal, - base::Unretained(&closed_event_2))); - - closed_event_1.Wait(); - closed_event_2.Wait(); + controller->Close(MessageLoop::QuitClosure()); + MessageLoop::current()->Run(); } } // namespace media |