Index: runtime/vm/dart.cc |
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc |
index 14ff0e798884a2db91ca67bd87f34aed2b15b04a..8935ed07d622b6d503e38f180a47129b2d897a84 100644 |
--- a/runtime/vm/dart.cc |
+++ b/runtime/vm/dart.cc |
@@ -90,11 +90,8 @@ const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot, |
Isolate::SetEntropySourceCallback(entropy_source); |
OS::InitOnce(); |
VirtualMemory::InitOnce(); |
- Thread::InitOnceBeforeIsolate(); |
- Thread::EnsureInit(); |
+ OSThread::InitOnce(); |
Timeline::InitOnce(); |
- Thread* thread = Thread::Current(); |
- thread->set_name("Dart_Initialize"); |
TimelineDurationScope tds(Timeline::GetVMStream(), |
"Dart::InitOnce"); |
Isolate::InitOnce(); |
@@ -108,7 +105,6 @@ const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot, |
Metric::InitOnce(); |
StoreBuffer::InitOnce(); |
MarkingStack::InitOnce(); |
- Thread::EnsureInit(); |
#if defined(USING_SIMULATOR) |
Simulator::InitOnce(); |
@@ -120,8 +116,6 @@ const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot, |
ASSERT(thread_pool_ == NULL); |
thread_pool_ = new ThreadPool(); |
{ |
- Thread* T = Thread::Current(); |
- ASSERT(T != NULL); |
ASSERT(vm_isolate_ == NULL); |
ASSERT(Flags::Initialized()); |
const bool is_vm_isolate = true; |
@@ -137,6 +131,8 @@ const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot, |
ASSERT(vm_isolate_ == Isolate::Current()); |
ASSERT(vm_isolate_ == Thread::Current()->isolate()); |
+ Thread* T = Thread::Current(); |
+ ASSERT(T != NULL); |
StackZone zone(T); |
HandleScope handle_scope(T); |
Object::InitNull(vm_isolate_); |
@@ -180,7 +176,9 @@ const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot, |
} else { |
Symbols::InitOnce(vm_isolate_); |
} |
- Thread::InitOnceAfterObjectAndStubCode(); |
+ // We need to initialize the constants here for the vm isolate thread due to |
+ // bootstrapping issues. |
+ T->InitVMConstants(); |
Scanner::InitOnce(); |
#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) |
// Dart VM requires at least SSE2. |
@@ -250,7 +248,6 @@ const char* Dart::Cleanup() { |
thread_pool_ = NULL; |
// Set the VM isolate as current isolate. |
- Thread::EnsureInit(); |
Thread::EnterIsolate(vm_isolate_); |
ShutdownIsolate(); |
@@ -260,7 +257,12 @@ const char* Dart::Cleanup() { |
TargetCPUFeatures::Cleanup(); |
StoreBuffer::ShutDown(); |
- Thread::Shutdown(); |
+ // Delete the current thread's TLS and set it's TLS to null. |
+ // If it is the last thread then the destructor would call |
+ // OSThread::Cleanup. |
+ OSThread* os_thread = OSThread::Current(); |
+ OSThread::SetCurrent(NULL); |
+ delete os_thread; |
} else { |
// Shutdown the service isolate. |
ServiceIsolate::Shutdown(); |