diff options
author | isaacs <i@izs.me> | 2012-03-28 19:51:38 -0700 |
---|---|---|
committer | isaacs <i@izs.me> | 2012-03-28 19:51:38 -0700 |
commit | 4b64542fe09477fc5c70e974eb1a78cdce755eb7 (patch) | |
tree | b4d4cdfd5b07efbdae51098b422fde7844ff4715 /deps/v8/src/platform-win32.cc | |
parent | 8a15147bc53849417f8737dd873877d497867c9f (diff) | |
download | node-new-4b64542fe09477fc5c70e974eb1a78cdce755eb7.tar.gz |
Upgrade V8 to 3.9.24.6
Diffstat (limited to 'deps/v8/src/platform-win32.cc')
-rw-r--r-- | deps/v8/src/platform-win32.cc | 67 |
1 files changed, 31 insertions, 36 deletions
diff --git a/deps/v8/src/platform-win32.cc b/deps/v8/src/platform-win32.cc index 53915c6c0e..2801b711bf 100644 --- a/deps/v8/src/platform-win32.cc +++ b/deps/v8/src/platform-win32.cc @@ -149,14 +149,14 @@ static Mutex* limit_mutex = NULL; #if defined(V8_TARGET_ARCH_IA32) static OS::MemCopyFunction memcopy_function = NULL; -static Mutex* memcopy_function_mutex = OS::CreateMutex(); +static LazyMutex memcopy_function_mutex = LAZY_MUTEX_INITIALIZER; // Defined in codegen-ia32.cc. OS::MemCopyFunction CreateMemCopyFunction(); // Copy memory area to disjoint memory area. void OS::MemCopy(void* dest, const void* src, size_t size) { if (memcopy_function == NULL) { - ScopedLock lock(memcopy_function_mutex); + ScopedLock lock(memcopy_function_mutex.Pointer()); if (memcopy_function == NULL) { OS::MemCopyFunction temp = CreateMemCopyFunction(); MemoryBarrier(); @@ -175,19 +175,16 @@ void OS::MemCopy(void* dest, const void* src, size_t size) { #ifdef _WIN64 typedef double (*ModuloFunction)(double, double); static ModuloFunction modulo_function = NULL; -static Mutex* modulo_function_mutex = OS::CreateMutex(); +V8_DECLARE_ONCE(modulo_function_init_once); // Defined in codegen-x64.cc. ModuloFunction CreateModuloFunction(); +void init_modulo_function() { + modulo_function = CreateModuloFunction(); +} + double modulo(double x, double y) { - if (modulo_function == NULL) { - ScopedLock lock(modulo_function_mutex); - if (modulo_function == NULL) { - ModuloFunction temp = CreateModuloFunction(); - MemoryBarrier(); - modulo_function = temp; - } - } + CallOnce(&modulo_function_init_once, &init_modulo_function); // Note: here we rely on dependent reads being ordered. This is true // on all architectures we currently support. return (*modulo_function)(x, y); @@ -208,27 +205,25 @@ double modulo(double x, double y) { #endif // _WIN64 -static Mutex* transcendental_function_mutex = OS::CreateMutex(); - -#define TRANSCENDENTAL_FUNCTION(name, type) \ -static TranscendentalFunction fast_##name##_function = NULL; \ -double fast_##name(double x) { \ - if (fast_##name##_function == NULL) { \ - ScopedLock lock(transcendental_function_mutex); \ - TranscendentalFunction temp = \ - CreateTranscendentalFunction(type); \ - MemoryBarrier(); \ - fast_##name##_function = temp; \ - } \ - return (*fast_##name##_function)(x); \ +#define UNARY_MATH_FUNCTION(name, generator) \ +static UnaryMathFunction fast_##name##_function = NULL; \ +V8_DECLARE_ONCE(fast_##name##_init_once); \ +void init_fast_##name##_function() { \ + fast_##name##_function = generator; \ +} \ +double fast_##name(double x) { \ + CallOnce(&fast_##name##_init_once, \ + &init_fast_##name##_function); \ + return (*fast_##name##_function)(x); \ } -TRANSCENDENTAL_FUNCTION(sin, TranscendentalCache::SIN) -TRANSCENDENTAL_FUNCTION(cos, TranscendentalCache::COS) -TRANSCENDENTAL_FUNCTION(tan, TranscendentalCache::TAN) -TRANSCENDENTAL_FUNCTION(log, TranscendentalCache::LOG) +UNARY_MATH_FUNCTION(sin, CreateTranscendentalFunction(TranscendentalCache::SIN)) +UNARY_MATH_FUNCTION(cos, CreateTranscendentalFunction(TranscendentalCache::COS)) +UNARY_MATH_FUNCTION(tan, CreateTranscendentalFunction(TranscendentalCache::TAN)) +UNARY_MATH_FUNCTION(log, CreateTranscendentalFunction(TranscendentalCache::LOG)) +UNARY_MATH_FUNCTION(sqrt, CreateSqrtFunction()) -#undef TRANSCENDENTAL_FUNCTION +#undef MATH_FUNCTION // ---------------------------------------------------------------------------- @@ -966,11 +961,11 @@ void OS::Sleep(int milliseconds) { void OS::Abort() { - if (!IsDebuggerPresent()) { + if (IsDebuggerPresent() || FLAG_break_on_abort) { + DebugBreak(); + } else { // Make the MSVCRT do a silent abort. raise(SIGABRT); - } else { - DebugBreak(); } } @@ -1961,7 +1956,7 @@ class SamplerThread : public Thread { interval_(interval) {} static void AddActiveSampler(Sampler* sampler) { - ScopedLock lock(mutex_); + ScopedLock lock(mutex_.Pointer()); SamplerRegistry::AddActiveSampler(sampler); if (instance_ == NULL) { instance_ = new SamplerThread(sampler->interval()); @@ -1972,7 +1967,7 @@ class SamplerThread : public Thread { } static void RemoveActiveSampler(Sampler* sampler) { - ScopedLock lock(mutex_); + ScopedLock lock(mutex_.Pointer()); SamplerRegistry::RemoveActiveSampler(sampler); if (SamplerRegistry::GetState() == SamplerRegistry::HAS_NO_SAMPLERS) { RuntimeProfiler::StopRuntimeProfilerThreadBeforeShutdown(instance_); @@ -2058,7 +2053,7 @@ class SamplerThread : public Thread { RuntimeProfilerRateLimiter rate_limiter_; // Protects the process wide state below. - static Mutex* mutex_; + static LazyMutex mutex_; static SamplerThread* instance_; private: @@ -2066,7 +2061,7 @@ class SamplerThread : public Thread { }; -Mutex* SamplerThread::mutex_ = OS::CreateMutex(); +LazyMutex SamplerThread::mutex_ = LAZY_MUTEX_INITIALIZER; SamplerThread* SamplerThread::instance_ = NULL; |