Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(600)

Unified Diff: webrtc/system_wrappers/source/condition_variable_unittest.cc

Issue 2790533002: Remove ALL usage of CriticalSectionWrapper. (Closed)
Patch Set: remove winXP rw_lock include Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)

Powered by Google App Engine
This is Rietveld 408576698