From: jochen@chromium.org Date: Wed, 2 Jul 2014 07:44:02 +0000 (+0000) Subject: Revert "Reland 22105 "Remove static initializer from isolate"" X-Git-Tag: upstream/4.7.83~8435 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=539c6183e3e21938b84ff9f5a4873cb07c12ea4c;p=platform%2Fupstream%2Fv8.git Revert "Reland 22105 "Remove static initializer from isolate"" BUG=none TBR=yangguo@chromium.org LOG=n Review URL: https://codereview.chromium.org/362893006 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22141 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/isolate.cc b/src/isolate.cc index 86c73fc..1592667 100644 --- a/src/isolate.cc +++ b/src/isolate.cc @@ -46,7 +46,6 @@ int ThreadId::AllocateThreadId() { int ThreadId::GetCurrentThreadId() { - Isolate::EnsureInitialized(); int thread_id = base::Thread::GetThreadLocalInt(Isolate::thread_id_key_); if (thread_id == 0) { thread_id = AllocateThreadId(); @@ -105,17 +104,24 @@ base::Thread::LocalStorageKey Isolate::per_isolate_thread_data_key_; #ifdef DEBUG base::Thread::LocalStorageKey PerThreadAssertScopeBase::thread_local_key; #endif // DEBUG -base::LazyMutex Isolate::process_wide_mutex_ = LAZY_MUTEX_INITIALIZER; +base::Mutex Isolate::process_wide_mutex_; +// TODO(dcarney): Remove with default isolate. +enum DefaultIsolateStatus { + kDefaultIsolateUninitialized, + kDefaultIsolateInitialized, + kDefaultIsolateCrashIfInitialized +}; +static DefaultIsolateStatus default_isolate_status_ + = kDefaultIsolateUninitialized; Isolate::ThreadDataTable* Isolate::thread_data_table_ = NULL; base::Atomic32 Isolate::isolate_counter_ = 0; Isolate::PerIsolateThreadData* Isolate::FindOrAllocatePerThreadDataForThisThread() { - EnsureInitialized(); ThreadId thread_id = ThreadId::Current(); PerIsolateThreadData* per_thread = NULL; { - base::LockGuard lock_guard(process_wide_mutex_.Pointer()); + base::LockGuard lock_guard(&process_wide_mutex_); per_thread = thread_data_table_->Lookup(this, thread_id); if (per_thread == NULL) { per_thread = new PerIsolateThreadData(this, thread_id); @@ -135,18 +141,25 @@ Isolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThisThread() { Isolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThread( ThreadId thread_id) { - EnsureInitialized(); PerIsolateThreadData* per_thread = NULL; { - base::LockGuard lock_guard(process_wide_mutex_.Pointer()); + base::LockGuard lock_guard(&process_wide_mutex_); per_thread = thread_data_table_->Lookup(this, thread_id); } return per_thread; } -void Isolate::EnsureInitialized() { - base::LockGuard lock_guard(process_wide_mutex_.Pointer()); +void Isolate::SetCrashIfDefaultIsolateInitialized() { + base::LockGuard lock_guard(&process_wide_mutex_); + CHECK(default_isolate_status_ != kDefaultIsolateInitialized); + default_isolate_status_ = kDefaultIsolateCrashIfInitialized; +} + + +void Isolate::EnsureDefaultIsolate() { + base::LockGuard lock_guard(&process_wide_mutex_); + CHECK(default_isolate_status_ != kDefaultIsolateCrashIfInitialized); if (thread_data_table_ == NULL) { isolate_key_ = base::Thread::CreateThreadLocalKey(); thread_id_key_ = base::Thread::CreateThreadLocalKey(); @@ -159,6 +172,12 @@ void Isolate::EnsureInitialized() { } } +struct StaticInitializer { + StaticInitializer() { + Isolate::EnsureDefaultIsolate(); + } +} static_initializer; + Address Isolate::get_address_from_id(Isolate::AddressId id) { return isolate_addresses_[id]; @@ -1508,7 +1527,7 @@ void Isolate::TearDown() { Deinit(); - { base::LockGuard lock_guard(process_wide_mutex_.Pointer()); + { base::LockGuard lock_guard(&process_wide_mutex_); thread_data_table_->RemoveAllThreads(this); } @@ -1609,7 +1628,6 @@ void Isolate::PushToPartialSnapshotCache(Object* obj) { void Isolate::SetIsolateThreadLocals(Isolate* isolate, PerIsolateThreadData* data) { - EnsureInitialized(); base::Thread::SetThreadLocal(isolate_key_, isolate); base::Thread::SetThreadLocal(per_isolate_thread_data_key_, data); } diff --git a/src/isolate.h b/src/isolate.h index 4ca1168..972a518 100644 --- a/src/isolate.h +++ b/src/isolate.h @@ -448,14 +448,12 @@ class Isolate { // Returns the PerIsolateThreadData for the current thread (or NULL if one is // not currently set). static PerIsolateThreadData* CurrentPerIsolateThreadData() { - EnsureInitialized(); return reinterpret_cast( base::Thread::GetThreadLocal(per_isolate_thread_data_key_)); } // Returns the isolate inside which the current thread is running. INLINE(static Isolate* Current()) { - EnsureInitialized(); Isolate* isolate = reinterpret_cast( base::Thread::GetExistingThreadLocal(isolate_key_)); ASSERT(isolate != NULL); @@ -463,7 +461,6 @@ class Isolate { } INLINE(static Isolate* UncheckedCurrent()) { - EnsureInitialized(); return reinterpret_cast( base::Thread::GetThreadLocal(isolate_key_)); } @@ -489,6 +486,13 @@ class Isolate { static void GlobalTearDown(); + static void SetCrashIfDefaultIsolateInitialized(); + // Ensures that process-wide resources and the default isolate have been + // allocated. It is only necessary to call this method in rare cases, for + // example if you are using V8 from within the body of a static initializer. + // Safe to call multiple times. + static void EnsureDefaultIsolate(); + // Find the PerThread for this particular (isolate, thread) combination // If one does not yet exist, return null. PerIsolateThreadData* FindPerThreadDataForThisThread(); @@ -501,13 +505,11 @@ class 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 base::Thread::LocalStorageKey isolate_key() { - EnsureInitialized(); return isolate_key_; } // Returns the key used to store process-wide thread IDs. static base::Thread::LocalStorageKey thread_id_key() { - EnsureInitialized(); return thread_id_key_; } @@ -1088,8 +1090,6 @@ class Isolate { void CountUsage(v8::Isolate::UseCounterFeature feature); private: - static void EnsureInitialized(); - Isolate(); friend struct GlobalState; @@ -1149,7 +1149,7 @@ class Isolate { }; // This mutex protects highest_thread_id_ and thread_data_table_. - static base::LazyMutex process_wide_mutex_; + static base::Mutex process_wide_mutex_; static base::Thread::LocalStorageKey per_isolate_thread_data_key_; static base::Thread::LocalStorageKey isolate_key_; diff --git a/src/mksnapshot.cc b/src/mksnapshot.cc index 9099398..69306e1 100644 --- a/src/mksnapshot.cc +++ b/src/mksnapshot.cc @@ -317,6 +317,7 @@ void DumpException(Handle message) { int main(int argc, char** argv) { V8::InitializeICU(); + i::Isolate::SetCrashIfDefaultIsolateInitialized(); i::CpuFeatures::Probe(true); // By default, log code create information in the snapshot. diff --git a/test/cctest/cctest.cc b/test/cctest/cctest.cc index f51f7e4..0be1520 100644 --- a/test/cctest/cctest.cc +++ b/test/cctest/cctest.cc @@ -138,6 +138,7 @@ static void SuggestTestHarness(int tests) { int main(int argc, char* argv[]) { v8::V8::InitializeICU(); + i::Isolate::SetCrashIfDefaultIsolateInitialized(); v8::internal::FlagList::SetFlagsFromCommandLine(&argc, argv, true); diff --git a/tools/check-static-initializers.sh b/tools/check-static-initializers.sh index da43170..11ba080 100755 --- a/tools/check-static-initializers.sh +++ b/tools/check-static-initializers.sh @@ -32,7 +32,8 @@ # Allow: # - _GLOBAL__I__ZN2v810LineEditor6first_E # - _GLOBAL__I__ZN2v88internal32AtomicOps_Internalx86CPUFeaturesE -expected_static_init_count=2 +# - _GLOBAL__I__ZN2v88internal8ThreadId18highest_thread_id_E +expected_static_init_count=3 v8_root=$(readlink -f $(dirname $BASH_SOURCE)/../)