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/dart.h" | 5 #include "vm/dart.h" |
6 | 6 |
7 #include "vm/code_observers.h" | 7 #include "vm/code_observers.h" |
8 #include "vm/cpu.h" | 8 #include "vm/cpu.h" |
9 #include "vm/dart_api_state.h" | 9 #include "vm/dart_api_state.h" |
10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 Dart_EntropySource entropy_source, | 83 Dart_EntropySource entropy_source, |
84 Dart_GetVMServiceAssetsArchive get_service_assets) { | 84 Dart_GetVMServiceAssetsArchive get_service_assets) { |
85 // TODO(iposva): Fix race condition here. | 85 // TODO(iposva): Fix race condition here. |
86 if (vm_isolate_ != NULL || !Flags::Initialized()) { | 86 if (vm_isolate_ != NULL || !Flags::Initialized()) { |
87 return "VM already initialized or flags not initialized."; | 87 return "VM already initialized or flags not initialized."; |
88 } | 88 } |
89 Isolate::SetFileCallbacks(file_open, file_read, file_write, file_close); | 89 Isolate::SetFileCallbacks(file_open, file_read, file_write, file_close); |
90 Isolate::SetEntropySourceCallback(entropy_source); | 90 Isolate::SetEntropySourceCallback(entropy_source); |
91 OS::InitOnce(); | 91 OS::InitOnce(); |
92 VirtualMemory::InitOnce(); | 92 VirtualMemory::InitOnce(); |
93 Thread::InitOnceBeforeIsolate(); | 93 OSThread::InitOnce(); |
94 Thread::EnsureInit(); | |
95 Timeline::InitOnce(); | 94 Timeline::InitOnce(); |
96 Thread* thread = Thread::Current(); | |
97 thread->set_name("Dart_Initialize"); | |
98 TimelineDurationScope tds(Timeline::GetVMStream(), | 95 TimelineDurationScope tds(Timeline::GetVMStream(), |
99 "Dart::InitOnce"); | 96 "Dart::InitOnce"); |
100 Isolate::InitOnce(); | 97 Isolate::InitOnce(); |
101 PortMap::InitOnce(); | 98 PortMap::InitOnce(); |
102 FreeListElement::InitOnce(); | 99 FreeListElement::InitOnce(); |
103 Api::InitOnce(); | 100 Api::InitOnce(); |
104 CodeObservers::InitOnce(); | 101 CodeObservers::InitOnce(); |
105 ThreadInterrupter::InitOnce(); | 102 ThreadInterrupter::InitOnce(); |
106 Profiler::InitOnce(); | 103 Profiler::InitOnce(); |
107 SemiSpace::InitOnce(); | 104 SemiSpace::InitOnce(); |
108 Metric::InitOnce(); | 105 Metric::InitOnce(); |
109 StoreBuffer::InitOnce(); | 106 StoreBuffer::InitOnce(); |
110 MarkingStack::InitOnce(); | 107 MarkingStack::InitOnce(); |
111 Thread::EnsureInit(); | |
112 | 108 |
113 #if defined(USING_SIMULATOR) | 109 #if defined(USING_SIMULATOR) |
114 Simulator::InitOnce(); | 110 Simulator::InitOnce(); |
115 #endif | 111 #endif |
116 // Create the read-only handles area. | 112 // Create the read-only handles area. |
117 ASSERT(predefined_handles_ == NULL); | 113 ASSERT(predefined_handles_ == NULL); |
118 predefined_handles_ = new ReadOnlyHandles(); | 114 predefined_handles_ = new ReadOnlyHandles(); |
119 // Create the VM isolate and finish the VM initialization. | 115 // Create the VM isolate and finish the VM initialization. |
120 ASSERT(thread_pool_ == NULL); | 116 ASSERT(thread_pool_ == NULL); |
121 thread_pool_ = new ThreadPool(); | 117 thread_pool_ = new ThreadPool(); |
122 { | 118 { |
123 Thread* T = Thread::Current(); | |
124 ASSERT(T != NULL); | |
125 ASSERT(vm_isolate_ == NULL); | 119 ASSERT(vm_isolate_ == NULL); |
126 ASSERT(Flags::Initialized()); | 120 ASSERT(Flags::Initialized()); |
127 const bool is_vm_isolate = true; | 121 const bool is_vm_isolate = true; |
128 const bool precompiled = instructions_snapshot != NULL; | 122 const bool precompiled = instructions_snapshot != NULL; |
129 | 123 |
130 // Setup default flags for the VM isolate. | 124 // Setup default flags for the VM isolate. |
131 Isolate::Flags vm_flags; | 125 Isolate::Flags vm_flags; |
132 Dart_IsolateFlags api_flags; | 126 Dart_IsolateFlags api_flags; |
133 vm_flags.CopyTo(&api_flags); | 127 vm_flags.CopyTo(&api_flags); |
134 vm_isolate_ = Isolate::Init("vm-isolate", api_flags, is_vm_isolate); | 128 vm_isolate_ = Isolate::Init("vm-isolate", api_flags, is_vm_isolate); |
135 vm_isolate_->set_compilation_allowed(!precompiled); | 129 vm_isolate_->set_compilation_allowed(!precompiled); |
136 // Verify assumptions about executing in the VM isolate. | 130 // Verify assumptions about executing in the VM isolate. |
137 ASSERT(vm_isolate_ == Isolate::Current()); | 131 ASSERT(vm_isolate_ == Isolate::Current()); |
138 ASSERT(vm_isolate_ == Thread::Current()->isolate()); | 132 ASSERT(vm_isolate_ == Thread::Current()->isolate()); |
139 | 133 |
| 134 Thread* T = Thread::Current(); |
| 135 ASSERT(T != NULL); |
140 StackZone zone(T); | 136 StackZone zone(T); |
141 HandleScope handle_scope(T); | 137 HandleScope handle_scope(T); |
142 Object::InitNull(vm_isolate_); | 138 Object::InitNull(vm_isolate_); |
143 ObjectStore::Init(vm_isolate_); | 139 ObjectStore::Init(vm_isolate_); |
144 TargetCPUFeatures::InitOnce(); | 140 TargetCPUFeatures::InitOnce(); |
145 Object::InitOnce(vm_isolate_); | 141 Object::InitOnce(vm_isolate_); |
146 ArgumentsDescriptor::InitOnce(); | 142 ArgumentsDescriptor::InitOnce(); |
147 ICData::InitOnce(); | 143 ICData::InitOnce(); |
148 // When precompiled the stub code is initialized from the snapshot. | 144 // When precompiled the stub code is initialized from the snapshot. |
149 if (!precompiled) { | 145 if (!precompiled) { |
(...skipping 23 matching lines...) Expand all Loading... |
173 MegamorphicCacheTable::PrintSizes(vm_isolate_); | 169 MegamorphicCacheTable::PrintSizes(vm_isolate_); |
174 intptr_t size; | 170 intptr_t size; |
175 intptr_t capacity; | 171 intptr_t capacity; |
176 Symbols::GetStats(vm_isolate_, &size, &capacity); | 172 Symbols::GetStats(vm_isolate_, &size, &capacity); |
177 OS::Print("VM Isolate: Number of symbols : %" Pd "\n", size); | 173 OS::Print("VM Isolate: Number of symbols : %" Pd "\n", size); |
178 OS::Print("VM Isolate: Symbol table capacity : %" Pd "\n", capacity); | 174 OS::Print("VM Isolate: Symbol table capacity : %" Pd "\n", capacity); |
179 } | 175 } |
180 } else { | 176 } else { |
181 Symbols::InitOnce(vm_isolate_); | 177 Symbols::InitOnce(vm_isolate_); |
182 } | 178 } |
183 Thread::InitOnceAfterObjectAndStubCode(); | 179 // We need to initialize the constants here for the vm isolate thread due to |
| 180 // bootstrapping issues. |
| 181 T->InitVMConstants(); |
184 Scanner::InitOnce(); | 182 Scanner::InitOnce(); |
185 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) | 183 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) |
186 // Dart VM requires at least SSE2. | 184 // Dart VM requires at least SSE2. |
187 if (!TargetCPUFeatures::sse2_supported()) { | 185 if (!TargetCPUFeatures::sse2_supported()) { |
188 return "SSE2 is required."; | 186 return "SSE2 is required."; |
189 } | 187 } |
190 #endif | 188 #endif |
191 Object::FinalizeVMIsolate(vm_isolate_); | 189 Object::FinalizeVMIsolate(vm_isolate_); |
192 #if defined(DEBUG) | 190 #if defined(DEBUG) |
193 vm_isolate_->heap()->Verify(kRequireMarked); | 191 vm_isolate_->heap()->Verify(kRequireMarked); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 | 241 |
244 // Wait for all application isolates and the service isolate to shutdown | 242 // Wait for all application isolates and the service isolate to shutdown |
245 // before shutting down the thread pool. | 243 // before shutting down the thread pool. |
246 WaitForIsolateShutdown(); | 244 WaitForIsolateShutdown(); |
247 | 245 |
248 // Shutdown the thread pool. On return, all thread pool threads have exited. | 246 // Shutdown the thread pool. On return, all thread pool threads have exited. |
249 delete thread_pool_; | 247 delete thread_pool_; |
250 thread_pool_ = NULL; | 248 thread_pool_ = NULL; |
251 | 249 |
252 // Set the VM isolate as current isolate. | 250 // Set the VM isolate as current isolate. |
253 Thread::EnsureInit(); | |
254 Thread::EnterIsolate(vm_isolate_); | 251 Thread::EnterIsolate(vm_isolate_); |
255 | 252 |
256 ShutdownIsolate(); | 253 ShutdownIsolate(); |
257 vm_isolate_ = NULL; | 254 vm_isolate_ = NULL; |
258 ASSERT(Isolate::IsolateListLength() == 0); | 255 ASSERT(Isolate::IsolateListLength() == 0); |
259 | 256 |
260 TargetCPUFeatures::Cleanup(); | 257 TargetCPUFeatures::Cleanup(); |
261 StoreBuffer::ShutDown(); | 258 StoreBuffer::ShutDown(); |
262 | 259 |
263 Thread::Shutdown(); | 260 // Delete the current thread's TLS and set it's TLS to null. |
| 261 // If it is the last thread then the destructor would call |
| 262 // OSThread::Cleanup. |
| 263 OSThread* os_thread = OSThread::Current(); |
| 264 OSThread::SetCurrent(NULL); |
| 265 delete os_thread; |
264 } else { | 266 } else { |
265 // Shutdown the service isolate. | 267 // Shutdown the service isolate. |
266 ServiceIsolate::Shutdown(); | 268 ServiceIsolate::Shutdown(); |
267 } | 269 } |
268 | 270 |
269 CodeObservers::DeleteAll(); | 271 CodeObservers::DeleteAll(); |
270 Timeline::Shutdown(); | 272 Timeline::Shutdown(); |
271 Metric::Cleanup(); | 273 Metric::Cleanup(); |
272 | 274 |
273 return NULL; | 275 return NULL; |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
436 return predefined_handles_->handles_.IsValidScopedHandle(address); | 438 return predefined_handles_->handles_.IsValidScopedHandle(address); |
437 } | 439 } |
438 | 440 |
439 | 441 |
440 bool Dart::IsReadOnlyApiHandle(Dart_Handle handle) { | 442 bool Dart::IsReadOnlyApiHandle(Dart_Handle handle) { |
441 ASSERT(predefined_handles_ != NULL); | 443 ASSERT(predefined_handles_ != NULL); |
442 return predefined_handles_->api_handles_.IsValidHandle(handle); | 444 return predefined_handles_->api_handles_.IsValidHandle(handle); |
443 } | 445 } |
444 | 446 |
445 } // namespace dart | 447 } // namespace dart |
OLD | NEW |