| OLD | NEW |
| 1 // Copyright 2008 the V8 project authors. All rights reserved. | 1 // Copyright 2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 char* from = state->data(); | 144 char* from = state->data(); |
| 145 from = HandleScopeImplementer::RestoreThread(from); | 145 from = HandleScopeImplementer::RestoreThread(from); |
| 146 from = Top::RestoreThread(from); | 146 from = Top::RestoreThread(from); |
| 147 #ifdef ENABLE_DEBUGGER_SUPPORT | 147 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 148 from = Debug::RestoreDebug(from); | 148 from = Debug::RestoreDebug(from); |
| 149 #endif | 149 #endif |
| 150 from = StackGuard::RestoreStackGuard(from); | 150 from = StackGuard::RestoreStackGuard(from); |
| 151 from = RegExpStack::RestoreStack(from); | 151 from = RegExpStack::RestoreStack(from); |
| 152 from = Bootstrapper::RestoreState(from); | 152 from = Bootstrapper::RestoreState(from); |
| 153 Thread::SetThreadLocal(thread_state_key, NULL); | 153 Thread::SetThreadLocal(thread_state_key, NULL); |
| 154 if (state->terminate_on_restore()) { |
| 155 StackGuard::TerminateExecution(); |
| 156 state->set_terminate_on_restore(false); |
| 157 } |
| 154 state->set_id(kInvalidId); | 158 state->set_id(kInvalidId); |
| 155 state->Unlink(); | 159 state->Unlink(); |
| 156 state->LinkInto(ThreadState::FREE_LIST); | 160 state->LinkInto(ThreadState::FREE_LIST); |
| 157 return true; | 161 return true; |
| 158 } | 162 } |
| 159 | 163 |
| 160 | 164 |
| 161 void ThreadManager::Lock() { | 165 void ThreadManager::Lock() { |
| 162 mutex_->Lock(); | 166 mutex_->Lock(); |
| 163 mutex_owner_.Initialize(ThreadHandle::SELF); | 167 mutex_owner_.Initialize(ThreadHandle::SELF); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 181 RegExpStack::ArchiveSpacePerThread() + | 185 RegExpStack::ArchiveSpacePerThread() + |
| 182 Bootstrapper::ArchiveSpacePerThread(); | 186 Bootstrapper::ArchiveSpacePerThread(); |
| 183 } | 187 } |
| 184 | 188 |
| 185 | 189 |
| 186 ThreadState* ThreadState::free_anchor_ = new ThreadState(); | 190 ThreadState* ThreadState::free_anchor_ = new ThreadState(); |
| 187 ThreadState* ThreadState::in_use_anchor_ = new ThreadState(); | 191 ThreadState* ThreadState::in_use_anchor_ = new ThreadState(); |
| 188 | 192 |
| 189 | 193 |
| 190 ThreadState::ThreadState() : id_(ThreadManager::kInvalidId), | 194 ThreadState::ThreadState() : id_(ThreadManager::kInvalidId), |
| 195 terminate_on_restore_(false), |
| 191 next_(this), previous_(this) { | 196 next_(this), previous_(this) { |
| 192 } | 197 } |
| 193 | 198 |
| 194 | 199 |
| 195 void ThreadState::AllocateSpace() { | 200 void ThreadState::AllocateSpace() { |
| 196 data_ = NewArray<char>(ArchiveSpacePerThread()); | 201 data_ = NewArray<char>(ArchiveSpacePerThread()); |
| 197 } | 202 } |
| 198 | 203 |
| 199 | 204 |
| 200 void ThreadState::Unlink() { | 205 void ThreadState::Unlink() { |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 } | 315 } |
| 311 | 316 |
| 312 | 317 |
| 313 int ThreadManager::CurrentId() { | 318 int ThreadManager::CurrentId() { |
| 314 return Thread::GetThreadLocalInt(thread_id_key); | 319 return Thread::GetThreadLocalInt(thread_id_key); |
| 315 } | 320 } |
| 316 | 321 |
| 317 | 322 |
| 318 void ThreadManager::AssignId() { | 323 void ThreadManager::AssignId() { |
| 319 if (!Thread::HasThreadLocal(thread_id_key)) { | 324 if (!Thread::HasThreadLocal(thread_id_key)) { |
| 320 Thread::SetThreadLocalInt(thread_id_key, next_id_++); | 325 ASSERT(Locker::IsLocked()); |
| 326 int thread_id = next_id_++; |
| 327 Thread::SetThreadLocalInt(thread_id_key, thread_id); |
| 328 Top::set_thread_id(thread_id); |
| 329 } |
| 330 } |
| 331 |
| 332 |
| 333 void ThreadManager::TerminateExecution(int thread_id) { |
| 334 for (ThreadState* state = ThreadState::FirstInUse(); |
| 335 state != NULL; |
| 336 state = state->Next()) { |
| 337 if (thread_id == state->id()) { |
| 338 state->set_terminate_on_restore(true); |
| 339 } |
| 321 } | 340 } |
| 322 } | 341 } |
| 323 | 342 |
| 324 | 343 |
| 325 // This is the ContextSwitcher singleton. There is at most a single thread | 344 // This is the ContextSwitcher singleton. There is at most a single thread |
| 326 // running which delivers preemption events to V8 threads. | 345 // running which delivers preemption events to V8 threads. |
| 327 ContextSwitcher* ContextSwitcher::singleton_ = NULL; | 346 ContextSwitcher* ContextSwitcher::singleton_ = NULL; |
| 328 | 347 |
| 329 | 348 |
| 330 ContextSwitcher::ContextSwitcher(int every_n_ms) | 349 ContextSwitcher::ContextSwitcher(int every_n_ms) |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 // Acknowledge the preemption by the receiving thread. | 397 // Acknowledge the preemption by the receiving thread. |
| 379 void ContextSwitcher::PreemptionReceived() { | 398 void ContextSwitcher::PreemptionReceived() { |
| 380 ASSERT(Locker::IsLocked()); | 399 ASSERT(Locker::IsLocked()); |
| 381 // There is currently no accounting being done for this. But could be in the | 400 // There is currently no accounting being done for this. But could be in the |
| 382 // future, which is why we leave this in. | 401 // future, which is why we leave this in. |
| 383 } | 402 } |
| 384 | 403 |
| 385 | 404 |
| 386 } // namespace internal | 405 } // namespace internal |
| 387 } // namespace v8 | 406 } // namespace v8 |
| OLD | NEW |