| Index: content/common/one_writer_seqlock_unittest.cc
|
| diff --git a/content/common/one_writer_seqlock_unittest.cc b/content/common/one_writer_seqlock_unittest.cc
|
| deleted file mode 100644
|
| index 84d5156a7bd6fad617e015519637858593740067..0000000000000000000000000000000000000000
|
| --- a/content/common/one_writer_seqlock_unittest.cc
|
| +++ /dev/null
|
| @@ -1,105 +0,0 @@
|
| -// Copyright (c) 2011 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 "content/common/one_writer_seqlock.h"
|
| -
|
| -#include <stdlib.h>
|
| -
|
| -#include "base/atomic_ref_count.h"
|
| -#include "base/macros.h"
|
| -#include "base/third_party/dynamic_annotations/dynamic_annotations.h"
|
| -#include "base/threading/platform_thread.h"
|
| -#include "build/build_config.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace base {
|
| -
|
| -// Basic test to make sure that basic operation works correctly.
|
| -
|
| -struct TestData {
|
| - unsigned a, b, c;
|
| -};
|
| -
|
| -class BasicSeqLockTestThread : public PlatformThread::Delegate {
|
| - public:
|
| - BasicSeqLockTestThread() {}
|
| -
|
| - void Init(
|
| - content::OneWriterSeqLock* seqlock,
|
| - TestData* data,
|
| - base::subtle::Atomic32* ready) {
|
| - seqlock_ = seqlock;
|
| - data_ = data;
|
| - ready_ = ready;
|
| - }
|
| - void ThreadMain() override {
|
| - while (AtomicRefCountIsZero(ready_)) {
|
| - PlatformThread::YieldCurrentThread();
|
| - }
|
| -
|
| - for (unsigned i = 0; i < 1000; ++i) {
|
| - TestData copy;
|
| - base::subtle::Atomic32 version;
|
| - do {
|
| - version = seqlock_->ReadBegin();
|
| - copy = *data_;
|
| - } while (seqlock_->ReadRetry(version));
|
| -
|
| - EXPECT_EQ(copy.a + 100, copy.b);
|
| - EXPECT_EQ(copy.c, copy.b + copy.a);
|
| - }
|
| -
|
| - AtomicRefCountDec(ready_);
|
| - }
|
| -
|
| - private:
|
| - content::OneWriterSeqLock* seqlock_;
|
| - TestData* data_;
|
| - base::AtomicRefCount* ready_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(BasicSeqLockTestThread);
|
| -};
|
| -
|
| -#if defined(OS_ANDROID)
|
| -#define MAYBE_ManyThreads FLAKY_ManyThreads
|
| -#else
|
| -#define MAYBE_ManyThreads ManyThreads
|
| -#endif
|
| -TEST(OneWriterSeqLockTest, MAYBE_ManyThreads) {
|
| - content::OneWriterSeqLock seqlock;
|
| - TestData data = { 0, 0, 0 };
|
| - base::AtomicRefCount ready = 0;
|
| -
|
| - ANNOTATE_BENIGN_RACE_SIZED(&data, sizeof(data), "Racey reads are discarded");
|
| -
|
| - static const unsigned kNumReaderThreads = 10;
|
| - BasicSeqLockTestThread threads[kNumReaderThreads];
|
| - PlatformThreadHandle handles[kNumReaderThreads];
|
| -
|
| - for (unsigned i = 0; i < kNumReaderThreads; ++i)
|
| - threads[i].Init(&seqlock, &data, &ready);
|
| - for (unsigned i = 0; i < kNumReaderThreads; ++i)
|
| - ASSERT_TRUE(PlatformThread::Create(0, &threads[i], &handles[i]));
|
| -
|
| - // The main thread is the writer, and the spawned are readers.
|
| - unsigned counter = 0;
|
| - for (;;) {
|
| - seqlock.WriteBegin();
|
| - data.a = counter++;
|
| - data.b = data.a + 100;
|
| - data.c = data.b + data.a;
|
| - seqlock.WriteEnd();
|
| -
|
| - if (counter == 1)
|
| - base::AtomicRefCountIncN(&ready, kNumReaderThreads);
|
| -
|
| - if (AtomicRefCountIsZero(&ready))
|
| - break;
|
| - }
|
| -
|
| - for (unsigned i = 0; i < kNumReaderThreads; ++i)
|
| - PlatformThread::Join(handles[i]);
|
| -}
|
| -
|
| -} // namespace base
|
|
|