Index: src/isolate.cc |
diff --git a/src/isolate.cc b/src/isolate.cc |
index e42d78ecdcba94ca9355b69b201fdbbf0fcbe092..88ccf5a1210df4ed11540c2ebdeb44545c891118 100644 |
--- a/src/isolate.cc |
+++ b/src/isolate.cc |
@@ -310,6 +310,20 @@ Isolate::PerIsolateThreadData* |
return per_thread; |
} |
Vitaly Repeshko
2011/04/15 00:29:39
nit: Two blank lines between functions.
Dmitry Lomov
2011/04/19 01:50:47
Done.
|
+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::EnsurePreinitializedForThisThread() { |
Vitaly Repeshko
2011/04/15 00:29:39
ForThisThread doesn't make much sense, since the i
Dmitry Lomov
2011/04/19 01:50:47
I just removed this.
|
+ ScopedLock lock(process_wide_mutex_); |
Vitaly Repeshko
2011/04/15 00:29:39
I don't think we really need a process-wide mutex
|
+ CHECK(PreInit()); |
+} |
void Isolate::EnsureDefaultIsolate() { |
ScopedLock lock(process_wide_mutex_); |
@@ -320,10 +334,12 @@ void Isolate::EnsureDefaultIsolate() { |
thread_data_table_ = new Isolate::ThreadDataTable(); |
default_isolate_ = new Isolate(); |
} |
+ CHECK(default_isolate_->PreInit()); |
// Can't use SetIsolateThreadLocals(default_isolate_, NULL) here |
// becase a non-null thread data may be already set. |
- Thread::SetThreadLocal(isolate_key_, default_isolate_); |
- CHECK(default_isolate_->PreInit()); |
+ if (Thread::GetThreadLocal(isolate_key_) == NULL) { |
+ Thread::SetThreadLocal(isolate_key_, default_isolate_); |
+ } |
} |
@@ -640,8 +656,6 @@ bool Isolate::PreInit() { |
TRACE_ISOLATE(preinit); |
- ASSERT(Isolate::Current() == this); |
Vitaly Repeshko
2011/04/15 00:29:39
Removing this is dangerous (at least for now), bec
Dmitry Lomov
2011/04/19 01:50:47
Done.
|
- |
#ifdef ENABLE_DEBUGGER_SUPPORT |
debug_ = new Debug(this); |
debugger_ = new Debugger(); |
@@ -658,7 +672,7 @@ bool Isolate::PreInit() { |
heap_.SetStackLimits(); |
#ifdef DEBUG |
- DisallowAllocationFailure disallow_allocation_failure; |
+ DisallowAllocationFailure disallow_allocation_failure(&heap_); |
#endif |
#define C(name) isolate_addresses_[Isolate::k_##name] = \ |
@@ -681,9 +695,8 @@ 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(); |
regexp_stack_->isolate_ = this; |
@@ -698,6 +711,7 @@ bool Isolate::PreInit() { |
void Isolate::InitializeThreadLocal() { |
+ thread_local_top_.isolate_ = this; |
thread_local_top_.Initialize(); |
clear_pending_exception(); |
clear_pending_message(); |
@@ -741,11 +755,14 @@ bool Isolate::Init(Deserializer* des) { |
#ifdef DEBUG |
// The initialization process does not handle memory exhaustion. |
- DisallowAllocationFailure disallow_allocation_failure; |
+ DisallowAllocationFailure disallow_allocation_failure(&heap_); |
#endif |
if (state_ == UNINITIALIZED && !PreInit()) return false; |
+ // AstSentinels initialization requires Isolate::Current to be set |
+ ast_sentinels_ = new AstSentinels(); |
+ |
// Enable logging before setting up the heap |
logger_->Setup(); |