summaryrefslogtreecommitdiffstats
path: root/media/audio/audio_input_controller_unittest.cc
diff options
context:
space:
mode:
authorfischman@chromium.org <fischman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-23 15:25:28 +0000
committerfischman@chromium.org <fischman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-23 15:25:28 +0000
commit36330d1074e6428e4bede815a52bb280d58787c2 (patch)
tree195e31c4bf5456e692db91edb7819151e2b83184 /media/audio/audio_input_controller_unittest.cc
parent57e17cd42c77255be13e2b8804a526413d1d12d8 (diff)
downloadchromium_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.cc19
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