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