1// Copyright 2014 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "src/base/platform/platform.h"
6
7#if V8_OS_POSIX
8#include <unistd.h>  // NOLINT
9#endif
10
11#if V8_OS_WIN
12#include "src/base/win32-headers.h"
13#endif
14#include "testing/gtest/include/gtest/gtest.h"
15
16namespace v8 {
17namespace base {
18
19TEST(OS, GetCurrentProcessId) {
20#if V8_OS_POSIX
21  EXPECT_EQ(static_cast<int>(getpid()), OS::GetCurrentProcessId());
22#endif
23
24#if V8_OS_WIN
25  EXPECT_EQ(static_cast<int>(::GetCurrentProcessId()),
26            OS::GetCurrentProcessId());
27#endif
28}
29
30
31namespace {
32
33class SelfJoinThread FINAL : public Thread {
34 public:
35  SelfJoinThread() : Thread(Options("SelfJoinThread")) {}
36  virtual void Run() OVERRIDE { Join(); }
37};
38
39}  // namespace
40
41
42TEST(Thread, SelfJoin) {
43  SelfJoinThread thread;
44  thread.Start();
45  thread.Join();
46}
47
48
49namespace {
50
51class ThreadLocalStorageTest : public Thread, public ::testing::Test {
52 public:
53  ThreadLocalStorageTest() : Thread(Options("ThreadLocalStorageTest")) {
54    for (size_t i = 0; i < arraysize(keys_); ++i) {
55      keys_[i] = Thread::CreateThreadLocalKey();
56    }
57  }
58  ~ThreadLocalStorageTest() {
59    for (size_t i = 0; i < arraysize(keys_); ++i) {
60      Thread::DeleteThreadLocalKey(keys_[i]);
61    }
62  }
63
64  virtual void Run() FINAL OVERRIDE {
65    for (size_t i = 0; i < arraysize(keys_); i++) {
66      CHECK(!Thread::HasThreadLocal(keys_[i]));
67    }
68    for (size_t i = 0; i < arraysize(keys_); i++) {
69      Thread::SetThreadLocal(keys_[i], GetValue(i));
70    }
71    for (size_t i = 0; i < arraysize(keys_); i++) {
72      CHECK(Thread::HasThreadLocal(keys_[i]));
73    }
74    for (size_t i = 0; i < arraysize(keys_); i++) {
75      CHECK_EQ(GetValue(i), Thread::GetThreadLocal(keys_[i]));
76      CHECK_EQ(GetValue(i), Thread::GetExistingThreadLocal(keys_[i]));
77    }
78    for (size_t i = 0; i < arraysize(keys_); i++) {
79      Thread::SetThreadLocal(keys_[i], GetValue(arraysize(keys_) - i - 1));
80    }
81    for (size_t i = 0; i < arraysize(keys_); i++) {
82      CHECK(Thread::HasThreadLocal(keys_[i]));
83    }
84    for (size_t i = 0; i < arraysize(keys_); i++) {
85      CHECK_EQ(GetValue(arraysize(keys_) - i - 1),
86               Thread::GetThreadLocal(keys_[i]));
87      CHECK_EQ(GetValue(arraysize(keys_) - i - 1),
88               Thread::GetExistingThreadLocal(keys_[i]));
89    }
90  }
91
92 private:
93  static void* GetValue(size_t x) {
94    return reinterpret_cast<void*>(static_cast<uintptr_t>(x + 1));
95  }
96
97  Thread::LocalStorageKey keys_[256];
98};
99
100}  // namespace
101
102
103TEST_F(ThreadLocalStorageTest, DoTest) {
104  Run();
105  Start();
106  Join();
107}
108
109}  // namespace base
110}  // namespace v8
111