Index: webrtc/system_wrappers/source/condition_variable_unittest.cc |
diff --git a/webrtc/system_wrappers/source/condition_variable_unittest.cc b/webrtc/system_wrappers/source/condition_variable_unittest.cc |
deleted file mode 100644 |
index 90779ff7f75e115cb4cac532d412df36a04a7bc0..0000000000000000000000000000000000000000 |
--- a/webrtc/system_wrappers/source/condition_variable_unittest.cc |
+++ /dev/null |
@@ -1,205 +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. |
- */ |
- |
-// TODO(tommi): Remove completely. As is there is still some code for Windows |
-// that relies on ConditionVariableEventWin, but code has been removed on other |
-// platforms. |
-#if defined(WEBRTC_WIN) |
- |
-#include "webrtc/base/platform_thread.h" |
-#include "webrtc/base/timeutils.h" |
-#include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
-#include "webrtc/system_wrappers/source/condition_variable_event_win.h" |
-#include "webrtc/test/gtest.h" |
- |
-namespace webrtc { |
- |
-namespace { |
- |
-const int kLongWaitMs = 100 * 1000; // A long time in testing terms |
-const int kShortWaitMs = 2 * 1000; // Long enough for process switches to happen |
-const int kVeryShortWaitMs = 20; // Used when we want a timeout |
- |
-// A Baton is one possible control structure one can build using |
-// conditional variables. |
-// A Baton is always held by one and only one active thread - unlike |
-// a lock, it can never be free. |
-// One can pass it or grab it - both calls have timeouts. |
-// Note - a production tool would guard against passing it without |
-// grabbing it first. This one is for testing, so it doesn't. |
-class Baton { |
- public: |
- Baton() |
- : being_passed_(false), |
- pass_count_(0) { |
- InitializeCriticalSection(&crit_sect_); |
- } |
- |
- ~Baton() { |
- DeleteCriticalSection(&crit_sect_); |
- } |
- |
- // Pass the baton. Returns false if baton is not picked up in |max_msecs|. |
- // Only one process can pass at the same time; this property is |
- // ensured by the |giver_sect_| lock. |
- bool Pass(uint32_t max_msecs) { |
- CriticalSectionScoped cs_giver(&giver_sect_); |
- EnterCriticalSection(&crit_sect_); |
- SignalBatonAvailable(); |
- const bool result = TakeBatonIfStillFree(max_msecs); |
- if (result) { |
- ++pass_count_; |
- } |
- LeaveCriticalSection(&crit_sect_); |
- return result; |
- } |
- |
- // Grab the baton. Returns false if baton is not passed. |
- bool Grab(uint32_t max_msecs) { |
- EnterCriticalSection(&crit_sect_); |
- bool ret = WaitUntilBatonOffered(max_msecs); |
- LeaveCriticalSection(&crit_sect_); |
- return ret; |
- } |
- |
- int PassCount() { |
- // We don't allow polling PassCount() during a Pass()-call since there is |
- // no guarantee that |pass_count_| is incremented until the Pass()-call |
- // finishes. I.e. the Grab()-call may finish before |pass_count_| has been |
- // incremented. |
- // Thus, this function waits on giver_sect_. |
- CriticalSectionScoped cs(&giver_sect_); |
- return pass_count_; |
- } |
- |
- private: |
- // Wait/Signal forms a classical semaphore on |being_passed_|. |
- // These functions must be called with crit_sect_ held. |
- bool WaitUntilBatonOffered(int timeout_ms) { |
- while (!being_passed_) { |
- if (!cond_var_.SleepCS(&crit_sect_, timeout_ms)) { |
- return false; |
- } |
- } |
- being_passed_ = false; |
- cond_var_.Wake(); |
- return true; |
- } |
- |
- void SignalBatonAvailable() { |
- assert(!being_passed_); |
- being_passed_ = true; |
- cond_var_.Wake(); |
- } |
- |
- // Timeout extension: Wait for a limited time for someone else to |
- // take it, and take it if it's not taken. |
- // Returns true if resource is taken by someone else, false |
- // if it is taken back by the caller. |
- // This function must be called with both |giver_sect_| and |
- // |crit_sect_| held. |
- bool TakeBatonIfStillFree(int timeout_ms) { |
- bool not_timeout = true; |
- while (being_passed_ && not_timeout) { |
- not_timeout = cond_var_.SleepCS(&crit_sect_, timeout_ms); |
- // If we're woken up while variable is still held, we may have |
- // gotten a wakeup destined for a grabber thread. |
- // This situation is not treated specially here. |
- } |
- if (!being_passed_) |
- return true; |
- assert(!not_timeout); |
- being_passed_ = false; |
- return false; |
- } |
- |
- // Lock that ensures that there is only one thread in the active |
- // part of Pass() at a time. |
- // |giver_sect_| must always be acquired before |cond_var_|. |
- CriticalSectionWrapper giver_sect_; |
- // Lock that protects |being_passed_|. |
- CRITICAL_SECTION crit_sect_; |
- ConditionVariableEventWin cond_var_; |
- bool being_passed_; |
- // Statistics information: Number of successfull passes. |
- int pass_count_; |
-}; |
- |
-// Function that waits on a Baton, and passes it right back. |
-// We expect these calls never to time out. |
-bool WaitingRunFunction(void* obj) { |
- Baton* the_baton = static_cast<Baton*> (obj); |
- EXPECT_TRUE(the_baton->Grab(kLongWaitMs)); |
- EXPECT_TRUE(the_baton->Pass(kLongWaitMs)); |
- return true; |
-} |
- |
-class CondVarTest : public ::testing::Test { |
- public: |
- CondVarTest() : thread_(&WaitingRunFunction, &baton_, "CondVarTest") {} |
- |
- virtual void SetUp() { |
- thread_.Start(); |
- } |
- |
- virtual void TearDown() { |
- // We have to wake the thread in order to make it obey the stop order. |
- // But we don't know if the thread has completed the run function, so |
- // we don't know if it will exit before or after the Pass. |
- // Thus, we need to pin it down inside its Run function (between Grab |
- // and Pass). |
- ASSERT_TRUE(baton_.Pass(kShortWaitMs)); |
- ASSERT_TRUE(baton_.Grab(kShortWaitMs)); |
- thread_.Stop(); |
- } |
- |
- protected: |
- Baton baton_; |
- |
- private: |
- rtc::PlatformThread thread_; |
-}; |
- |
-// The SetUp and TearDown functions use condition variables. |
-// This test verifies those pieces in isolation. |
-// Disabled due to flakiness. See bug 4262 for details. |
-TEST_F(CondVarTest, DISABLED_InitFunctionsWork) { |
- // All relevant asserts are in the SetUp and TearDown functions. |
-} |
- |
-// This test verifies that one can use the baton multiple times. |
-TEST_F(CondVarTest, DISABLED_PassBatonMultipleTimes) { |
- const int kNumberOfRounds = 2; |
- for (int i = 0; i < kNumberOfRounds; ++i) { |
- ASSERT_TRUE(baton_.Pass(kShortWaitMs)); |
- ASSERT_TRUE(baton_.Grab(kShortWaitMs)); |
- } |
- EXPECT_EQ(2 * kNumberOfRounds, baton_.PassCount()); |
-} |
- |
-TEST(CondVarWaitTest, WaitingWaits) { |
- CRITICAL_SECTION crit_sect; |
- InitializeCriticalSection(&crit_sect); |
- ConditionVariableEventWin cond_var; |
- EnterCriticalSection(&crit_sect); |
- int64_t start_ms = rtc::TimeMillis(); |
- EXPECT_FALSE(cond_var.SleepCS(&crit_sect, kVeryShortWaitMs)); |
- int64_t end_ms = rtc::TimeMillis(); |
- EXPECT_LE(start_ms + kVeryShortWaitMs, end_ms) |
- << "actual elapsed:" << end_ms - start_ms; |
- LeaveCriticalSection(&crit_sect); |
- DeleteCriticalSection(&crit_sect); |
-} |
- |
-} // anonymous namespace |
- |
-} // namespace webrtc |
- |
-#endif // defined(WEBRTC_WIN) |