| Index: src/platform-macos.cc
|
| diff --git a/src/platform-macos.cc b/src/platform-macos.cc
|
| index 30e90bb6144a03b6852c32e9db80d88ecd933429..12a3e663f0c5d2d6bb31c910d63869ec162cbccd 100644
|
| --- a/src/platform-macos.cc
|
| +++ b/src/platform-macos.cc
|
| @@ -78,10 +78,6 @@ extern "C" {
|
| namespace v8 {
|
| namespace internal {
|
|
|
| -// 0 is never a valid thread id on MacOSX since a pthread_t is
|
| -// a pointer.
|
| -static const pthread_t kNoThread = (pthread_t) 0;
|
| -
|
|
|
| double ceiling(double x) {
|
| // Correct Mac OS X Leopard 'ceil' behavior.
|
| @@ -421,177 +417,6 @@ bool VirtualMemory::HasLazyCommits() {
|
| }
|
|
|
|
|
| -class Thread::PlatformData : public Malloced {
|
| - public:
|
| - PlatformData() : thread_(kNoThread) {}
|
| - pthread_t thread_; // Thread handle for pthread.
|
| -};
|
| -
|
| -
|
| -Thread::Thread(const Options& options)
|
| - : data_(new PlatformData),
|
| - stack_size_(options.stack_size()),
|
| - start_semaphore_(NULL) {
|
| - set_name(options.name());
|
| -}
|
| -
|
| -
|
| -Thread::~Thread() {
|
| - delete data_;
|
| -}
|
| -
|
| -
|
| -static void SetThreadName(const char* name) {
|
| - // pthread_setname_np is only available in 10.6 or later, so test
|
| - // for it at runtime.
|
| - int (*dynamic_pthread_setname_np)(const char*);
|
| - *reinterpret_cast<void**>(&dynamic_pthread_setname_np) =
|
| - dlsym(RTLD_DEFAULT, "pthread_setname_np");
|
| - if (!dynamic_pthread_setname_np)
|
| - return;
|
| -
|
| - // Mac OS X does not expose the length limit of the name, so hardcode it.
|
| - static const int kMaxNameLength = 63;
|
| - USE(kMaxNameLength);
|
| - ASSERT(Thread::kMaxThreadNameLength <= kMaxNameLength);
|
| - dynamic_pthread_setname_np(name);
|
| -}
|
| -
|
| -
|
| -static void* ThreadEntry(void* arg) {
|
| - Thread* thread = reinterpret_cast<Thread*>(arg);
|
| - // This is also initialized by the first argument to pthread_create() but we
|
| - // don't know which thread will run first (the original thread or the new
|
| - // one) so we initialize it here too.
|
| - thread->data()->thread_ = pthread_self();
|
| - SetThreadName(thread->name());
|
| - ASSERT(thread->data()->thread_ != kNoThread);
|
| - thread->NotifyStartedAndRun();
|
| - return NULL;
|
| -}
|
| -
|
| -
|
| -void Thread::set_name(const char* name) {
|
| - strncpy(name_, name, sizeof(name_));
|
| - name_[sizeof(name_) - 1] = '\0';
|
| -}
|
| -
|
| -
|
| -void Thread::Start() {
|
| - pthread_attr_t* attr_ptr = NULL;
|
| - pthread_attr_t attr;
|
| - if (stack_size_ > 0) {
|
| - pthread_attr_init(&attr);
|
| - pthread_attr_setstacksize(&attr, static_cast<size_t>(stack_size_));
|
| - attr_ptr = &attr;
|
| - }
|
| - pthread_create(&data_->thread_, attr_ptr, ThreadEntry, this);
|
| - ASSERT(data_->thread_ != kNoThread);
|
| -}
|
| -
|
| -
|
| -void Thread::Join() {
|
| - pthread_join(data_->thread_, NULL);
|
| -}
|
| -
|
| -
|
| -#ifdef V8_FAST_TLS_SUPPORTED
|
| -
|
| -static Atomic32 tls_base_offset_initialized = 0;
|
| -intptr_t kMacTlsBaseOffset = 0;
|
| -
|
| -// It's safe to do the initialization more that once, but it has to be
|
| -// done at least once.
|
| -static void InitializeTlsBaseOffset() {
|
| - const size_t kBufferSize = 128;
|
| - char buffer[kBufferSize];
|
| - size_t buffer_size = kBufferSize;
|
| - int ctl_name[] = { CTL_KERN , KERN_OSRELEASE };
|
| - if (sysctl(ctl_name, 2, buffer, &buffer_size, NULL, 0) != 0) {
|
| - V8_Fatal(__FILE__, __LINE__, "V8 failed to get kernel version");
|
| - }
|
| - // The buffer now contains a string of the form XX.YY.ZZ, where
|
| - // XX is the major kernel version component.
|
| - // Make sure the buffer is 0-terminated.
|
| - buffer[kBufferSize - 1] = '\0';
|
| - char* period_pos = strchr(buffer, '.');
|
| - *period_pos = '\0';
|
| - int kernel_version_major =
|
| - static_cast<int>(strtol(buffer, NULL, 10)); // NOLINT
|
| - // The constants below are taken from pthreads.s from the XNU kernel
|
| - // sources archive at www.opensource.apple.com.
|
| - if (kernel_version_major < 11) {
|
| - // 8.x.x (Tiger), 9.x.x (Leopard), 10.x.x (Snow Leopard) have the
|
| - // same offsets.
|
| -#if V8_HOST_ARCH_IA32
|
| - kMacTlsBaseOffset = 0x48;
|
| -#else
|
| - kMacTlsBaseOffset = 0x60;
|
| -#endif
|
| - } else {
|
| - // 11.x.x (Lion) changed the offset.
|
| - kMacTlsBaseOffset = 0;
|
| - }
|
| -
|
| - Release_Store(&tls_base_offset_initialized, 1);
|
| -}
|
| -
|
| -
|
| -static void CheckFastTls(Thread::LocalStorageKey key) {
|
| - void* expected = reinterpret_cast<void*>(0x1234CAFE);
|
| - Thread::SetThreadLocal(key, expected);
|
| - void* actual = Thread::GetExistingThreadLocal(key);
|
| - if (expected != actual) {
|
| - V8_Fatal(__FILE__, __LINE__,
|
| - "V8 failed to initialize fast TLS on current kernel");
|
| - }
|
| - Thread::SetThreadLocal(key, NULL);
|
| -}
|
| -
|
| -#endif // V8_FAST_TLS_SUPPORTED
|
| -
|
| -
|
| -Thread::LocalStorageKey Thread::CreateThreadLocalKey() {
|
| -#ifdef V8_FAST_TLS_SUPPORTED
|
| - bool check_fast_tls = false;
|
| - if (tls_base_offset_initialized == 0) {
|
| - check_fast_tls = true;
|
| - InitializeTlsBaseOffset();
|
| - }
|
| -#endif
|
| - pthread_key_t key;
|
| - int result = pthread_key_create(&key, NULL);
|
| - USE(result);
|
| - ASSERT(result == 0);
|
| - LocalStorageKey typed_key = static_cast<LocalStorageKey>(key);
|
| -#ifdef V8_FAST_TLS_SUPPORTED
|
| - // If we just initialized fast TLS support, make sure it works.
|
| - if (check_fast_tls) CheckFastTls(typed_key);
|
| -#endif
|
| - return typed_key;
|
| -}
|
| -
|
| -
|
| -void Thread::DeleteThreadLocalKey(LocalStorageKey key) {
|
| - pthread_key_t pthread_key = static_cast<pthread_key_t>(key);
|
| - int result = pthread_key_delete(pthread_key);
|
| - USE(result);
|
| - ASSERT(result == 0);
|
| -}
|
| -
|
| -
|
| -void* Thread::GetThreadLocal(LocalStorageKey key) {
|
| - pthread_key_t pthread_key = static_cast<pthread_key_t>(key);
|
| - return pthread_getspecific(pthread_key);
|
| -}
|
| -
|
| -
|
| -void Thread::SetThreadLocal(LocalStorageKey key, void* value) {
|
| - pthread_key_t pthread_key = static_cast<pthread_key_t>(key);
|
| - pthread_setspecific(pthread_key, value);
|
| -}
|
| -
|
| -
|
| class MacOSSemaphore : public Semaphore {
|
| public:
|
| explicit MacOSSemaphore(int count) {
|
|
|