1// Copyright 2011 the V8 project authors. All rights reserved.
2//
3// Tests of fast TLS support.
4
5#include "v8.h"
6
7#include "cctest.h"
8#include "checks.h"
9#include "platform.h"
10
11using v8::internal::Thread;
12
13static const int kValueCount = 128;
14
15static Thread::LocalStorageKey keys[kValueCount];
16
17static void* GetValue(int num) {
18  return reinterpret_cast<void*>(static_cast<intptr_t>(num + 1));
19}
20
21static void DoTest() {
22  for (int i = 0; i < kValueCount; i++) {
23    CHECK(!Thread::HasThreadLocal(keys[i]));
24  }
25  for (int i = 0; i < kValueCount; i++) {
26    Thread::SetThreadLocal(keys[i], GetValue(i));
27  }
28  for (int i = 0; i < kValueCount; i++) {
29    CHECK(Thread::HasThreadLocal(keys[i]));
30  }
31  for (int i = 0; i < kValueCount; i++) {
32    CHECK_EQ(GetValue(i), Thread::GetThreadLocal(keys[i]));
33    CHECK_EQ(GetValue(i), Thread::GetExistingThreadLocal(keys[i]));
34  }
35  for (int i = 0; i < kValueCount; i++) {
36    Thread::SetThreadLocal(keys[i], GetValue(kValueCount - i - 1));
37  }
38  for (int i = 0; i < kValueCount; i++) {
39    CHECK(Thread::HasThreadLocal(keys[i]));
40  }
41  for (int i = 0; i < kValueCount; i++) {
42    CHECK_EQ(GetValue(kValueCount - i - 1),
43             Thread::GetThreadLocal(keys[i]));
44    CHECK_EQ(GetValue(kValueCount - i - 1),
45             Thread::GetExistingThreadLocal(keys[i]));
46  }
47}
48
49class TestThread : public Thread {
50 public:
51  TestThread() : Thread("TestThread") {}
52
53  virtual void Run() {
54    DoTest();
55  }
56};
57
58TEST(FastTLS) {
59  for (int i = 0; i < kValueCount; i++) {
60    keys[i] = Thread::CreateThreadLocalKey();
61  }
62  DoTest();
63  TestThread thread;
64  thread.Start();
65  thread.Join();
66}
67