| 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();
|
|
|
|
|