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 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 #endif | 106 #endif |
107 | 107 |
108 | 108 |
109 Thread::Thread(bool init_vm_constants) | 109 Thread::Thread(bool init_vm_constants) |
110 : id_(OSThread::GetCurrentThreadId()), | 110 : id_(OSThread::GetCurrentThreadId()), |
111 thread_interrupt_callback_(NULL), | 111 thread_interrupt_callback_(NULL), |
112 thread_interrupt_data_(NULL), | 112 thread_interrupt_data_(NULL), |
113 isolate_(NULL), | 113 isolate_(NULL), |
114 heap_(NULL), | 114 heap_(NULL), |
115 store_buffer_block_(NULL), | 115 store_buffer_block_(NULL), |
116 log_(new class Log()) { | 116 log_(new class Log()), |
| 117 vm_tag_(0) { |
117 ClearState(); | 118 ClearState(); |
118 | 119 |
119 #define DEFAULT_INIT(type_name, member_name, init_expr, default_init_value) \ | 120 #define DEFAULT_INIT(type_name, member_name, init_expr, default_init_value) \ |
120 member_name = default_init_value; | 121 member_name = default_init_value; |
121 CACHED_CONSTANTS_LIST(DEFAULT_INIT) | 122 CACHED_CONSTANTS_LIST(DEFAULT_INIT) |
122 #undef DEFAULT_INIT | 123 #undef DEFAULT_INIT |
123 | 124 |
124 #define DEFAULT_INIT(name) \ | 125 #define DEFAULT_INIT(name) \ |
125 name##_entry_point_ = 0; | 126 name##_entry_point_ = 0; |
126 RUNTIME_ENTRY_LIST(DEFAULT_INIT) | 127 RUNTIME_ENTRY_LIST(DEFAULT_INIT) |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 } | 182 } |
182 | 183 |
183 | 184 |
184 void Thread::EnterIsolate(Isolate* isolate) { | 185 void Thread::EnterIsolate(Isolate* isolate) { |
185 Thread* thread = Thread::Current(); | 186 Thread* thread = Thread::Current(); |
186 ASSERT(thread != NULL); | 187 ASSERT(thread != NULL); |
187 ASSERT(thread->isolate() == NULL); | 188 ASSERT(thread->isolate() == NULL); |
188 ASSERT(!isolate->HasMutatorThread()); | 189 ASSERT(!isolate->HasMutatorThread()); |
189 thread->isolate_ = isolate; | 190 thread->isolate_ = isolate; |
190 isolate->MakeCurrentThreadMutator(thread); | 191 isolate->MakeCurrentThreadMutator(thread); |
191 isolate->set_vm_tag(VMTag::kVMTagId); | 192 thread->set_vm_tag(VMTag::kVMTagId); |
192 ASSERT(thread->store_buffer_block_ == NULL); | 193 ASSERT(thread->store_buffer_block_ == NULL); |
193 thread->StoreBufferAcquire(); | 194 thread->StoreBufferAcquire(); |
194 ASSERT(isolate->heap() != NULL); | 195 ASSERT(isolate->heap() != NULL); |
195 thread->heap_ = isolate->heap(); | 196 thread->heap_ = isolate->heap(); |
196 thread->Schedule(isolate); | 197 thread->Schedule(isolate); |
197 // TODO(koda): Migrate profiler interface to use Thread. | 198 // TODO(koda): Migrate profiler interface to use Thread. |
198 Profiler::BeginExecution(isolate); | 199 Profiler::BeginExecution(isolate); |
199 } | 200 } |
200 | 201 |
201 | 202 |
202 void Thread::ExitIsolate() { | 203 void Thread::ExitIsolate() { |
203 Thread* thread = Thread::Current(); | 204 Thread* thread = Thread::Current(); |
204 // TODO(koda): Audit callers; they should know whether they're in an isolate. | 205 // TODO(koda): Audit callers; they should know whether they're in an isolate. |
205 if (thread == NULL || thread->isolate() == NULL) return; | 206 if (thread == NULL || thread->isolate() == NULL) return; |
206 Isolate* isolate = thread->isolate(); | 207 Isolate* isolate = thread->isolate(); |
207 Profiler::EndExecution(isolate); | 208 Profiler::EndExecution(isolate); |
208 thread->Unschedule(); | 209 thread->Unschedule(); |
209 // TODO(koda): Move store_buffer_block_ into State. | 210 // TODO(koda): Move store_buffer_block_ into State. |
210 thread->StoreBufferRelease(); | 211 thread->StoreBufferRelease(); |
211 if (isolate->is_runnable()) { | 212 if (isolate->is_runnable()) { |
212 isolate->set_vm_tag(VMTag::kIdleTagId); | 213 thread->set_vm_tag(VMTag::kIdleTagId); |
213 } else { | 214 } else { |
214 isolate->set_vm_tag(VMTag::kLoadWaitTagId); | 215 thread->set_vm_tag(VMTag::kLoadWaitTagId); |
215 } | 216 } |
216 isolate->ClearMutatorThread(); | 217 isolate->ClearMutatorThread(); |
217 thread->isolate_ = NULL; | 218 thread->isolate_ = NULL; |
218 ASSERT(Isolate::Current() == NULL); | 219 ASSERT(Isolate::Current() == NULL); |
219 thread->heap_ = NULL; | 220 thread->heap_ = NULL; |
220 } | 221 } |
221 | 222 |
222 | 223 |
223 void Thread::EnterIsolateAsHelper(Isolate* isolate, bool bypass_safepoint) { | 224 void Thread::EnterIsolateAsHelper(Isolate* isolate, bool bypass_safepoint) { |
224 Thread* thread = Thread::Current(); | 225 Thread* thread = Thread::Current(); |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 return Thread::name##_entry_point_offset(); \ | 377 return Thread::name##_entry_point_offset(); \ |
377 } | 378 } |
378 LEAF_RUNTIME_ENTRY_LIST(COMPUTE_OFFSET) | 379 LEAF_RUNTIME_ENTRY_LIST(COMPUTE_OFFSET) |
379 #undef COMPUTE_OFFSET | 380 #undef COMPUTE_OFFSET |
380 | 381 |
381 UNREACHABLE(); | 382 UNREACHABLE(); |
382 return -1; | 383 return -1; |
383 } | 384 } |
384 | 385 |
385 } // namespace dart | 386 } // namespace dart |
OLD | NEW |