| Index: webrtc/system_wrappers/source/critical_section_unittest.cc
|
| diff --git a/webrtc/system_wrappers/source/critical_section_unittest.cc b/webrtc/system_wrappers/source/critical_section_unittest.cc
|
| deleted file mode 100644
|
| index 623f2fc2db5feac81fae1e10bfdc365670096dd5..0000000000000000000000000000000000000000
|
| --- a/webrtc/system_wrappers/source/critical_section_unittest.cc
|
| +++ /dev/null
|
| @@ -1,135 +0,0 @@
|
| -/*
|
| - * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license
|
| - * that can be found in the LICENSE file in the root of the source
|
| - * tree. An additional intellectual property rights grant can be found
|
| - * in the file PATENTS. All contributing project authors may
|
| - * be found in the AUTHORS file in the root of the source tree.
|
| - */
|
| -
|
| -#include "webrtc/system_wrappers/include/critical_section_wrapper.h"
|
| -
|
| -#include "webrtc/base/platform_thread.h"
|
| -#include "webrtc/system_wrappers/include/sleep.h"
|
| -#include "webrtc/test/gtest.h"
|
| -
|
| -namespace webrtc {
|
| -
|
| -namespace {
|
| -
|
| -// Cause a process switch. Needed to avoid depending on
|
| -// busy-wait in tests.
|
| -static void SwitchProcess() {
|
| - // Note - sched_yield has been tried as process switch. This does
|
| - // not cause a process switch enough of the time for reliability.
|
| - SleepMs(1);
|
| -}
|
| -
|
| -class ProtectedCount {
|
| -public:
|
| - explicit ProtectedCount(CriticalSectionWrapper* crit_sect)
|
| - : crit_sect_(crit_sect),
|
| - count_(0) {
|
| - }
|
| -
|
| - void Increment() {
|
| - CriticalSectionScoped cs(crit_sect_);
|
| - ++count_;
|
| - }
|
| -
|
| - int Count() const {
|
| - CriticalSectionScoped cs(crit_sect_);
|
| - return count_;
|
| - }
|
| -
|
| -private:
|
| - CriticalSectionWrapper* crit_sect_;
|
| - int count_;
|
| -};
|
| -
|
| -class CritSectTest : public ::testing::Test {
|
| -public:
|
| - CritSectTest() {}
|
| -
|
| - // Waits a number of cycles for the count to reach a given value.
|
| - // Returns true if the target is reached or passed.
|
| - bool WaitForCount(int target, ProtectedCount* count) {
|
| - int loop_counter = 0;
|
| - // On Posix, this SwitchProcess() needs to be in a loop to make the
|
| - // test both fast and non-flaky.
|
| - // With 1 us wait as the switch, up to 7 rounds have been observed.
|
| - while (count->Count() < target && loop_counter < 100 * target) {
|
| - ++loop_counter;
|
| - SwitchProcess();
|
| - }
|
| - return (count->Count() >= target);
|
| - }
|
| -};
|
| -
|
| -void LockUnlockThenStopRunFunction(void* obj) {
|
| - ProtectedCount* the_count = static_cast<ProtectedCount*>(obj);
|
| - the_count->Increment();
|
| -}
|
| -
|
| -TEST_F(CritSectTest, ThreadWakesOnce) NO_THREAD_SAFETY_ANALYSIS {
|
| - CriticalSectionWrapper* crit_sect =
|
| - CriticalSectionWrapper::CreateCriticalSection();
|
| - ProtectedCount count(crit_sect);
|
| - rtc::PlatformThread thread(
|
| - &LockUnlockThenStopRunFunction, &count, "ThreadWakesOnce");
|
| - crit_sect->Enter();
|
| - thread.Start();
|
| - SwitchProcess();
|
| - // The critical section is of reentrant mode, so this should not release
|
| - // the lock, even though count.Count() locks and unlocks the critical section
|
| - // again.
|
| - // Thus, the thread should not be able to increment the count
|
| - ASSERT_EQ(0, count.Count());
|
| - crit_sect->Leave(); // This frees the thread to act.
|
| - EXPECT_TRUE(WaitForCount(1, &count));
|
| - thread.Stop();
|
| - delete crit_sect;
|
| -}
|
| -
|
| -bool LockUnlockRunFunction(void* obj) {
|
| - ProtectedCount* the_count = static_cast<ProtectedCount*>(obj);
|
| - the_count->Increment();
|
| - SwitchProcess();
|
| - return true;
|
| -}
|
| -
|
| -TEST_F(CritSectTest, ThreadWakesTwice) NO_THREAD_SAFETY_ANALYSIS {
|
| - CriticalSectionWrapper* crit_sect =
|
| - CriticalSectionWrapper::CreateCriticalSection();
|
| - ProtectedCount count(crit_sect);
|
| - rtc::PlatformThread thread(
|
| - &LockUnlockRunFunction, &count, "ThreadWakesTwice");
|
| - crit_sect->Enter(); // Make sure counter stays 0 until we wait for it.
|
| - thread.Start();
|
| - crit_sect->Leave();
|
| -
|
| - // The thread is capable of grabbing the lock multiple times,
|
| - // incrementing counter once each time.
|
| - // It's possible for the count to be incremented by more than 2.
|
| - EXPECT_TRUE(WaitForCount(2, &count));
|
| - EXPECT_LE(2, count.Count());
|
| -
|
| - // The thread does not increment while lock is held.
|
| - crit_sect->Enter();
|
| - int count_before = count.Count();
|
| - for (int i = 0; i < 10; i++) {
|
| - SwitchProcess();
|
| - }
|
| - EXPECT_EQ(count_before, count.Count());
|
| - crit_sect->Leave();
|
| -
|
| - SwitchProcess();
|
| - EXPECT_TRUE(WaitForCount(count_before + 1, &count));
|
| - thread.Stop();
|
| - delete crit_sect;
|
| -}
|
| -
|
| -} // anonymous namespace
|
| -
|
| -} // namespace webrtc
|
|
|