Index: src/isolate.cc |
diff --git a/src/isolate.cc b/src/isolate.cc |
index 625cc56727d72e9ad3f418fe5dce575c560613f9..bf9b345049ed7c6668c54891bd97c6a8c7b8665f 100644 |
--- a/src/isolate.cc |
+++ b/src/isolate.cc |
@@ -38,7 +38,6 @@ |
#include "heap-profiler.h" |
#include "hydrogen.h" |
#include "isolate.h" |
-#include "lazy-instance.h" |
#include "lithium-allocator.h" |
#include "log.h" |
#include "messages.h" |
@@ -57,31 +56,6 @@ |
namespace v8 { |
namespace internal { |
-struct GlobalState { |
- Thread::LocalStorageKey per_isolate_thread_data_key; |
- Thread::LocalStorageKey isolate_key; |
- Thread::LocalStorageKey thread_id_key; |
- Isolate* default_isolate; |
- Isolate::ThreadDataTable* thread_data_table; |
- Mutex* mutex; |
-}; |
- |
-struct InitializeGlobalState { |
- static void Construct(GlobalState* state) { |
- state->isolate_key = Thread::CreateThreadLocalKey(); |
- state->thread_id_key = Thread::CreateThreadLocalKey(); |
- state->per_isolate_thread_data_key = Thread::CreateThreadLocalKey(); |
- state->thread_data_table = new Isolate::ThreadDataTable(); |
- state->default_isolate = new Isolate(); |
- state->mutex = OS::CreateMutex(); |
- // Can't use SetIsolateThreadLocals(default_isolate_, NULL) here |
- // because a non-null thread data may be already set. |
- Thread::SetThreadLocal(state->isolate_key, state->default_isolate); |
- } |
-}; |
- |
-static LazyInstance<GlobalState, InitializeGlobalState>::type global_state; |
- |
Atomic32 ThreadId::highest_thread_id_ = 0; |
int ThreadId::AllocateThreadId() { |
@@ -91,11 +65,10 @@ int ThreadId::AllocateThreadId() { |
int ThreadId::GetCurrentThreadId() { |
- const GlobalState& global = global_state.Get(); |
- int thread_id = Thread::GetThreadLocalInt(global.thread_id_key); |
+ int thread_id = Thread::GetThreadLocalInt(Isolate::thread_id_key_); |
if (thread_id == 0) { |
thread_id = AllocateThreadId(); |
- Thread::SetThreadLocalInt(global.thread_id_key, thread_id); |
+ Thread::SetThreadLocalInt(Isolate::thread_id_key_, thread_id); |
} |
return thread_id; |
} |
@@ -339,16 +312,23 @@ void Isolate::PreallocatedStorageDelete(void* p) { |
storage->LinkTo(&free_list_); |
} |
+Isolate* Isolate::default_isolate_ = NULL; |
+Thread::LocalStorageKey Isolate::isolate_key_; |
+Thread::LocalStorageKey Isolate::thread_id_key_; |
+Thread::LocalStorageKey Isolate::per_isolate_thread_data_key_; |
+Mutex* Isolate::process_wide_mutex_ = OS::CreateMutex(); |
+Isolate::ThreadDataTable* Isolate::thread_data_table_ = NULL; |
+ |
+ |
Isolate::PerIsolateThreadData* Isolate::AllocatePerIsolateThreadData( |
ThreadId thread_id) { |
ASSERT(!thread_id.Equals(ThreadId::Invalid())); |
PerIsolateThreadData* per_thread = new PerIsolateThreadData(this, thread_id); |
{ |
- GlobalState* const global = global_state.Pointer(); |
- ScopedLock lock(global->mutex); |
- ASSERT(global->thread_data_table->Lookup(this, thread_id) == NULL); |
- global->thread_data_table->Insert(per_thread); |
- ASSERT(global->thread_data_table->Lookup(this, thread_id) == per_thread); |
+ ScopedLock lock(process_wide_mutex_); |
+ ASSERT(thread_data_table_->Lookup(this, thread_id) == NULL); |
+ thread_data_table_->Insert(per_thread); |
+ ASSERT(thread_data_table_->Lookup(this, thread_id) == per_thread); |
} |
return per_thread; |
} |
@@ -359,9 +339,8 @@ Isolate::PerIsolateThreadData* |
ThreadId thread_id = ThreadId::Current(); |
PerIsolateThreadData* per_thread = NULL; |
{ |
- GlobalState* const global = global_state.Pointer(); |
- ScopedLock lock(global->mutex); |
- per_thread = global->thread_data_table->Lookup(this, thread_id); |
+ ScopedLock lock(process_wide_mutex_); |
+ per_thread = thread_data_table_->Lookup(this, thread_id); |
if (per_thread == NULL) { |
per_thread = AllocatePerIsolateThreadData(thread_id); |
} |
@@ -374,74 +353,64 @@ Isolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThisThread() { |
ThreadId thread_id = ThreadId::Current(); |
PerIsolateThreadData* per_thread = NULL; |
{ |
- GlobalState* const global = global_state.Pointer(); |
- ScopedLock lock(global->mutex); |
- per_thread = global->thread_data_table->Lookup(this, thread_id); |
+ ScopedLock lock(process_wide_mutex_); |
+ per_thread = thread_data_table_->Lookup(this, thread_id); |
} |
return per_thread; |
} |
-bool Isolate::IsDefaultIsolate() const { |
- return this == global_state.Get().default_isolate; |
-} |
- |
- |
void Isolate::EnsureDefaultIsolate() { |
- GlobalState* const global = global_state.Pointer(); |
+ ScopedLock lock(process_wide_mutex_); |
+ if (default_isolate_ == NULL) { |
+ isolate_key_ = Thread::CreateThreadLocalKey(); |
+ thread_id_key_ = Thread::CreateThreadLocalKey(); |
+ per_isolate_thread_data_key_ = Thread::CreateThreadLocalKey(); |
+ thread_data_table_ = new Isolate::ThreadDataTable(); |
+ default_isolate_ = new Isolate(); |
+ } |
// Can't use SetIsolateThreadLocals(default_isolate_, NULL) here |
// because a non-null thread data may be already set. |
- if (Thread::GetThreadLocal(global->isolate_key) == NULL) { |
- Thread::SetThreadLocal(global->isolate_key, global->default_isolate); |
+ if (Thread::GetThreadLocal(isolate_key_) == NULL) { |
+ Thread::SetThreadLocal(isolate_key_, default_isolate_); |
} |
} |
+struct StaticInitializer { |
+ StaticInitializer() { |
+ Isolate::EnsureDefaultIsolate(); |
+ } |
+} static_initializer; |
#ifdef ENABLE_DEBUGGER_SUPPORT |
Debugger* Isolate::GetDefaultIsolateDebugger() { |
EnsureDefaultIsolate(); |
- return global_state.Pointer()->default_isolate->debugger(); |
+ return default_isolate_->debugger(); |
} |
#endif |
StackGuard* Isolate::GetDefaultIsolateStackGuard() { |
EnsureDefaultIsolate(); |
- return global_state.Pointer()->default_isolate->stack_guard(); |
-} |
- |
- |
-Thread::LocalStorageKey Isolate::isolate_key() { |
- return global_state.Get().isolate_key; |
-} |
- |
- |
-Thread::LocalStorageKey Isolate::thread_id_key() { |
- return global_state.Get().thread_id_key; |
-} |
- |
- |
-Thread::LocalStorageKey Isolate::per_isolate_thread_data_key() { |
- return global_state.Get().per_isolate_thread_data_key; |
+ return default_isolate_->stack_guard(); |
} |
void Isolate::EnterDefaultIsolate() { |
EnsureDefaultIsolate(); |
- Isolate* const default_isolate = global_state.Pointer()->default_isolate; |
- ASSERT(default_isolate != NULL); |
+ ASSERT(default_isolate_ != NULL); |
PerIsolateThreadData* data = CurrentPerIsolateThreadData(); |
// If not yet in default isolate - enter it. |
- if (data == NULL || data->isolate() != default_isolate) { |
- default_isolate->Enter(); |
+ if (data == NULL || data->isolate() != default_isolate_) { |
+ default_isolate_->Enter(); |
} |
} |
Isolate* Isolate::GetDefaultIsolateForLocking() { |
EnsureDefaultIsolate(); |
- return global_state.Pointer()->default_isolate; |
+ return default_isolate_; |
} |
@@ -1564,8 +1533,8 @@ void Isolate::TearDown() { |
Deinit(); |
- { ScopedLock lock(global_state.Pointer()->mutex); |
- global_state.Pointer()->thread_data_table->RemoveAllThreads(this); |
+ { ScopedLock lock(process_wide_mutex_); |
+ thread_data_table_->RemoveAllThreads(this); |
} |
if (!IsDefaultIsolate()) { |
@@ -1618,9 +1587,8 @@ void Isolate::Deinit() { |
void Isolate::SetIsolateThreadLocals(Isolate* isolate, |
PerIsolateThreadData* data) { |
- const GlobalState& global = global_state.Get(); |
- Thread::SetThreadLocal(global.isolate_key, isolate); |
- Thread::SetThreadLocal(global.per_isolate_thread_data_key, data); |
+ Thread::SetThreadLocal(isolate_key_, isolate); |
+ Thread::SetThreadLocal(per_isolate_thread_data_key_, data); |
} |