Index: src/isolate.h |
diff --git a/src/isolate.h b/src/isolate.h |
index 71fe8838f87b260f69d74db209f9e17b2879ccc1..c8e1d282373bbcc3e8c8b3a7bff3991266b66be1 100644 |
--- a/src/isolate.h |
+++ b/src/isolate.h |
@@ -429,19 +429,25 @@ class Isolate { |
// not currently set). |
static PerIsolateThreadData* CurrentPerIsolateThreadData() { |
return reinterpret_cast<PerIsolateThreadData*>( |
- Thread::GetThreadLocal(per_isolate_thread_data_key_)); |
+ Thread::GetThreadLocal(per_isolate_thread_data_key())); |
} |
// Returns the isolate inside which the current thread is running. |
INLINE(static Isolate* Current()) { |
+ const Thread::LocalStorageKey key = isolate_key(); |
Isolate* isolate = reinterpret_cast<Isolate*>( |
- Thread::GetExistingThreadLocal(isolate_key_)); |
+ Thread::GetExistingThreadLocal(key)); |
+ if (!isolate) { |
+ EnsureDefaultIsolate(); |
+ isolate = reinterpret_cast<Isolate*>( |
+ Thread::GetExistingThreadLocal(key)); |
+ } |
ASSERT(isolate != NULL); |
return isolate; |
} |
INLINE(static Isolate* UncheckedCurrent()) { |
- return reinterpret_cast<Isolate*>(Thread::GetThreadLocal(isolate_key_)); |
+ return reinterpret_cast<Isolate*>(Thread::GetThreadLocal(isolate_key())); |
} |
// Usually called by Init(), but can be called early e.g. to allow |
@@ -463,7 +469,7 @@ class Isolate { |
// for legacy API reasons. |
void TearDown(); |
- bool IsDefaultIsolate() const { return this == default_isolate_; } |
+ bool IsDefaultIsolate() const; |
// Ensures that process-wide resources and the default isolate have been |
// allocated. It is only necessary to call this method in rare cases, for |
@@ -488,14 +494,12 @@ class Isolate { |
// Returns the key used to store the pointer to the current isolate. |
// Used internally for V8 threads that do not execute JavaScript but still |
// are part of the domain of an isolate (like the context switcher). |
- static Thread::LocalStorageKey isolate_key() { |
- return isolate_key_; |
- } |
+ static Thread::LocalStorageKey isolate_key(); |
// Returns the key used to store process-wide thread IDs. |
- static Thread::LocalStorageKey thread_id_key() { |
- return thread_id_key_; |
- } |
+ static Thread::LocalStorageKey thread_id_key(); |
+ |
+ static Thread::LocalStorageKey per_isolate_thread_data_key(); |
// If a client attempts to create a Locker without specifying an isolate, |
// we assume that the client is using legacy behavior. Set up the current |
@@ -1020,6 +1024,9 @@ class Isolate { |
private: |
Isolate(); |
+ friend struct GlobalState; |
+ friend struct InitializeGlobalState; |
+ |
// The per-process lock should be acquired before the ThreadDataTable is |
// modified. |
class ThreadDataTable { |
@@ -1062,16 +1069,6 @@ class Isolate { |
DISALLOW_COPY_AND_ASSIGN(EntryStackItem); |
}; |
- // This mutex protects highest_thread_id_, thread_data_table_ and |
- // default_isolate_. |
- static Mutex* process_wide_mutex_; |
- |
- static Thread::LocalStorageKey per_isolate_thread_data_key_; |
- static Thread::LocalStorageKey isolate_key_; |
- static Thread::LocalStorageKey thread_id_key_; |
- static Isolate* default_isolate_; |
- static ThreadDataTable* thread_data_table_; |
- |
void Deinit(); |
static void SetIsolateThreadLocals(Isolate* isolate, |
@@ -1093,7 +1090,7 @@ class Isolate { |
// If one does not yet exist, allocate a new one. |
PerIsolateThreadData* FindOrAllocatePerThreadDataForThisThread(); |
-// PreInits and returns a default isolate. Needed when a new thread tries |
+ // PreInits and returns a default isolate. Needed when a new thread tries |
// to create a Locker for the first time (the lock itself is in the isolate). |
static Isolate* GetDefaultIsolateForLocking(); |