Chromium Code Reviews| Index: webrtc/modules/audio_processing/audio_processing_impl_locking_unittest.cc |
| diff --git a/webrtc/modules/audio_processing/audio_processing_impl_locking_unittest.cc b/webrtc/modules/audio_processing/audio_processing_impl_locking_unittest.cc |
| index b82643057d65ec85adb26615411dd24ac032606b..308cf1fd399313023d4cdb5703651614c749a9a7 100644 |
| --- a/webrtc/modules/audio_processing/audio_processing_impl_locking_unittest.cc |
| +++ b/webrtc/modules/audio_processing/audio_processing_impl_locking_unittest.cc |
| @@ -16,11 +16,11 @@ |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "webrtc/base/array_view.h" |
| #include "webrtc/base/criticalsection.h" |
| +#include "webrtc/base/event.h" |
| #include "webrtc/base/platform_thread.h" |
| #include "webrtc/config.h" |
| #include "webrtc/modules/audio_processing/test/test_utils.h" |
| #include "webrtc/modules/include/module_common_types.h" |
| -#include "webrtc/system_wrappers/include/event_wrapper.h" |
| #include "webrtc/system_wrappers/include/sleep.h" |
| #include "webrtc/test/random.h" |
| @@ -273,57 +273,44 @@ class FrameCounters { |
| capture_count++; |
| } |
| - int GetCaptureCounter() { |
| + int GetCaptureCounter() const { |
| rtc::CritScope cs(&crit_); |
| return capture_count; |
| } |
| - int GetRenderCounter() { |
| + int GetRenderCounter() const { |
| rtc::CritScope cs(&crit_); |
| return render_count; |
| } |
| - int CaptureMinusRenderCounters() { |
| + int CaptureMinusRenderCounters() const { |
| rtc::CritScope cs(&crit_); |
| return capture_count - render_count; |
| } |
| + int RenderMinusCaptureCounters() const { |
| + return -CaptureMinusRenderCounters(); |
| + } |
| + |
| bool BothCountersExceedeThreshold(int threshold) { |
| rtc::CritScope cs(&crit_); |
| return (render_count > threshold && capture_count > threshold); |
| } |
| private: |
| - rtc::CriticalSection crit_; |
| + mutable rtc::CriticalSection crit_; |
| int render_count GUARDED_BY(crit_) = 0; |
| int capture_count GUARDED_BY(crit_) = 0; |
| }; |
| -// Checker for whether the capture side has been called. |
| -class CaptureSideCalledChecker { |
| - public: |
| - bool CaptureSideCalled() { |
| - rtc::CritScope cs(&crit_); |
| - return capture_side_called_; |
| - } |
| - |
| - void FlagCaptureSideCalled() { |
| - rtc::CritScope cs(&crit_); |
| - capture_side_called_ = true; |
| - } |
| - |
| - private: |
| - rtc::CriticalSection crit_; |
| - bool capture_side_called_ GUARDED_BY(crit_) = false; |
| -}; |
| - |
| // Class for handling the capture side processing. |
| class CaptureProcessor { |
| public: |
| CaptureProcessor(int max_frame_size, |
| RandomGenerator* rand_gen, |
| + rtc::Event* render_call_event, |
| + rtc::Event* capture_call_event, |
| FrameCounters* shared_counters_state, |
| - CaptureSideCalledChecker* capture_call_checker, |
| AudioProcessingImplLockTest* test_framework, |
| TestConfig* test_config, |
| AudioProcessing* apm); |
| @@ -338,12 +325,13 @@ class CaptureProcessor { |
| void CallApmCaptureSide(); |
| void ApplyRuntimeSettingScheme(); |
| - RandomGenerator* rand_gen_ = nullptr; |
| - FrameCounters* frame_counters_ = nullptr; |
| - CaptureSideCalledChecker* capture_call_checker_ = nullptr; |
| - AudioProcessingImplLockTest* test_ = nullptr; |
| - TestConfig* test_config_ = nullptr; |
| - AudioProcessing* apm_ = nullptr; |
| + RandomGenerator* const rand_gen_ = nullptr; |
| + rtc::Event* const render_call_event_ = nullptr; |
| + rtc::Event* const capture_call_event_ = nullptr; |
| + FrameCounters* const frame_counters_ = nullptr; |
| + AudioProcessingImplLockTest* const test_ = nullptr; |
| + const TestConfig* const test_config_ = nullptr; |
| + AudioProcessing* const apm_ = nullptr; |
| AudioFrameData frame_data_; |
| }; |
| @@ -366,8 +354,9 @@ class RenderProcessor { |
| public: |
| RenderProcessor(int max_frame_size, |
| RandomGenerator* rand_gen, |
| + rtc::Event* render_call_event, |
| + rtc::Event* capture_call_event, |
| FrameCounters* shared_counters_state, |
| - CaptureSideCalledChecker* capture_call_checker, |
| AudioProcessingImplLockTest* test_framework, |
| TestConfig* test_config, |
| AudioProcessing* apm); |
| @@ -382,22 +371,23 @@ class RenderProcessor { |
| void CallApmRenderSide(); |
| void ApplyRuntimeSettingScheme(); |
| - RandomGenerator* rand_gen_ = nullptr; |
| - FrameCounters* frame_counters_ = nullptr; |
| - CaptureSideCalledChecker* capture_call_checker_ = nullptr; |
| - AudioProcessingImplLockTest* test_ = nullptr; |
| - TestConfig* test_config_ = nullptr; |
| - AudioProcessing* apm_ = nullptr; |
| - bool first_render_side_call_ = true; |
| + RandomGenerator* const rand_gen_ = nullptr; |
| + rtc::Event* const render_call_event_ = nullptr; |
| + rtc::Event* const capture_call_event_ = nullptr; |
| + FrameCounters* const frame_counters_ = nullptr; |
| + AudioProcessingImplLockTest* const test_ = nullptr; |
| + const TestConfig* const test_config_ = nullptr; |
| + AudioProcessing* const apm_ = nullptr; |
| AudioFrameData frame_data_; |
| + bool first_render_call_ = true; |
| }; |
| class AudioProcessingImplLockTest |
| : public ::testing::TestWithParam<TestConfig> { |
| public: |
| AudioProcessingImplLockTest(); |
| - EventTypeWrapper RunTest(); |
| - void CheckTestCompleteness(); |
| + bool RunTest(); |
| + bool MaybeEndTest(); |
| private: |
| static const int kTestTimeOutLimit = 10 * 60 * 1000; |
| @@ -442,8 +432,10 @@ class AudioProcessingImplLockTest |
| stats_thread_.SetPriority(rtc::kNormalPriority); |
| } |
| - // Event handler for the test. |
| - const rtc::scoped_ptr<EventWrapper> test_complete_; |
| + // Event handlers for the test. |
| + rtc::Event test_complete_; |
| + rtc::Event render_call_event_; |
| + rtc::Event capture_call_event_; |
| // Thread related variables. |
| rtc::PlatformThread render_thread_; |
| @@ -454,7 +446,6 @@ class AudioProcessingImplLockTest |
| rtc::scoped_ptr<AudioProcessing> apm_; |
| TestConfig test_config_; |
| FrameCounters frame_counters_; |
| - CaptureSideCalledChecker capture_call_checker_; |
| RenderProcessor render_thread_state_; |
| CaptureProcessor capture_thread_state_; |
| StatsProcessor stats_thread_state_; |
| @@ -497,37 +488,43 @@ void PopulateAudioFrame(AudioFrame* frame, |
| } |
| AudioProcessingImplLockTest::AudioProcessingImplLockTest() |
| - : test_complete_(EventWrapper::Create()), |
| + : test_complete_(false, false), |
| + render_call_event_(false, false), |
| + capture_call_event_(false, false), |
| render_thread_(RenderProcessorThreadFunc, this, "render"), |
| capture_thread_(CaptureProcessorThreadFunc, this, "capture"), |
| stats_thread_(StatsProcessorThreadFunc, this, "stats"), |
| apm_(AudioProcessingImpl::Create()), |
| render_thread_state_(kMaxFrameSize, |
| &rand_gen_, |
| + &render_call_event_, |
| + &capture_call_event_, |
| &frame_counters_, |
| - &capture_call_checker_, |
| this, |
| &test_config_, |
| apm_.get()), |
| capture_thread_state_(kMaxFrameSize, |
| &rand_gen_, |
| + &render_call_event_, |
| + &capture_call_event_, |
| &frame_counters_, |
| - &capture_call_checker_, |
| this, |
| &test_config_, |
| apm_.get()), |
| stats_thread_state_(&rand_gen_, &test_config_, apm_.get()) {} |
| // Run the test with a timeout. |
| -EventTypeWrapper AudioProcessingImplLockTest::RunTest() { |
| +bool AudioProcessingImplLockTest::RunTest() { |
| StartThreads(); |
| - return test_complete_->Wait(kTestTimeOutLimit); |
| + return test_complete_.Wait(kTestTimeOutLimit); |
| } |
| -void AudioProcessingImplLockTest::CheckTestCompleteness() { |
| +bool AudioProcessingImplLockTest::MaybeEndTest() { |
| if (HasFatalFailure() || TestDone()) { |
| - test_complete_->Set(); |
| + test_complete_.Set(); |
| + return true; |
| } |
| + return false; |
| } |
| // Setup of test and APM. |
| @@ -572,6 +569,8 @@ void AudioProcessingImplLockTest::SetUp() { |
| } |
| void AudioProcessingImplLockTest::TearDown() { |
| + render_call_event_.Set(); |
| + capture_call_event_.Set(); |
| render_thread_.Stop(); |
| capture_thread_.Stop(); |
| stats_thread_.Stop(); |
| @@ -609,17 +608,18 @@ bool StatsProcessor::Process() { |
| const float CaptureProcessor::kCaptureInputFloatLevel = 0.03125f; |
| -CaptureProcessor::CaptureProcessor( |
| - int max_frame_size, |
| - RandomGenerator* rand_gen, |
| - FrameCounters* shared_counters_state, |
| - CaptureSideCalledChecker* capture_call_checker, |
| - AudioProcessingImplLockTest* test_framework, |
| - TestConfig* test_config, |
| - AudioProcessing* apm) |
| +CaptureProcessor::CaptureProcessor(int max_frame_size, |
| + RandomGenerator* rand_gen, |
| + rtc::Event* render_call_event, |
| + rtc::Event* capture_call_event, |
| + FrameCounters* shared_counters_state, |
| + AudioProcessingImplLockTest* test_framework, |
| + TestConfig* test_config, |
| + AudioProcessing* apm) |
| : rand_gen_(rand_gen), |
| + render_call_event_(render_call_event), |
| + capture_call_event_(capture_call_event), |
| frame_counters_(shared_counters_state), |
| - capture_call_checker_(capture_call_checker), |
| test_(test_framework), |
| test_config_(test_config), |
| apm_(apm), |
| @@ -630,15 +630,15 @@ bool CaptureProcessor::Process() { |
| // Sleep a random time to simulate thread jitter. |
| SleepRandomMs(3, rand_gen_); |
| - // End the test if complete. |
| - test_->CheckTestCompleteness(); |
| + // Check whether the test is done. |
| + if (test_->MaybeEndTest()) { |
| + return false; |
| + } |
| - // Ensure that there are not more capture side calls than render side |
| - // calls. |
| - if (capture_call_checker_->CaptureSideCalled()) { |
| - while (kMaxCallDifference < frame_counters_->CaptureMinusRenderCounters()) { |
| - SleepMs(1); |
| - } |
| + // Ensure that the number of render and capture calls do not |
| + // differ too much. |
| + if (frame_counters_->CaptureMinusRenderCounters() > kMaxCallDifference) { |
| + render_call_event_->Wait(rtc::Event::kForever); |
| } |
| // Apply any specified capture side APM non-processing runtime calls. |
| @@ -650,11 +650,9 @@ bool CaptureProcessor::Process() { |
| // Increase the number of capture-side calls. |
| frame_counters_->IncreaseCaptureCounter(); |
| - // Flag that the capture side has been called at least once |
| - // (needed to ensure that a capture call has been done |
| - // before the first render call is performed (implicitly |
| - // required by the APM API). |
| - capture_call_checker_->FlagCaptureSideCalled(); |
| + // Flag to the render thread that another capture API call has occurred |
| + // by triggering this threads call event. |
| + capture_call_event_->Set(); |
| return true; |
| } |
| @@ -873,14 +871,16 @@ const float RenderProcessor::kRenderInputFloatLevel = 0.5f; |
| RenderProcessor::RenderProcessor(int max_frame_size, |
| RandomGenerator* rand_gen, |
| + rtc::Event* render_call_event, |
| + rtc::Event* capture_call_event, |
| FrameCounters* shared_counters_state, |
| - CaptureSideCalledChecker* capture_call_checker, |
| AudioProcessingImplLockTest* test_framework, |
| TestConfig* test_config, |
| AudioProcessing* apm) |
| : rand_gen_(rand_gen), |
| + render_call_event_(render_call_event), |
| + capture_call_event_(capture_call_event), |
| frame_counters_(shared_counters_state), |
| - capture_call_checker_(capture_call_checker), |
| test_(test_framework), |
| test_config_(test_config), |
| apm_(apm), |
| @@ -891,24 +891,23 @@ bool RenderProcessor::Process() { |
| // Conditional wait to ensure that a capture call has been done |
| // before the first render call is performed (implicitly |
| // required by the APM API). |
| - if (first_render_side_call_) { |
| - while (!capture_call_checker_->CaptureSideCalled()) { |
| - SleepRandomMs(3, rand_gen_); |
| - } |
| - |
| - first_render_side_call_ = false; |
| + if (first_render_call_) { |
| + capture_call_event_->Wait(rtc::Event::kForever); |
| + first_render_call_ = false; |
| } |
| // Sleep a random time to simulate thread jitter. |
| SleepRandomMs(3, rand_gen_); |
| - // End the test early if a fatal failure (ASSERT_*) has occurred. |
| - test_->CheckTestCompleteness(); |
| + // Check whether the test is done. |
| + if (test_->MaybeEndTest()) { |
|
pbos-webrtc
2015/12/02 22:59:13
Maybe rename MaybeEndTest to TestHasEnded?
peah-webrtc
2015/12/03 08:17:17
That is a good name but I think it is a bit mislea
|
| + return false; |
| + } |
| // Ensure that the number of render and capture calls do not |
| // differ too much. |
| - while (kMaxCallDifference < -frame_counters_->CaptureMinusRenderCounters()) { |
| - SleepMs(1); |
| + if (frame_counters_->RenderMinusCaptureCounters() > kMaxCallDifference) { |
| + capture_call_event_->Wait(rtc::Event::kForever); |
| } |
| // Apply any specified render side APM non-processing runtime calls. |
| @@ -920,6 +919,9 @@ bool RenderProcessor::Process() { |
| // Increase the number of render-side calls. |
| frame_counters_->IncreaseRenderCounter(); |
| + // Flag to the capture thread that another render API call has occurred |
| + // by triggering this threads call event. |
| + render_call_event_->Set(); |
| return true; |
| } |
| @@ -1114,7 +1116,7 @@ void RenderProcessor::ApplyRuntimeSettingScheme() { |
| TEST_P(AudioProcessingImplLockTest, LockTest) { |
| // Run test and verify that it did not time out. |
| - ASSERT_EQ(kEventSignaled, RunTest()); |
| + ASSERT_TRUE(RunTest()); |
| } |
| // Instantiate tests from the extreme test configuration set. |