Index: src/isolate.cc |
diff --git a/src/isolate.cc b/src/isolate.cc |
index 6fc671c50c404d66b11c7bfe92eed7883ac698e9..48717021d7f75e8b5eb304ab2eaa14c39ae9e692 100644 |
--- a/src/isolate.cc |
+++ b/src/isolate.cc |
@@ -311,6 +311,17 @@ Isolate::PerIsolateThreadData* |
} |
+Isolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThisThread() { |
+ ThreadId thread_id = ThreadId::Current(); |
+ PerIsolateThreadData* per_thread = NULL; |
+ { |
+ ScopedLock lock(process_wide_mutex_); |
+ per_thread = thread_data_table_->Lookup(this, thread_id); |
+ } |
+ return per_thread; |
+} |
+ |
+ |
void Isolate::EnsureDefaultIsolate() { |
ScopedLock lock(process_wide_mutex_); |
if (default_isolate_ == NULL) { |
@@ -322,7 +333,9 @@ void Isolate::EnsureDefaultIsolate() { |
} |
// Can't use SetIsolateThreadLocals(default_isolate_, NULL) here |
// becase a non-null thread data may be already set. |
- Thread::SetThreadLocal(isolate_key_, default_isolate_); |
+ if (Thread::GetThreadLocal(isolate_key_) == NULL) { |
+ Thread::SetThreadLocal(isolate_key_, default_isolate_); |
+ } |
CHECK(default_isolate_->PreInit()); |
} |
@@ -458,6 +471,11 @@ Isolate::Isolate() |
zone_.isolate_ = this; |
stack_guard_.isolate_ = this; |
+ // ThreadManager is initialized early to support locking an isolate |
+ // before it is entered. |
+ thread_manager_ = new ThreadManager(); |
+ thread_manager_->isolate_ = this; |
+ |
#if defined(V8_TARGET_ARCH_ARM) && !defined(__arm__) || \ |
defined(V8_TARGET_ARCH_MIPS) && !defined(__mips__) |
simulator_initialized_ = false; |
@@ -643,7 +661,6 @@ bool Isolate::PreInit() { |
TRACE_ISOLATE(preinit); |
ASSERT(Isolate::Current() == this); |
- |
#ifdef ENABLE_DEBUGGER_SUPPORT |
debug_ = new Debug(this); |
debugger_ = new Debugger(); |
@@ -671,8 +688,6 @@ bool Isolate::PreInit() { |
string_tracker_ = new StringTracker(); |
string_tracker_->isolate_ = this; |
- thread_manager_ = new ThreadManager(); |
- thread_manager_->isolate_ = this; |
compilation_cache_ = new CompilationCache(this); |
transcendental_cache_ = new TranscendentalCache(); |
keyed_lookup_cache_ = new KeyedLookupCache(); |
@@ -683,7 +698,7 @@ bool Isolate::PreInit() { |
write_input_buffer_ = new StringInputBuffer(); |
global_handles_ = new GlobalHandles(this); |
bootstrapper_ = new Bootstrapper(); |
- handle_scope_implementer_ = new HandleScopeImplementer(); |
+ handle_scope_implementer_ = new HandleScopeImplementer(this); |
stub_cache_ = new StubCache(this); |
ast_sentinels_ = new AstSentinels(); |
regexp_stack_ = new RegExpStack(); |
@@ -700,6 +715,7 @@ bool Isolate::PreInit() { |
void Isolate::InitializeThreadLocal() { |
+ thread_local_top_.isolate_ = this; |
thread_local_top_.Initialize(); |
clear_pending_exception(); |
clear_pending_message(); |
@@ -757,7 +773,7 @@ bool Isolate::Init(Deserializer* des) { |
// Initialize other runtime facilities |
#if defined(USE_SIMULATOR) |
#if defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_MIPS) |
- Simulator::Initialize(); |
+ Simulator::Initialize(this); |
#endif |
#endif |