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 16#if V8_OS_ANDROID 17#define DISABLE_ON_ANDROID(Name) DISABLED_##Name 18#else 19#define DISABLE_ON_ANDROID(Name) Name 20#endif 21 22namespace v8 { 23namespace base { 24 25TEST(OS, GetCurrentProcessId) { 26#if V8_OS_POSIX 27 EXPECT_EQ(static_cast<int>(getpid()), OS::GetCurrentProcessId()); 28#endif 29 30#if V8_OS_WIN 31 EXPECT_EQ(static_cast<int>(::GetCurrentProcessId()), 32 OS::GetCurrentProcessId()); 33#endif 34} 35 36 37namespace { 38 39class ThreadLocalStorageTest : public Thread, public ::testing::Test { 40 public: 41 ThreadLocalStorageTest() : Thread(Options("ThreadLocalStorageTest")) { 42 for (size_t i = 0; i < arraysize(keys_); ++i) { 43 keys_[i] = Thread::CreateThreadLocalKey(); 44 } 45 } 46 ~ThreadLocalStorageTest() { 47 for (size_t i = 0; i < arraysize(keys_); ++i) { 48 Thread::DeleteThreadLocalKey(keys_[i]); 49 } 50 } 51 52 void Run() final { 53 for (size_t i = 0; i < arraysize(keys_); i++) { 54 CHECK(!Thread::HasThreadLocal(keys_[i])); 55 } 56 for (size_t i = 0; i < arraysize(keys_); i++) { 57 Thread::SetThreadLocal(keys_[i], GetValue(i)); 58 } 59 for (size_t i = 0; i < arraysize(keys_); i++) { 60 CHECK(Thread::HasThreadLocal(keys_[i])); 61 } 62 for (size_t i = 0; i < arraysize(keys_); i++) { 63 CHECK_EQ(GetValue(i), Thread::GetThreadLocal(keys_[i])); 64 CHECK_EQ(GetValue(i), Thread::GetExistingThreadLocal(keys_[i])); 65 } 66 for (size_t i = 0; i < arraysize(keys_); i++) { 67 Thread::SetThreadLocal(keys_[i], GetValue(arraysize(keys_) - i - 1)); 68 } 69 for (size_t i = 0; i < arraysize(keys_); i++) { 70 CHECK(Thread::HasThreadLocal(keys_[i])); 71 } 72 for (size_t i = 0; i < arraysize(keys_); i++) { 73 CHECK_EQ(GetValue(arraysize(keys_) - i - 1), 74 Thread::GetThreadLocal(keys_[i])); 75 CHECK_EQ(GetValue(arraysize(keys_) - i - 1), 76 Thread::GetExistingThreadLocal(keys_[i])); 77 } 78 } 79 80 private: 81 static void* GetValue(size_t x) { 82 return bit_cast<void*>(static_cast<uintptr_t>(x + 1)); 83 } 84 85 // Older versions of Android have fewer TLS slots (nominally 64, but the 86 // system uses "about 5 of them" itself). 87 Thread::LocalStorageKey keys_[32]; 88}; 89 90} // namespace 91 92 93TEST_F(ThreadLocalStorageTest, DoTest) { 94 Run(); 95 Start(); 96 Join(); 97} 98 99} // namespace base 100} // namespace v8 101