Index: src/v8threads.cc |
=================================================================== |
--- src/v8threads.cc (revision 1518) |
+++ src/v8threads.cc (working copy) |
@@ -38,6 +38,8 @@ |
static internal::Thread::LocalStorageKey thread_state_key = |
internal::Thread::CreateThreadLocalKey(); |
+static internal::Thread::LocalStorageKey thread_id_key = |
+ internal::Thread::CreateThreadLocalKey(); |
// Track whether this V8 instance has ever called v8::Locker. This allows the |
@@ -61,6 +63,9 @@ |
} |
} |
ASSERT(internal::ThreadManager::IsLockedByCurrentThread()); |
+ |
+ // Make sure this thread is assigned a thread id. |
+ internal::ThreadManager::AssignId(); |
} |
@@ -115,6 +120,7 @@ |
lazily_archived_thread_.Initialize(ThreadHandle::INVALID); |
ASSERT(Thread::GetThreadLocal(thread_state_key) == |
lazily_archived_thread_state_); |
+ lazily_archived_thread_state_->set_id(kInvalidId); |
lazily_archived_thread_state_->LinkInto(ThreadState::FREE_LIST); |
lazily_archived_thread_state_ = NULL; |
Thread::SetThreadLocal(thread_state_key, NULL); |
@@ -143,6 +149,7 @@ |
from = RegExpStack::RestoreStack(from); |
from = Bootstrapper::RestoreState(from); |
Thread::SetThreadLocal(thread_state_key, NULL); |
+ state->set_id(kInvalidId); |
state->Unlink(); |
state->LinkInto(ThreadState::FREE_LIST); |
return true; |
@@ -176,7 +183,8 @@ |
ThreadState* ThreadState::in_use_anchor_ = new ThreadState(); |
-ThreadState::ThreadState() : next_(this), previous_(this) { |
+ThreadState::ThreadState() : id_(ThreadManager::kInvalidId), |
+ next_(this), previous_(this) { |
} |
@@ -224,6 +232,7 @@ |
} |
+int ThreadManager::next_id_ = 0; |
Mutex* ThreadManager::mutex_ = OS::CreateMutex(); |
ThreadHandle ThreadManager::mutex_owner_(ThreadHandle::INVALID); |
ThreadHandle ThreadManager::lazily_archived_thread_(ThreadHandle::INVALID); |
@@ -238,6 +247,9 @@ |
Thread::SetThreadLocal(thread_state_key, reinterpret_cast<void*>(state)); |
lazily_archived_thread_.Initialize(ThreadHandle::SELF); |
lazily_archived_thread_state_ = state; |
+ ASSERT(state->id() == kInvalidId); |
+ state->set_id(CurrentId()); |
+ ASSERT(state->id() != kInvalidId); |
} |
@@ -290,6 +302,18 @@ |
} |
+int ThreadManager::CurrentId() { |
+ return bit_cast<int, void*>(Thread::GetThreadLocal(thread_id_key)); |
+} |
+ |
+ |
+void ThreadManager::AssignId() { |
+ if (Thread::GetThreadLocal(thread_id_key) == NULL) { |
+ Thread::SetThreadLocal(thread_id_key, bit_cast<void*, int>(next_id_++)); |
+ } |
+} |
+ |
+ |
// This is the ContextSwitcher singleton. There is at most a single thread |
// running which delivers preemption events to V8 threads. |
ContextSwitcher* ContextSwitcher::singleton_ = NULL; |