OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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.h" | 5 #include "vm/thread.h" |
6 | 6 |
7 #include "vm/growable_array.h" | 7 #include "vm/growable_array.h" |
8 #include "vm/isolate.h" | 8 #include "vm/isolate.h" |
9 #include "vm/lockers.h" | 9 #include "vm/lockers.h" |
10 #include "vm/log.h" | 10 #include "vm/log.h" |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 while (current != NULL) { | 59 while (current != NULL) { |
60 ASSERT(current != thread); | 60 ASSERT(current != thread); |
61 current = current->thread_list_next_; | 61 current = current->thread_list_next_; |
62 } | 62 } |
63 } | 63 } |
64 #endif | 64 #endif |
65 | 65 |
66 // Insert at head of list. | 66 // Insert at head of list. |
67 thread->thread_list_next_ = thread_list_head_; | 67 thread->thread_list_next_ = thread_list_head_; |
68 thread_list_head_ = thread; | 68 thread_list_head_ = thread; |
| 69 |
| 70 // Make sure the thread interrupter is awake. |
| 71 ThreadInterrupter::WakeUp(); |
69 } | 72 } |
70 | 73 |
71 | 74 |
72 void Thread::RemoveThreadFromList(Thread* thread) { | 75 void Thread::RemoveThreadFromList(Thread* thread) { |
73 ASSERT(thread != NULL); | 76 ASSERT(thread != NULL); |
74 ASSERT(thread->isolate() == NULL); | 77 ASSERT(thread->isolate() == NULL); |
75 ASSERT(thread_list_lock_ != NULL); | 78 ASSERT(thread_list_lock_ != NULL); |
76 MutexLocker ml(thread_list_lock_); | 79 MutexLocker ml(thread_list_lock_); |
77 | 80 |
78 // Handle case where |thread| is head of list. | 81 // Handle case where |thread| is head of list. |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 #endif // defined(DEBUG) | 176 #endif // defined(DEBUG) |
174 | 177 |
175 #define REUSABLE_HANDLE_INITIALIZERS(object) \ | 178 #define REUSABLE_HANDLE_INITIALIZERS(object) \ |
176 object##_handle_(NULL), | 179 object##_handle_(NULL), |
177 | 180 |
178 | 181 |
179 Thread::Thread(bool init_vm_constants) | 182 Thread::Thread(bool init_vm_constants) |
180 : id_(OSThread::GetCurrentThreadId()), | 183 : id_(OSThread::GetCurrentThreadId()), |
181 thread_interrupt_callback_(NULL), | 184 thread_interrupt_callback_(NULL), |
182 thread_interrupt_data_(NULL), | 185 thread_interrupt_data_(NULL), |
| 186 thread_interrupt_disabled_(0), |
183 isolate_(NULL), | 187 isolate_(NULL), |
184 heap_(NULL), | 188 heap_(NULL), |
185 timeline_block_(NULL), | 189 timeline_block_(NULL), |
186 store_buffer_block_(NULL), | 190 store_buffer_block_(NULL), |
187 log_(new class Log()), | 191 log_(new class Log()), |
188 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) | 192 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) |
189 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) | 193 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) |
190 reusable_handles_(), | 194 reusable_handles_(), |
191 cha_(NULL), | 195 cha_(NULL), |
192 deopt_id_(0), | 196 deopt_id_(0), |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
445 // Visit objects in thread specific handles area. | 449 // Visit objects in thread specific handles area. |
446 reusable_handles_.VisitObjectPointers(visitor); | 450 reusable_handles_.VisitObjectPointers(visitor); |
447 | 451 |
448 if (pending_functions_ != GrowableObjectArray::null()) { | 452 if (pending_functions_ != GrowableObjectArray::null()) { |
449 visitor->VisitPointer( | 453 visitor->VisitPointer( |
450 reinterpret_cast<RawObject**>(&pending_functions_)); | 454 reinterpret_cast<RawObject**>(&pending_functions_)); |
451 } | 455 } |
452 } | 456 } |
453 | 457 |
454 | 458 |
| 459 void Thread::DisableThreadInterrupts() { |
| 460 ASSERT(Thread::Current() == this); |
| 461 AtomicOperations::FetchAndIncrement(&thread_interrupt_disabled_); |
| 462 } |
| 463 |
| 464 |
| 465 void Thread::EnableThreadInterrupts() { |
| 466 ASSERT(Thread::Current() == this); |
| 467 uintptr_t old = |
| 468 AtomicOperations::FetchAndDecrement(&thread_interrupt_disabled_); |
| 469 if (old == 1) { |
| 470 // We just decremented from 1 to 0. |
| 471 // Make sure the thread interrupter is awake. |
| 472 ThreadInterrupter::WakeUp(); |
| 473 } |
| 474 } |
| 475 |
| 476 |
| 477 bool Thread::ThreadInterruptsEnabled() { |
| 478 return AtomicOperations::LoadRelaxed(&thread_interrupt_disabled_) == 0; |
| 479 } |
| 480 |
| 481 |
455 void Thread::SetThreadInterrupter(ThreadInterruptCallback callback, | 482 void Thread::SetThreadInterrupter(ThreadInterruptCallback callback, |
456 void* data) { | 483 void* data) { |
457 ASSERT(Thread::Current() == this); | 484 ASSERT(Thread::Current() == this); |
458 thread_interrupt_callback_ = callback; | 485 thread_interrupt_callback_ = callback; |
459 thread_interrupt_data_ = data; | 486 thread_interrupt_data_ = data; |
460 } | 487 } |
461 | 488 |
462 | 489 |
463 bool Thread::IsThreadInterrupterEnabled(ThreadInterruptCallback* callback, | 490 bool Thread::IsThreadInterrupterEnabled(ThreadInterruptCallback* callback, |
464 void** data) const { | 491 void** data) const { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 Thread* ThreadIterator::Next() { | 570 Thread* ThreadIterator::Next() { |
544 ASSERT(Thread::thread_list_lock_ != NULL); | 571 ASSERT(Thread::thread_list_lock_ != NULL); |
545 ASSERT(Thread::thread_list_lock_->IsOwnedByCurrentThread()); | 572 ASSERT(Thread::thread_list_lock_->IsOwnedByCurrentThread()); |
546 Thread* current = next_; | 573 Thread* current = next_; |
547 next_ = next_->thread_list_next_; | 574 next_ = next_->thread_list_next_; |
548 return current; | 575 return current; |
549 } | 576 } |
550 | 577 |
551 | 578 |
552 } // namespace dart | 579 } // namespace dart |
OLD | NEW |