| Index: src/isolate.cc
|
| diff --git a/src/isolate.cc b/src/isolate.cc
|
| index 66733cb67514c5012a79c022875145f86e3f261b..e96044532115b42e71c674384537a634f0eb377e 100644
|
| --- a/src/isolate.cc
|
| +++ b/src/isolate.cc
|
| @@ -48,7 +48,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();
|
| @@ -114,17 +113,16 @@ 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::LazyMutex Isolate::thread_data_table_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<base::Mutex> lock_guard(process_wide_mutex_.Pointer());
|
| + base::LockGuard<base::Mutex> lock_guard(thread_data_table_mutex_.Pointer());
|
| per_thread = thread_data_table_->Lookup(this, thread_id);
|
| if (per_thread == NULL) {
|
| per_thread = new PerIsolateThreadData(this, thread_id);
|
| @@ -144,28 +142,26 @@ Isolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThisThread() {
|
|
|
| Isolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThread(
|
| ThreadId thread_id) {
|
| - EnsureInitialized();
|
| PerIsolateThreadData* per_thread = NULL;
|
| {
|
| - base::LockGuard<base::Mutex> lock_guard(process_wide_mutex_.Pointer());
|
| + base::LockGuard<base::Mutex> lock_guard(thread_data_table_mutex_.Pointer());
|
| per_thread = thread_data_table_->Lookup(this, thread_id);
|
| }
|
| return per_thread;
|
| }
|
|
|
|
|
| -void Isolate::EnsureInitialized() {
|
| - base::LockGuard<base::Mutex> lock_guard(process_wide_mutex_.Pointer());
|
| - if (thread_data_table_ == NULL) {
|
| - isolate_key_ = base::Thread::CreateThreadLocalKey();
|
| - thread_id_key_ = base::Thread::CreateThreadLocalKey();
|
| - per_isolate_thread_data_key_ = base::Thread::CreateThreadLocalKey();
|
| +void Isolate::InitializeOncePerProcess() {
|
| + base::LockGuard<base::Mutex> lock_guard(thread_data_table_mutex_.Pointer());
|
| + CHECK(thread_data_table_ == NULL);
|
| + isolate_key_ = base::Thread::CreateThreadLocalKey();
|
| + thread_id_key_ = base::Thread::CreateThreadLocalKey();
|
| + per_isolate_thread_data_key_ = base::Thread::CreateThreadLocalKey();
|
| #ifdef DEBUG
|
| - PerThreadAssertScopeBase::thread_local_key =
|
| - base::Thread::CreateThreadLocalKey();
|
| + PerThreadAssertScopeBase::thread_local_key =
|
| + base::Thread::CreateThreadLocalKey();
|
| #endif // DEBUG
|
| - thread_data_table_ = new Isolate::ThreadDataTable();
|
| - }
|
| + thread_data_table_ = new Isolate::ThreadDataTable();
|
| }
|
|
|
|
|
| @@ -1521,6 +1517,10 @@ Isolate::Isolate()
|
| stress_deopt_count_(0),
|
| next_optimization_id_(0),
|
| use_counter_callback_(NULL) {
|
| + {
|
| + base::LockGuard<base::Mutex> lock_guard(thread_data_table_mutex_.Pointer());
|
| + CHECK(thread_data_table_);
|
| + }
|
| id_ = base::NoBarrier_AtomicIncrement(&isolate_counter_, 1);
|
| TRACE_ISOLATE(constructor);
|
|
|
| @@ -1571,7 +1571,7 @@ void Isolate::TearDown() {
|
| Deinit();
|
|
|
| {
|
| - base::LockGuard<base::Mutex> lock_guard(process_wide_mutex_.Pointer());
|
| + base::LockGuard<base::Mutex> lock_guard(thread_data_table_mutex_.Pointer());
|
| thread_data_table_->RemoveAllThreads(this);
|
| }
|
|
|
| @@ -1676,7 +1676,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);
|
| }
|
|
|