diff options
Diffstat (limited to 'deps/v8/src/isolate.h')
-rw-r--r-- | deps/v8/src/isolate.h | 40 |
1 files changed, 19 insertions, 21 deletions
diff --git a/deps/v8/src/isolate.h b/deps/v8/src/isolate.h index 2c2618a1f0..0c5a54c598 100644 --- a/deps/v8/src/isolate.h +++ b/deps/v8/src/isolate.h @@ -430,19 +430,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 @@ -464,7 +470,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 @@ -489,14 +495,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 @@ -925,6 +929,7 @@ class Isolate { } #endif + inline bool IsDebuggerActive(); inline bool DebuggerHasBreakPoints(); #ifdef DEBUG @@ -1032,6 +1037,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 { @@ -1074,16 +1082,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, @@ -1105,7 +1103,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(); |