| Index: base/thread_local_unittest.cc
|
| ===================================================================
|
| --- base/thread_local_unittest.cc (revision 70317)
|
| +++ base/thread_local_unittest.cc (working copy)
|
| @@ -1,159 +0,0 @@
|
| -// Copyright (c) 2010 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 "base/logging.h"
|
| -#include "base/threading/simple_thread.h"
|
| -#include "base/thread_local.h"
|
| -#include "base/waitable_event.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace {
|
| -
|
| -class ThreadLocalTesterBase : public base::DelegateSimpleThreadPool::Delegate {
|
| - public:
|
| - typedef base::ThreadLocalPointer<ThreadLocalTesterBase> TLPType;
|
| -
|
| - ThreadLocalTesterBase(TLPType* tlp, base::WaitableEvent* done)
|
| - : tlp_(tlp), done_(done) { }
|
| - ~ThreadLocalTesterBase() { }
|
| -
|
| - protected:
|
| - TLPType* tlp_;
|
| - base::WaitableEvent* done_;
|
| -};
|
| -
|
| -class SetThreadLocal : public ThreadLocalTesterBase {
|
| - public:
|
| - SetThreadLocal(TLPType* tlp, base::WaitableEvent* done)
|
| - : ThreadLocalTesterBase(tlp, done), val_(NULL) { }
|
| - ~SetThreadLocal() { }
|
| -
|
| - void set_value(ThreadLocalTesterBase* val) { val_ = val; }
|
| -
|
| - virtual void Run() {
|
| - DCHECK(!done_->IsSignaled());
|
| - tlp_->Set(val_);
|
| - done_->Signal();
|
| - }
|
| -
|
| - private:
|
| - ThreadLocalTesterBase* val_;
|
| -};
|
| -
|
| -class GetThreadLocal : public ThreadLocalTesterBase {
|
| - public:
|
| - GetThreadLocal(TLPType* tlp, base::WaitableEvent* done)
|
| - : ThreadLocalTesterBase(tlp, done), ptr_(NULL) { }
|
| - ~GetThreadLocal() { }
|
| -
|
| - void set_ptr(ThreadLocalTesterBase** ptr) { ptr_ = ptr; }
|
| -
|
| - virtual void Run() {
|
| - DCHECK(!done_->IsSignaled());
|
| - *ptr_ = tlp_->Get();
|
| - done_->Signal();
|
| - }
|
| -
|
| - private:
|
| - ThreadLocalTesterBase** ptr_;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -// In this test, we start 2 threads which will access a ThreadLocalPointer. We
|
| -// make sure the default is NULL, and the pointers are unique to the threads.
|
| -TEST(ThreadLocalTest, Pointer) {
|
| - base::DelegateSimpleThreadPool tp1("ThreadLocalTest tp1", 1);
|
| - base::DelegateSimpleThreadPool tp2("ThreadLocalTest tp1", 1);
|
| - tp1.Start();
|
| - tp2.Start();
|
| -
|
| - base::ThreadLocalPointer<ThreadLocalTesterBase> tlp;
|
| -
|
| - static ThreadLocalTesterBase* const kBogusPointer =
|
| - reinterpret_cast<ThreadLocalTesterBase*>(0x1234);
|
| -
|
| - ThreadLocalTesterBase* tls_val;
|
| - base::WaitableEvent done(true, false);
|
| -
|
| - GetThreadLocal getter(&tlp, &done);
|
| - getter.set_ptr(&tls_val);
|
| -
|
| - // Check that both threads defaulted to NULL.
|
| - tls_val = kBogusPointer;
|
| - done.Reset();
|
| - tp1.AddWork(&getter);
|
| - done.Wait();
|
| - EXPECT_EQ(static_cast<ThreadLocalTesterBase*>(NULL), tls_val);
|
| -
|
| - tls_val = kBogusPointer;
|
| - done.Reset();
|
| - tp2.AddWork(&getter);
|
| - done.Wait();
|
| - EXPECT_EQ(static_cast<ThreadLocalTesterBase*>(NULL), tls_val);
|
| -
|
| -
|
| - SetThreadLocal setter(&tlp, &done);
|
| - setter.set_value(kBogusPointer);
|
| -
|
| - // Have thread 1 set their pointer value to kBogusPointer.
|
| - done.Reset();
|
| - tp1.AddWork(&setter);
|
| - done.Wait();
|
| -
|
| - tls_val = NULL;
|
| - done.Reset();
|
| - tp1.AddWork(&getter);
|
| - done.Wait();
|
| - EXPECT_EQ(kBogusPointer, tls_val);
|
| -
|
| - // Make sure thread 2 is still NULL
|
| - tls_val = kBogusPointer;
|
| - done.Reset();
|
| - tp2.AddWork(&getter);
|
| - done.Wait();
|
| - EXPECT_EQ(static_cast<ThreadLocalTesterBase*>(NULL), tls_val);
|
| -
|
| - // Set thread 2 to kBogusPointer + 1.
|
| - setter.set_value(kBogusPointer + 1);
|
| -
|
| - done.Reset();
|
| - tp2.AddWork(&setter);
|
| - done.Wait();
|
| -
|
| - tls_val = NULL;
|
| - done.Reset();
|
| - tp2.AddWork(&getter);
|
| - done.Wait();
|
| - EXPECT_EQ(kBogusPointer + 1, tls_val);
|
| -
|
| - // Make sure thread 1 is still kBogusPointer.
|
| - tls_val = NULL;
|
| - done.Reset();
|
| - tp1.AddWork(&getter);
|
| - done.Wait();
|
| - EXPECT_EQ(kBogusPointer, tls_val);
|
| -
|
| - tp1.JoinAll();
|
| - tp2.JoinAll();
|
| -}
|
| -
|
| -TEST(ThreadLocalTest, Boolean) {
|
| - {
|
| - base::ThreadLocalBoolean tlb;
|
| - EXPECT_FALSE(tlb.Get());
|
| -
|
| - tlb.Set(false);
|
| - EXPECT_FALSE(tlb.Get());
|
| -
|
| - tlb.Set(true);
|
| - EXPECT_TRUE(tlb.Get());
|
| - }
|
| -
|
| - // Our slot should have been freed, we're all reset.
|
| - {
|
| - base::ThreadLocalBoolean tlb;
|
| - EXPECT_FALSE(tlb.Get());
|
| - }
|
| -}
|
|
|