| Index: mojo/edk/system/cond_var_unittest.cc
|
| diff --git a/mojo/edk/system/cond_var_unittest.cc b/mojo/edk/system/cond_var_unittest.cc
|
| deleted file mode 100644
|
| index 568da83b6d6db5c24b08ecdc83e71b6d00785ec8..0000000000000000000000000000000000000000
|
| --- a/mojo/edk/system/cond_var_unittest.cc
|
| +++ /dev/null
|
| @@ -1,170 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "mojo/edk/system/cond_var.h"
|
| -
|
| -#include <stdint.h>
|
| -#include <stdlib.h>
|
| -
|
| -#include <thread>
|
| -#include <type_traits>
|
| -#include <vector>
|
| -
|
| -#include "mojo/edk/system/mutex.h"
|
| -#include "mojo/edk/system/test/sleep.h"
|
| -#include "mojo/edk/system/test/stopwatch.h"
|
| -#include "mojo/edk/system/test/timeouts.h"
|
| -#include "mojo/public/cpp/system/macros.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace mojo {
|
| -namespace system {
|
| -namespace {
|
| -
|
| -// Sleeps for a "very small" amount of time.
|
| -void EpsilonRandomSleep() {
|
| - test::SleepMilliseconds(static_cast<unsigned>(rand()) % 20u);
|
| -}
|
| -
|
| -// We'll use |MojoDeadline| with |uint64_t| (for |CondVar::WaitWithTimeout()|'s
|
| -// timeout argument), though note that |WaitWithTimeout()| doesn't support
|
| -// |MOJO_DEADLINE_INDEFINITE|.
|
| -static_assert(std::is_same<uint64_t, MojoDeadline>::value,
|
| - "MojoDeadline isn't uint64_t!");
|
| -
|
| -TEST(CondVarTest, Basic) {
|
| - // Create/destroy.
|
| - { CondVar cv; }
|
| -
|
| - // Signal with no waiter.
|
| - {
|
| - CondVar cv;
|
| - cv.Signal();
|
| - cv.SignalAll();
|
| - }
|
| -
|
| - // Wait with a zero and with very short timeout.
|
| - {
|
| - Mutex mu;
|
| - CondVar cv;
|
| -
|
| - MutexLocker locker(&mu);
|
| -
|
| - // Note: Theoretically, pthreads is allowed to wake us up spuriously, in
|
| - // which case |WaitWithTimeout()| would return false. (This would also
|
| - // happen if we're interrupted, e.g., by ^Z.)
|
| - EXPECT_TRUE(cv.WaitWithTimeout(&mu, 0));
|
| - mu.AssertHeld();
|
| - EXPECT_TRUE(cv.WaitWithTimeout(&mu, test::DeadlineFromMilliseconds(1)));
|
| - mu.AssertHeld();
|
| - }
|
| -
|
| - // Wait using |Wait()| or |WaitWithTimeout()|, to be signaled by |Signal()| or
|
| - // |SignalAll()|.
|
| - for (size_t i = 0; i < 30; i++) {
|
| - Mutex mu;
|
| - CondVar cv;
|
| - bool condition = false;
|
| -
|
| - auto thread = std::thread([&mu, &cv, &condition]() {
|
| - EpsilonRandomSleep();
|
| -
|
| - MutexLocker locker(&mu);
|
| - condition = true;
|
| - if (rand() % 2 == 0)
|
| - cv.Signal();
|
| - else
|
| - cv.SignalAll();
|
| - });
|
| -
|
| - EpsilonRandomSleep();
|
| -
|
| - MutexLocker locker(&mu);
|
| - if (rand() % 2 == 0) {
|
| - while (!condition) {
|
| - cv.Wait(&mu);
|
| - mu.AssertHeld();
|
| - }
|
| - } else {
|
| - while (!condition) {
|
| - EXPECT_FALSE(cv.WaitWithTimeout(&mu, test::TinyTimeout()));
|
| - mu.AssertHeld();
|
| - }
|
| - }
|
| -
|
| - thread.join();
|
| - }
|
| -}
|
| -
|
| -TEST(CondVarTest, SignalAll) {
|
| - Mutex mu;
|
| - CondVar cv;
|
| - bool condition = false;
|
| -
|
| - for (size_t i = 0; i < 10; i++) {
|
| - for (size_t num_waiters = 1; num_waiters < 5; num_waiters++) {
|
| - std::vector<std::thread> threads;
|
| - for (size_t j = 0; j < num_waiters; j++) {
|
| - threads.push_back(std::thread([&mu, &cv, &condition]() {
|
| - EpsilonRandomSleep();
|
| -
|
| - MutexLocker locker(&mu);
|
| - if (rand() % 2 == 0) {
|
| - while (!condition) {
|
| - cv.Wait(&mu);
|
| - mu.AssertHeld();
|
| - }
|
| - } else {
|
| - while (!condition) {
|
| - EXPECT_FALSE(cv.WaitWithTimeout(&mu, test::TinyTimeout()));
|
| - mu.AssertHeld();
|
| - }
|
| - }
|
| - }));
|
| - }
|
| -
|
| - EpsilonRandomSleep();
|
| -
|
| - {
|
| - MutexLocker locker(&mu);
|
| - condition = true;
|
| - cv.SignalAll();
|
| - }
|
| -
|
| - for (auto& thread : threads)
|
| - thread.join();
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST(CondVarTest, Timeouts) {
|
| - static const unsigned kTestTimeoutsMs[] = {0, 10, 20, 40, 80, 160};
|
| -
|
| - test::Stopwatch stopwatch;
|
| -
|
| - Mutex mu;
|
| - CondVar cv;
|
| -
|
| - MutexLocker locker(&mu);
|
| -
|
| - for (size_t i = 0; i < MOJO_ARRAYSIZE(kTestTimeoutsMs); i++) {
|
| - uint64_t timeout = test::DeadlineFromMilliseconds(kTestTimeoutsMs[i]);
|
| -
|
| - stopwatch.Start();
|
| - // See note in CondVarTest.Basic about spurious wakeups.
|
| - EXPECT_TRUE(cv.WaitWithTimeout(&mu, timeout));
|
| - MojoDeadline elapsed = stopwatch.Elapsed();
|
| -
|
| - // It should time out after *at least* the specified amount of time.
|
| - EXPECT_GE(elapsed, timeout);
|
| - // But we expect that it should time out soon after that amount of time.
|
| - EXPECT_LT(elapsed, timeout + test::EpsilonTimeout());
|
| - }
|
| -}
|
| -
|
| -// TODO(vtl): Test that |Signal()| (usually) wakes only one waiter.
|
| -
|
| -} // namespace
|
| -} // namespace system
|
| -} // namespace mojo
|
|
|