| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/thread_interrupter.h" | 5 #include "vm/thread_interrupter.h" |
| 6 | 6 |
| 7 #include "vm/flags.h" | 7 #include "vm/flags.h" |
| 8 #include "vm/lockers.h" | 8 #include "vm/lockers.h" |
| 9 #include "vm/os.h" | 9 #include "vm/os.h" |
| 10 #include "vm/simulator.h" | 10 #include "vm/simulator.h" |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 "Trace thread interrupter"); | 49 "Trace thread interrupter"); |
| 50 | 50 |
| 51 bool ThreadInterrupter::initialized_ = false; | 51 bool ThreadInterrupter::initialized_ = false; |
| 52 bool ThreadInterrupter::shutdown_ = false; | 52 bool ThreadInterrupter::shutdown_ = false; |
| 53 bool ThreadInterrupter::thread_running_ = false; | 53 bool ThreadInterrupter::thread_running_ = false; |
| 54 ThreadId ThreadInterrupter::interrupter_thread_id_ = | 54 ThreadId ThreadInterrupter::interrupter_thread_id_ = |
| 55 OSThread::kInvalidThreadId; | 55 OSThread::kInvalidThreadId; |
| 56 Monitor* ThreadInterrupter::monitor_ = NULL; | 56 Monitor* ThreadInterrupter::monitor_ = NULL; |
| 57 intptr_t ThreadInterrupter::interrupt_period_ = 1000; | 57 intptr_t ThreadInterrupter::interrupt_period_ = 1000; |
| 58 intptr_t ThreadInterrupter::current_wait_time_ = Monitor::kNoTimeout; | 58 intptr_t ThreadInterrupter::current_wait_time_ = Monitor::kNoTimeout; |
| 59 ThreadLocalKey ThreadInterrupter::thread_state_key_ = | |
| 60 OSThread::kUnsetThreadLocalKey; | |
| 61 | 59 |
| 62 | 60 |
| 63 void ThreadInterrupter::InitOnce() { | 61 void ThreadInterrupter::InitOnce() { |
| 64 ASSERT(!initialized_); | 62 ASSERT(!initialized_); |
| 65 ASSERT(thread_state_key_ == OSThread::kUnsetThreadLocalKey); | |
| 66 thread_state_key_ = OSThread::CreateThreadLocal(); | |
| 67 ASSERT(thread_state_key_ != OSThread::kUnsetThreadLocalKey); | |
| 68 monitor_ = new Monitor(); | 63 monitor_ = new Monitor(); |
| 69 ASSERT(monitor_ != NULL); | 64 ASSERT(monitor_ != NULL); |
| 70 initialized_ = true; | 65 initialized_ = true; |
| 71 } | 66 } |
| 72 | 67 |
| 73 | 68 |
| 74 void ThreadInterrupter::Startup() { | 69 void ThreadInterrupter::Startup() { |
| 75 ASSERT(initialized_); | 70 ASSERT(initialized_); |
| 76 if (FLAG_trace_thread_interrupter) { | 71 if (FLAG_trace_thread_interrupter) { |
| 77 OS::Print("ThreadInterrupter starting up.\n"); | 72 OS::Print("ThreadInterrupter starting up.\n"); |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 } | 219 } |
| 225 } | 220 } |
| 226 | 221 |
| 227 | 222 |
| 228 InterruptableThreadState* ThreadInterrupter::GetCurrentThreadState() { | 223 InterruptableThreadState* ThreadInterrupter::GetCurrentThreadState() { |
| 229 return _EnsureThreadStateCreated(); | 224 return _EnsureThreadStateCreated(); |
| 230 } | 225 } |
| 231 | 226 |
| 232 | 227 |
| 233 InterruptableThreadState* ThreadInterrupter::CurrentThreadState() { | 228 InterruptableThreadState* ThreadInterrupter::CurrentThreadState() { |
| 234 InterruptableThreadState* state = reinterpret_cast<InterruptableThreadState*>( | 229 return Thread::Current()->thread_state(); |
| 235 OSThread::GetThreadLocal(thread_state_key_)); | |
| 236 return state; | |
| 237 } | 230 } |
| 238 | 231 |
| 239 | 232 |
| 240 void ThreadInterrupter::SetCurrentThreadState(InterruptableThreadState* state) { | 233 void ThreadInterrupter::SetCurrentThreadState(InterruptableThreadState* state) { |
| 241 OSThread::SetThreadLocal(thread_state_key_, | 234 Thread::Current()->set_thread_state(state); |
| 242 reinterpret_cast<uword>(state)); | |
| 243 } | 235 } |
| 244 | 236 |
| 245 | 237 |
| 246 void ThreadInterruptNoOp(const InterruptedThreadState& state, void* data) { | 238 void ThreadInterruptNoOp(const InterruptedThreadState& state, void* data) { |
| 247 // NoOp. | 239 // NoOp. |
| 248 } | 240 } |
| 249 | 241 |
| 250 | 242 |
| 251 class ThreadInterrupterVisitIsolates : public IsolateVisitor { | 243 class ThreadInterrupterVisitIsolates : public IsolateVisitor { |
| 252 public: | 244 public: |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 320 } | 312 } |
| 321 { | 313 { |
| 322 // Signal to main thread we are exiting. | 314 // Signal to main thread we are exiting. |
| 323 MonitorLocker shutdown_ml(monitor_); | 315 MonitorLocker shutdown_ml(monitor_); |
| 324 thread_running_ = false; | 316 thread_running_ = false; |
| 325 shutdown_ml.Notify(); | 317 shutdown_ml.Notify(); |
| 326 } | 318 } |
| 327 } | 319 } |
| 328 | 320 |
| 329 } // namespace dart | 321 } // namespace dart |
| OLD | NEW |