From bb169b93aea424f40919a033a8c1f49fa1e40452 Mon Sep 17 00:00:00 2001 From: "jochen@chromium.org" Date: Tue, 1 Jul 2014 06:43:14 +0000 Subject: [PATCH] Remove static initializer from isolate We don't have a default isolate anymore, so we can just create the thread data and keys on demand BUG=none R=dcarney@chromium.org, svenpanne@chromium.org LOG=y Review URL: https://codereview.chromium.org/337603010 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22105 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/isolate.cc | 38 ++++++++++---------------------------- src/isolate.h | 11 +++-------- src/mksnapshot.cc | 1 - test/cctest/cctest.cc | 1 - tools/check-static-initializers.sh | 3 +-- 5 files changed, 14 insertions(+), 40 deletions(-) diff --git a/src/isolate.cc b/src/isolate.cc index 05f8792..99f9c06 100644 --- a/src/isolate.cc +++ b/src/isolate.cc @@ -46,6 +46,7 @@ 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(); @@ -104,24 +105,17 @@ base::Thread::LocalStorageKey Isolate::per_isolate_thread_data_key_; #ifdef DEBUG base::Thread::LocalStorageKey PerThreadAssertScopeBase::thread_local_key; #endif // DEBUG -base::Mutex Isolate::process_wide_mutex_; -// TODO(dcarney): Remove with default isolate. -enum DefaultIsolateStatus { - kDefaultIsolateUninitialized, - kDefaultIsolateInitialized, - kDefaultIsolateCrashIfInitialized -}; -static DefaultIsolateStatus default_isolate_status_ - = kDefaultIsolateUninitialized; +base::LazyMutex Isolate::process_wide_mutex_ = LAZY_MUTEX_INITIALIZER; 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_); + base::LockGuard lock_guard(process_wide_mutex_.Pointer()); per_thread = thread_data_table_->Lookup(this, thread_id); if (per_thread == NULL) { per_thread = new PerIsolateThreadData(this, thread_id); @@ -141,25 +135,18 @@ Isolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThisThread() { Isolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThread( ThreadId thread_id) { + EnsureInitialized(); PerIsolateThreadData* per_thread = NULL; { - base::LockGuard lock_guard(&process_wide_mutex_); + base::LockGuard lock_guard(process_wide_mutex_.Pointer()); per_thread = thread_data_table_->Lookup(this, thread_id); } return per_thread; } -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); +void Isolate::EnsureInitialized() { + base::LockGuard lock_guard(process_wide_mutex_.Pointer()); if (thread_data_table_ == NULL) { isolate_key_ = base::Thread::CreateThreadLocalKey(); thread_id_key_ = base::Thread::CreateThreadLocalKey(); @@ -172,12 +159,6 @@ void Isolate::EnsureDefaultIsolate() { } } -struct StaticInitializer { - StaticInitializer() { - Isolate::EnsureDefaultIsolate(); - } -} static_initializer; - Address Isolate::get_address_from_id(Isolate::AddressId id) { return isolate_addresses_[id]; @@ -1527,7 +1508,7 @@ void Isolate::TearDown() { Deinit(); - { base::LockGuard lock_guard(&process_wide_mutex_); + { base::LockGuard lock_guard(process_wide_mutex_.Pointer()); thread_data_table_->RemoveAllThreads(this); } @@ -1628,6 +1609,7 @@ 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 157839f..a9fae68 100644 --- a/src/isolate.h +++ b/src/isolate.h @@ -486,13 +486,6 @@ 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(); @@ -1090,6 +1083,8 @@ class Isolate { void CountUsage(v8::Isolate::UseCounterFeature feature); private: + static void EnsureInitialized(); + Isolate(); friend struct GlobalState; @@ -1149,7 +1144,7 @@ class Isolate { }; // This mutex protects highest_thread_id_ and thread_data_table_. - static base::Mutex process_wide_mutex_; + static base::LazyMutex 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 69306e1..9099398 100644 --- a/src/mksnapshot.cc +++ b/src/mksnapshot.cc @@ -317,7 +317,6 @@ 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 0be1520..f51f7e4 100644 --- a/test/cctest/cctest.cc +++ b/test/cctest/cctest.cc @@ -138,7 +138,6 @@ 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 11ba080..da43170 100755 --- a/tools/check-static-initializers.sh +++ b/tools/check-static-initializers.sh @@ -32,8 +32,7 @@ # Allow: # - _GLOBAL__I__ZN2v810LineEditor6first_E # - _GLOBAL__I__ZN2v88internal32AtomicOps_Internalx86CPUFeaturesE -# - _GLOBAL__I__ZN2v88internal8ThreadId18highest_thread_id_E -expected_static_init_count=3 +expected_static_init_count=2 v8_root=$(readlink -f $(dirname $BASH_SOURCE)/../) -- 2.7.4