| Index: rlz/lib/recursive_lock_unittest.cc
|
| diff --git a/rlz/lib/recursive_lock_unittest.cc b/rlz/lib/recursive_lock_unittest.cc
|
| deleted file mode 100644
|
| index 916af7f327de85f6dfc0ce0206779c4c8d9c9eaa..0000000000000000000000000000000000000000
|
| --- a/rlz/lib/recursive_lock_unittest.cc
|
| +++ /dev/null
|
| @@ -1,234 +0,0 @@
|
| -// Copyright (c) 2012 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 "rlz/lib/recursive_lock.h"
|
| -
|
| -#include <stdlib.h>
|
| -
|
| -#include "base/compiler_specific.h"
|
| -#include "base/threading/platform_thread.h"
|
| -#include "base/time.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using base::kNullThreadHandle;
|
| -using base::PlatformThread;
|
| -using base::PlatformThreadHandle;
|
| -using base::TimeDelta;
|
| -
|
| -namespace rlz_lib {
|
| -
|
| -// Basic test to make sure that Acquire()/Release() don't crash.
|
| -class BasicLockTestThread : public PlatformThread::Delegate {
|
| - public:
|
| - BasicLockTestThread(RecursiveLock* lock) : lock_(lock), acquired_(0) {}
|
| -
|
| - virtual void ThreadMain() OVERRIDE {
|
| - for (int i = 0; i < 10; i++) {
|
| - lock_->Acquire();
|
| - acquired_++;
|
| - lock_->Release();
|
| - }
|
| - for (int i = 0; i < 10; i++) {
|
| - lock_->Acquire();
|
| - acquired_++;
|
| - PlatformThread::Sleep(TimeDelta::FromMilliseconds(rand() % 20));
|
| - lock_->Release();
|
| - }
|
| - }
|
| -
|
| - int acquired() const { return acquired_; }
|
| -
|
| - private:
|
| - RecursiveLock* lock_;
|
| - int acquired_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(BasicLockTestThread);
|
| -};
|
| -
|
| -TEST(RecursiveLockTest, Basic) {
|
| - RecursiveLock lock;
|
| - BasicLockTestThread thread(&lock);
|
| - PlatformThreadHandle handle = kNullThreadHandle;
|
| -
|
| - ASSERT_TRUE(PlatformThread::Create(0, &thread, &handle));
|
| -
|
| - int acquired = 0;
|
| - for (int i = 0; i < 5; i++) {
|
| - lock.Acquire();
|
| - acquired++;
|
| - lock.Release();
|
| - }
|
| - for (int i = 0; i < 10; i++) {
|
| - lock.Acquire();
|
| - acquired++;
|
| - PlatformThread::Sleep(TimeDelta::FromMilliseconds(rand() % 20));
|
| - lock.Release();
|
| - }
|
| - for (int i = 0; i < 5; i++) {
|
| - lock.Acquire();
|
| - acquired++;
|
| - PlatformThread::Sleep(TimeDelta::FromMilliseconds(rand() % 20));
|
| - lock.Release();
|
| - }
|
| -
|
| - PlatformThread::Join(handle);
|
| -
|
| - EXPECT_EQ(acquired, 20);
|
| - EXPECT_EQ(thread.acquired(), 20);
|
| -}
|
| -
|
| -// Tests that locks are actually exclusive.
|
| -class MutexLockTestThread : public PlatformThread::Delegate {
|
| - public:
|
| - MutexLockTestThread(RecursiveLock* lock, int* value)
|
| - : lock_(lock),
|
| - value_(value) {
|
| - }
|
| -
|
| - // Static helper which can also be called from the main thread.
|
| - static void DoStuff(RecursiveLock* lock, int* value) {
|
| - for (int i = 0; i < 40; i++) {
|
| - lock->Acquire();
|
| - int v = *value;
|
| - PlatformThread::Sleep(TimeDelta::FromMilliseconds(rand() % 10));
|
| - *value = v + 1;
|
| - lock->Release();
|
| - }
|
| - }
|
| -
|
| - virtual void ThreadMain() OVERRIDE {
|
| - DoStuff(lock_, value_);
|
| - }
|
| -
|
| - private:
|
| - RecursiveLock* lock_;
|
| - int* value_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(MutexLockTestThread);
|
| -};
|
| -
|
| -TEST(RecursiveLockTest, MutexTwoThreads) {
|
| - RecursiveLock lock;
|
| - int value = 0;
|
| -
|
| - MutexLockTestThread thread(&lock, &value);
|
| - PlatformThreadHandle handle = kNullThreadHandle;
|
| -
|
| - ASSERT_TRUE(PlatformThread::Create(0, &thread, &handle));
|
| -
|
| - MutexLockTestThread::DoStuff(&lock, &value);
|
| -
|
| - PlatformThread::Join(handle);
|
| -
|
| - EXPECT_EQ(2 * 40, value);
|
| -}
|
| -
|
| -TEST(RecursiveLockTest, MutexFourThreads) {
|
| - RecursiveLock lock;
|
| - int value = 0;
|
| -
|
| - MutexLockTestThread thread1(&lock, &value);
|
| - MutexLockTestThread thread2(&lock, &value);
|
| - MutexLockTestThread thread3(&lock, &value);
|
| - PlatformThreadHandle handle1 = kNullThreadHandle;
|
| - PlatformThreadHandle handle2 = kNullThreadHandle;
|
| - PlatformThreadHandle handle3 = kNullThreadHandle;
|
| -
|
| - ASSERT_TRUE(PlatformThread::Create(0, &thread1, &handle1));
|
| - ASSERT_TRUE(PlatformThread::Create(0, &thread2, &handle2));
|
| - ASSERT_TRUE(PlatformThread::Create(0, &thread3, &handle3));
|
| -
|
| - MutexLockTestThread::DoStuff(&lock, &value);
|
| -
|
| - PlatformThread::Join(handle1);
|
| - PlatformThread::Join(handle2);
|
| - PlatformThread::Join(handle3);
|
| -
|
| - EXPECT_EQ(4 * 40, value);
|
| -}
|
| -
|
| -// Tests that locks are recursive.
|
| -class MutexRecursiveLockTestThread : public PlatformThread::Delegate {
|
| - public:
|
| - MutexRecursiveLockTestThread(RecursiveLock* lock, int* value)
|
| - : lock_(lock),
|
| - value_(value) {
|
| - }
|
| -
|
| - // Static helper which can also be called from the main thread.
|
| - static void DoStuff(RecursiveLock* lock, int* value) {
|
| - for (int i = 0; i < 20; i++) {
|
| - // First lock.
|
| - lock->Acquire();
|
| - int v = *value;
|
| - PlatformThread::Sleep(TimeDelta::FromMilliseconds(rand() % 10));
|
| - *value = v + 1;
|
| - {
|
| - // Recursive lock.
|
| - lock->Acquire();
|
| - int v = *value;
|
| - PlatformThread::Sleep(TimeDelta::FromMilliseconds(rand() % 10));
|
| - *value = v + 1;
|
| - lock->Release();
|
| - }
|
| - v = *value;
|
| - PlatformThread::Sleep(TimeDelta::FromMilliseconds(rand() % 10));
|
| - *value = v + 1;
|
| - lock->Release();
|
| - }
|
| - }
|
| -
|
| - virtual void ThreadMain() OVERRIDE {
|
| - DoStuff(lock_, value_);
|
| - }
|
| -
|
| - private:
|
| - RecursiveLock* lock_;
|
| - int* value_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(MutexRecursiveLockTestThread);
|
| -};
|
| -
|
| -
|
| -TEST(RecursiveLockTest, MutexTwoThreadsRecursive) {
|
| - RecursiveLock lock;
|
| - int value = 0;
|
| -
|
| - MutexRecursiveLockTestThread thread(&lock, &value);
|
| - PlatformThreadHandle handle = kNullThreadHandle;
|
| -
|
| - ASSERT_TRUE(PlatformThread::Create(0, &thread, &handle));
|
| -
|
| - MutexRecursiveLockTestThread::DoStuff(&lock, &value);
|
| -
|
| - PlatformThread::Join(handle);
|
| -
|
| - EXPECT_EQ(2 * 60, value);
|
| -}
|
| -
|
| -TEST(RecursiveLockTest, MutexFourThreadsRecursive) {
|
| - RecursiveLock lock;
|
| - int value = 0;
|
| -
|
| - MutexRecursiveLockTestThread thread1(&lock, &value);
|
| - MutexRecursiveLockTestThread thread2(&lock, &value);
|
| - MutexRecursiveLockTestThread thread3(&lock, &value);
|
| - PlatformThreadHandle handle1 = kNullThreadHandle;
|
| - PlatformThreadHandle handle2 = kNullThreadHandle;
|
| - PlatformThreadHandle handle3 = kNullThreadHandle;
|
| -
|
| - ASSERT_TRUE(PlatformThread::Create(0, &thread1, &handle1));
|
| - ASSERT_TRUE(PlatformThread::Create(0, &thread2, &handle2));
|
| - ASSERT_TRUE(PlatformThread::Create(0, &thread3, &handle3));
|
| -
|
| - MutexRecursiveLockTestThread::DoStuff(&lock, &value);
|
| -
|
| - PlatformThread::Join(handle1);
|
| - PlatformThread::Join(handle2);
|
| - PlatformThread::Join(handle3);
|
| -
|
| - EXPECT_EQ(4 * 60, value);
|
| -}
|
| -
|
| -} // namespace rlz_lib
|
|
|