Index: src/isolate.h |
=================================================================== |
--- src/isolate.h (revision 11005) |
+++ src/isolate.h (working copy) |
@@ -430,19 +430,25 @@ |
// 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 |
@@ -464,7 +470,7 @@ |
// 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 |
@@ -489,15 +495,13 @@ |
// 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 |
// thread to be inside the implicit isolate (or fail a check if we have |
@@ -1032,6 +1036,9 @@ |
private: |
Isolate(); |
+ friend struct GlobalState; |
+ friend struct InitializeGlobalState; |
+ |
// The per-process lock should be acquired before the ThreadDataTable is |
// modified. |
class ThreadDataTable { |
@@ -1074,16 +1081,6 @@ |
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, |
@@ -1105,7 +1102,7 @@ |
// 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(); |