| OLD | NEW | 
|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 // Platform-specific code for POSIX goes here. This is not a platform on its | 5 // Platform-specific code for POSIX goes here. This is not a platform on its | 
| 6 // own, but contains the parts which are the same across the POSIX platforms | 6 // own, but contains the parts which are the same across the POSIX platforms | 
| 7 // Linux, MacOS, FreeBSD, OpenBSD, NetBSD and QNX. | 7 // Linux, MacOS, FreeBSD, OpenBSD, NetBSD and QNX. | 
| 8 | 8 | 
| 9 #include <dlfcn.h> | 9 #include <dlfcn.h> | 
| 10 #include <errno.h> | 10 #include <errno.h> | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
| 40 #if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT) | 40 #if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT) | 
| 41 #define LOG_TAG "v8" | 41 #define LOG_TAG "v8" | 
| 42 #include <android/log.h>  // NOLINT | 42 #include <android/log.h>  // NOLINT | 
| 43 #endif | 43 #endif | 
| 44 | 44 | 
| 45 #include <cmath> | 45 #include <cmath> | 
| 46 #include <cstdlib> | 46 #include <cstdlib> | 
| 47 | 47 | 
| 48 #include "src/base/lazy-instance.h" | 48 #include "src/base/lazy-instance.h" | 
| 49 #include "src/base/macros.h" | 49 #include "src/base/macros.h" | 
| 50 #include "src/platform.h" | 50 #include "src/base/platform/platform.h" | 
| 51 #include "src/platform/time.h" | 51 #include "src/base/platform/time.h" | 
| 52 #include "src/utils/random-number-generator.h" | 52 #include "src/base/utils/random-number-generator.h" | 
| 53 | 53 | 
| 54 #ifdef V8_FAST_TLS_SUPPORTED | 54 #ifdef V8_FAST_TLS_SUPPORTED | 
| 55 #include "src/base/atomicops.h" | 55 #include "src/base/atomicops.h" | 
| 56 #endif | 56 #endif | 
| 57 | 57 | 
| 58 namespace v8 { | 58 namespace v8 { | 
| 59 namespace internal { | 59 namespace base { | 
| 60 | 60 | 
| 61 namespace { | 61 namespace { | 
| 62 | 62 | 
| 63 // 0 is never a valid thread id. | 63 // 0 is never a valid thread id. | 
| 64 const pthread_t kNoThread = (pthread_t) 0; | 64 const pthread_t kNoThread = (pthread_t) 0; | 
| 65 | 65 | 
| 66 bool g_hard_abort = false; | 66 bool g_hard_abort = false; | 
| 67 | 67 | 
| 68 const char* g_gc_fake_mmap = NULL; | 68 const char* g_gc_fake_mmap = NULL; | 
| 69 | 69 | 
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 192 void OS::Guard(void* address, const size_t size) { | 192 void OS::Guard(void* address, const size_t size) { | 
| 193 #if V8_OS_CYGWIN | 193 #if V8_OS_CYGWIN | 
| 194   DWORD oldprotect; | 194   DWORD oldprotect; | 
| 195   VirtualProtect(address, size, PAGE_NOACCESS, &oldprotect); | 195   VirtualProtect(address, size, PAGE_NOACCESS, &oldprotect); | 
| 196 #else | 196 #else | 
| 197   mprotect(address, size, PROT_NONE); | 197   mprotect(address, size, PROT_NONE); | 
| 198 #endif | 198 #endif | 
| 199 } | 199 } | 
| 200 | 200 | 
| 201 | 201 | 
| 202 static base::LazyInstance<RandomNumberGenerator>::type | 202 static LazyInstance<RandomNumberGenerator>::type | 
| 203     platform_random_number_generator = LAZY_INSTANCE_INITIALIZER; | 203     platform_random_number_generator = LAZY_INSTANCE_INITIALIZER; | 
| 204 | 204 | 
| 205 | 205 | 
| 206 void OS::Initialize(int64_t random_seed, bool hard_abort, | 206 void OS::Initialize(int64_t random_seed, bool hard_abort, | 
| 207                     const char* const gc_fake_mmap) { | 207                     const char* const gc_fake_mmap) { | 
| 208   if (random_seed) { | 208   if (random_seed) { | 
| 209     platform_random_number_generator.Pointer()->SetSeed(random_seed); | 209     platform_random_number_generator.Pointer()->SetSeed(random_seed); | 
| 210   } | 210   } | 
| 211   g_hard_abort = hard_abort; | 211   g_hard_abort = hard_abort; | 
| 212   g_gc_fake_mmap = gc_fake_mmap; | 212   g_gc_fake_mmap = gc_fake_mmap; | 
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 619   intptr_t ptr_key = static_cast<intptr_t>(local_key); | 619   intptr_t ptr_key = static_cast<intptr_t>(local_key); | 
| 620   return reinterpret_cast<pthread_key_t>(ptr_key); | 620   return reinterpret_cast<pthread_key_t>(ptr_key); | 
| 621 #else | 621 #else | 
| 622   return static_cast<pthread_key_t>(local_key); | 622   return static_cast<pthread_key_t>(local_key); | 
| 623 #endif | 623 #endif | 
| 624 } | 624 } | 
| 625 | 625 | 
| 626 | 626 | 
| 627 #ifdef V8_FAST_TLS_SUPPORTED | 627 #ifdef V8_FAST_TLS_SUPPORTED | 
| 628 | 628 | 
| 629 static base::Atomic32 tls_base_offset_initialized = 0; | 629 static Atomic32 tls_base_offset_initialized = 0; | 
| 630 intptr_t kMacTlsBaseOffset = 0; | 630 intptr_t kMacTlsBaseOffset = 0; | 
| 631 | 631 | 
| 632 // It's safe to do the initialization more that once, but it has to be | 632 // It's safe to do the initialization more that once, but it has to be | 
| 633 // done at least once. | 633 // done at least once. | 
| 634 static void InitializeTlsBaseOffset() { | 634 static void InitializeTlsBaseOffset() { | 
| 635   const size_t kBufferSize = 128; | 635   const size_t kBufferSize = 128; | 
| 636   char buffer[kBufferSize]; | 636   char buffer[kBufferSize]; | 
| 637   size_t buffer_size = kBufferSize; | 637   size_t buffer_size = kBufferSize; | 
| 638   int ctl_name[] = { CTL_KERN , KERN_OSRELEASE }; | 638   int ctl_name[] = { CTL_KERN , KERN_OSRELEASE }; | 
| 639   if (sysctl(ctl_name, 2, buffer, &buffer_size, NULL, 0) != 0) { | 639   if (sysctl(ctl_name, 2, buffer, &buffer_size, NULL, 0) != 0) { | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 655 #if V8_HOST_ARCH_IA32 | 655 #if V8_HOST_ARCH_IA32 | 
| 656     kMacTlsBaseOffset = 0x48; | 656     kMacTlsBaseOffset = 0x48; | 
| 657 #else | 657 #else | 
| 658     kMacTlsBaseOffset = 0x60; | 658     kMacTlsBaseOffset = 0x60; | 
| 659 #endif | 659 #endif | 
| 660   } else { | 660   } else { | 
| 661     // 11.x.x (Lion) changed the offset. | 661     // 11.x.x (Lion) changed the offset. | 
| 662     kMacTlsBaseOffset = 0; | 662     kMacTlsBaseOffset = 0; | 
| 663   } | 663   } | 
| 664 | 664 | 
| 665   base::Release_Store(&tls_base_offset_initialized, 1); | 665   Release_Store(&tls_base_offset_initialized, 1); | 
| 666 } | 666 } | 
| 667 | 667 | 
| 668 | 668 | 
| 669 static void CheckFastTls(Thread::LocalStorageKey key) { | 669 static void CheckFastTls(Thread::LocalStorageKey key) { | 
| 670   void* expected = reinterpret_cast<void*>(0x1234CAFE); | 670   void* expected = reinterpret_cast<void*>(0x1234CAFE); | 
| 671   Thread::SetThreadLocal(key, expected); | 671   Thread::SetThreadLocal(key, expected); | 
| 672   void* actual = Thread::GetExistingThreadLocal(key); | 672   void* actual = Thread::GetExistingThreadLocal(key); | 
| 673   if (expected != actual) { | 673   if (expected != actual) { | 
| 674     V8_Fatal(__FILE__, __LINE__, | 674     V8_Fatal(__FILE__, __LINE__, | 
| 675              "V8 failed to initialize fast TLS on current kernel"); | 675              "V8 failed to initialize fast TLS on current kernel"); | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 716 | 716 | 
| 717 | 717 | 
| 718 void Thread::SetThreadLocal(LocalStorageKey key, void* value) { | 718 void Thread::SetThreadLocal(LocalStorageKey key, void* value) { | 
| 719   pthread_key_t pthread_key = LocalKeyToPthreadKey(key); | 719   pthread_key_t pthread_key = LocalKeyToPthreadKey(key); | 
| 720   int result = pthread_setspecific(pthread_key, value); | 720   int result = pthread_setspecific(pthread_key, value); | 
| 721   ASSERT_EQ(0, result); | 721   ASSERT_EQ(0, result); | 
| 722   USE(result); | 722   USE(result); | 
| 723 } | 723 } | 
| 724 | 724 | 
| 725 | 725 | 
| 726 } }  // namespace v8::internal | 726 } }  // namespace v8::base | 
| OLD | NEW | 
|---|