| 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/object.h" | 10 #include "vm/object.h" |
| 11 #include "vm/os_thread.h" | 11 #include "vm/os_thread.h" |
| 12 #include "vm/profiler.h" | 12 #include "vm/profiler.h" |
| 13 #include "vm/runtime_entry.h" |
| 13 #include "vm/stub_code.h" | 14 #include "vm/stub_code.h" |
| 14 #include "vm/thread_interrupter.h" | 15 #include "vm/thread_interrupter.h" |
| 15 #include "vm/thread_registry.h" | 16 #include "vm/thread_registry.h" |
| 16 | 17 |
| 17 namespace dart { | 18 namespace dart { |
| 18 | 19 |
| 19 // The single thread local key which stores all the thread local data | 20 // The single thread local key which stores all the thread local data |
| 20 // for a thread. | 21 // for a thread. |
| 21 ThreadLocalKey Thread::thread_key_ = OSThread::kUnsetThreadLocalKey; | 22 ThreadLocalKey Thread::thread_key_ = OSThread::kUnsetThreadLocalKey; |
| 22 | 23 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 | 102 |
| 102 | 103 |
| 103 Thread::Thread(bool init_vm_constants) | 104 Thread::Thread(bool init_vm_constants) |
| 104 : id_(OSThread::GetCurrentThreadId()), | 105 : id_(OSThread::GetCurrentThreadId()), |
| 105 thread_interrupt_callback_(NULL), | 106 thread_interrupt_callback_(NULL), |
| 106 thread_interrupt_data_(NULL), | 107 thread_interrupt_data_(NULL), |
| 107 isolate_(NULL), | 108 isolate_(NULL), |
| 108 heap_(NULL), | 109 heap_(NULL), |
| 109 store_buffer_block_(NULL) { | 110 store_buffer_block_(NULL) { |
| 110 ClearState(); | 111 ClearState(); |
| 112 |
| 111 #define DEFAULT_INIT(type_name, member_name, init_expr, default_init_value) \ | 113 #define DEFAULT_INIT(type_name, member_name, init_expr, default_init_value) \ |
| 112 member_name = default_init_value; | 114 member_name = default_init_value; |
| 113 CACHED_CONSTANTS_LIST(DEFAULT_INIT) | 115 CACHED_CONSTANTS_LIST(DEFAULT_INIT) |
| 114 #undef DEFAULT_INIT | 116 #undef DEFAULT_INIT |
| 117 |
| 118 #define DEFAULT_INIT(name) \ |
| 119 name##_entry_point_ = 0; |
| 120 RUNTIME_ENTRY_LIST(DEFAULT_INIT) |
| 121 #undef DEFAULT_INIT |
| 122 |
| 123 #define DEFAULT_INIT(returntype, name, ...) \ |
| 124 name##_entry_point_ = 0; |
| 125 LEAF_RUNTIME_ENTRY_LIST(DEFAULT_INIT) |
| 126 #undef DEFAULT_INIT |
| 127 |
| 115 if (init_vm_constants) { | 128 if (init_vm_constants) { |
| 116 InitVMConstants(); | 129 InitVMConstants(); |
| 117 } | 130 } |
| 118 SetCurrent(this); | 131 SetCurrent(this); |
| 119 } | 132 } |
| 120 | 133 |
| 121 | 134 |
| 122 void Thread::InitVMConstants() { | 135 void Thread::InitVMConstants() { |
| 123 #define ASSERT_VM_HEAP(type_name, member_name, init_expr, default_init_value) \ | 136 #define ASSERT_VM_HEAP(type_name, member_name, init_expr, default_init_value) \ |
| 124 ASSERT((init_expr)->IsOldObject()); | 137 ASSERT((init_expr)->IsOldObject()); |
| 125 CACHED_VM_OBJECTS_LIST(ASSERT_VM_HEAP) | 138 CACHED_VM_OBJECTS_LIST(ASSERT_VM_HEAP) |
| 126 #undef ASSERT_VM_HEAP | 139 #undef ASSERT_VM_HEAP |
| 127 | 140 |
| 128 #define INIT_VALUE(type_name, member_name, init_expr, default_init_value) \ | 141 #define INIT_VALUE(type_name, member_name, init_expr, default_init_value) \ |
| 129 ASSERT(member_name == default_init_value); \ | 142 ASSERT(member_name == default_init_value); \ |
| 130 member_name = (init_expr); | 143 member_name = (init_expr); |
| 131 CACHED_CONSTANTS_LIST(INIT_VALUE) | 144 CACHED_CONSTANTS_LIST(INIT_VALUE) |
| 132 #undef INIT_VALUE | 145 #undef INIT_VALUE |
| 146 |
| 147 #define INIT_VALUE(name) \ |
| 148 ASSERT(name##_entry_point_ == 0); \ |
| 149 name##_entry_point_ = k##name##RuntimeEntry.GetEntryPoint(); |
| 150 RUNTIME_ENTRY_LIST(INIT_VALUE) |
| 151 #undef INIT_VALUE |
| 152 |
| 153 #define INIT_VALUE(returntype, name, ...) \ |
| 154 ASSERT(name##_entry_point_ == 0); \ |
| 155 name##_entry_point_ = k##name##RuntimeEntry.GetEntryPoint(); |
| 156 LEAF_RUNTIME_ENTRY_LIST(INIT_VALUE) |
| 157 #undef INIT_VALUE |
| 133 } | 158 } |
| 134 | 159 |
| 135 | 160 |
| 136 void Thread::Schedule(Isolate* isolate, bool bypass_safepoint) { | 161 void Thread::Schedule(Isolate* isolate, bool bypass_safepoint) { |
| 137 State st; | 162 State st; |
| 138 if (isolate->thread_registry()->RestoreStateTo(this, &st, bypass_safepoint)) { | 163 if (isolate->thread_registry()->RestoreStateTo(this, &st, bypass_safepoint)) { |
| 139 ASSERT(isolate->thread_registry()->Contains(this)); | 164 ASSERT(isolate->thread_registry()->Contains(this)); |
| 140 state_ = st; | 165 state_ = st; |
| 141 } | 166 } |
| 142 } | 167 } |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 intptr_t Thread::OffsetFromThread(const Object& object) { | 344 intptr_t Thread::OffsetFromThread(const Object& object) { |
| 320 #define COMPUTE_OFFSET(type_name, member_name, expr, default_init_value) \ | 345 #define COMPUTE_OFFSET(type_name, member_name, expr, default_init_value) \ |
| 321 ASSERT((expr)->IsVMHeapObject()); \ | 346 ASSERT((expr)->IsVMHeapObject()); \ |
| 322 if (object.raw() == expr) return Thread::member_name##offset(); | 347 if (object.raw() == expr) return Thread::member_name##offset(); |
| 323 CACHED_VM_OBJECTS_LIST(COMPUTE_OFFSET) | 348 CACHED_VM_OBJECTS_LIST(COMPUTE_OFFSET) |
| 324 #undef COMPUTE_OFFSET | 349 #undef COMPUTE_OFFSET |
| 325 UNREACHABLE(); | 350 UNREACHABLE(); |
| 326 return -1; | 351 return -1; |
| 327 } | 352 } |
| 328 | 353 |
| 354 intptr_t Thread::OffsetFromThread(const RuntimeEntry* runtime_entry) { |
| 355 #define COMPUTE_OFFSET(name) \ |
| 356 if (runtime_entry->function() == k##name##RuntimeEntry.function()) { \ |
| 357 return Thread::name##_entry_point_offset(); \ |
| 358 } |
| 359 RUNTIME_ENTRY_LIST(COMPUTE_OFFSET) |
| 360 #undef COMPUTE_OFFSET |
| 361 |
| 362 #define COMPUTE_OFFSET(returntype, name, ...) \ |
| 363 if (runtime_entry->function() == k##name##RuntimeEntry.function()) { \ |
| 364 return Thread::name##_entry_point_offset(); \ |
| 365 } |
| 366 LEAF_RUNTIME_ENTRY_LIST(COMPUTE_OFFSET) |
| 367 #undef COMPUTE_OFFSET |
| 368 |
| 369 UNREACHABLE(); |
| 370 return -1; |
| 371 } |
| 372 |
| 329 } // namespace dart | 373 } // namespace dart |
| OLD | NEW |