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 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 | 178 |
179 Thread::Thread(bool init_vm_constants) | 179 Thread::Thread(bool init_vm_constants) |
180 : id_(OSThread::GetCurrentThreadId()), | 180 : id_(OSThread::GetCurrentThreadId()), |
181 thread_interrupt_callback_(NULL), | 181 thread_interrupt_callback_(NULL), |
182 thread_interrupt_data_(NULL), | 182 thread_interrupt_data_(NULL), |
183 isolate_(NULL), | 183 isolate_(NULL), |
184 heap_(NULL), | 184 heap_(NULL), |
185 timeline_block_(NULL), | 185 timeline_block_(NULL), |
186 store_buffer_block_(NULL), | 186 store_buffer_block_(NULL), |
187 log_(new class Log()), | 187 log_(new class Log()), |
188 deopt_id_(0), | |
189 vm_tag_(0), | |
190 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) | 188 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) |
191 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) | 189 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) |
192 reusable_handles_(), | 190 reusable_handles_(), |
193 cha_(NULL), | 191 cha_(NULL), |
| 192 deopt_id_(0), |
| 193 vm_tag_(0), |
| 194 pending_functions_(GrowableObjectArray::null()), |
194 no_callback_scope_depth_(0), | 195 no_callback_scope_depth_(0), |
195 thread_list_next_(NULL) { | 196 thread_list_next_(NULL) { |
196 ClearState(); | 197 ClearState(); |
197 | 198 |
198 #define DEFAULT_INIT(type_name, member_name, init_expr, default_init_value) \ | 199 #define DEFAULT_INIT(type_name, member_name, init_expr, default_init_value) \ |
199 member_name = default_init_value; | 200 member_name = default_init_value; |
200 CACHED_CONSTANTS_LIST(DEFAULT_INIT) | 201 CACHED_CONSTANTS_LIST(DEFAULT_INIT) |
201 #undef DEFAULT_INIT | 202 #undef DEFAULT_INIT |
202 | 203 |
203 #define DEFAULT_INIT(name) \ | 204 #define DEFAULT_INIT(name) \ |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 #undef INIT_VALUE | 244 #undef INIT_VALUE |
244 | 245 |
245 // Setup the thread specific reusable handles. | 246 // Setup the thread specific reusable handles. |
246 #define REUSABLE_HANDLE_ALLOCATION(object) \ | 247 #define REUSABLE_HANDLE_ALLOCATION(object) \ |
247 this->object##_handle_ = this->AllocateReusableHandle<object>(); | 248 this->object##_handle_ = this->AllocateReusableHandle<object>(); |
248 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_ALLOCATION) | 249 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_ALLOCATION) |
249 #undef REUSABLE_HANDLE_ALLOCATION | 250 #undef REUSABLE_HANDLE_ALLOCATION |
250 } | 251 } |
251 | 252 |
252 | 253 |
| 254 void Thread::ClearState() { |
| 255 memset(&state_, 0, sizeof(state_)); |
| 256 pending_functions_ = GrowableObjectArray::null(); |
| 257 } |
| 258 |
| 259 |
| 260 RawGrowableObjectArray* Thread::pending_functions() { |
| 261 if (pending_functions_ == GrowableObjectArray::null()) { |
| 262 pending_functions_ = GrowableObjectArray::New(Heap::kOld); |
| 263 } |
| 264 return pending_functions_; |
| 265 } |
| 266 |
| 267 |
253 void Thread::Schedule(Isolate* isolate, bool bypass_safepoint) { | 268 void Thread::Schedule(Isolate* isolate, bool bypass_safepoint) { |
254 State st; | 269 State st; |
255 if (isolate->thread_registry()->RestoreStateTo(this, &st, bypass_safepoint)) { | 270 if (isolate->thread_registry()->RestoreStateTo(this, &st, bypass_safepoint)) { |
256 ASSERT(isolate->thread_registry()->Contains(this)); | 271 ASSERT(isolate->thread_registry()->Contains(this)); |
257 state_ = st; | 272 state_ = st; |
258 } | 273 } |
259 } | 274 } |
260 | 275 |
261 | 276 |
262 void Thread::Unschedule(bool bypass_safepoint) { | 277 void Thread::Unschedule(bool bypass_safepoint) { |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 REUSABLE_HANDLE_LIST(CLEAR_REUSABLE_HANDLE) | 437 REUSABLE_HANDLE_LIST(CLEAR_REUSABLE_HANDLE) |
423 #undef CLEAR_REUSABLE_HANDLE | 438 #undef CLEAR_REUSABLE_HANDLE |
424 } | 439 } |
425 | 440 |
426 | 441 |
427 void Thread::VisitObjectPointers(ObjectPointerVisitor* visitor) { | 442 void Thread::VisitObjectPointers(ObjectPointerVisitor* visitor) { |
428 ASSERT(visitor != NULL); | 443 ASSERT(visitor != NULL); |
429 | 444 |
430 // Visit objects in thread specific handles area. | 445 // Visit objects in thread specific handles area. |
431 reusable_handles_.VisitObjectPointers(visitor); | 446 reusable_handles_.VisitObjectPointers(visitor); |
| 447 |
| 448 if (pending_functions_ != GrowableObjectArray::null()) { |
| 449 visitor->VisitPointer( |
| 450 reinterpret_cast<RawObject**>(&pending_functions_)); |
| 451 } |
432 } | 452 } |
433 | 453 |
434 | 454 |
435 void Thread::SetThreadInterrupter(ThreadInterruptCallback callback, | 455 void Thread::SetThreadInterrupter(ThreadInterruptCallback callback, |
436 void* data) { | 456 void* data) { |
437 ASSERT(Thread::Current() == this); | 457 ASSERT(Thread::Current() == this); |
438 thread_interrupt_callback_ = callback; | 458 thread_interrupt_callback_ = callback; |
439 thread_interrupt_data_ = data; | 459 thread_interrupt_data_ = data; |
440 } | 460 } |
441 | 461 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
523 Thread* ThreadIterator::Next() { | 543 Thread* ThreadIterator::Next() { |
524 ASSERT(Thread::thread_list_lock_ != NULL); | 544 ASSERT(Thread::thread_list_lock_ != NULL); |
525 ASSERT(Thread::thread_list_lock_->IsOwnedByCurrentThread()); | 545 ASSERT(Thread::thread_list_lock_->IsOwnedByCurrentThread()); |
526 Thread* current = next_; | 546 Thread* current = next_; |
527 next_ = next_->thread_list_next_; | 547 next_ = next_->thread_list_next_; |
528 return current; | 548 return current; |
529 } | 549 } |
530 | 550 |
531 | 551 |
532 } // namespace dart | 552 } // namespace dart |
OLD | NEW |