Don't call exit() while threads may be running

It's unsafe to call exit() in C++ while there are running threads.
The remaining threads would race with static destructors, including
those for the standard library. Call _exit instead.

Bug: 150176543
Test: Boot AOSP, TreeHugger
Change-Id: Ieabf68f43e8b520714643e5ec36a8ca72cc83254
diff --git a/dalvikvm/dalvikvm.cc b/dalvikvm/dalvikvm.cc
index d46779e..4808a1f 100644
--- a/dalvikvm/dalvikvm.cc
+++ b/dalvikvm/dalvikvm.cc
@@ -214,5 +214,7 @@
 }
 
 int main(int argc, char** argv) {
-  return art::dalvikvm(argc, argv);
+  // Do not allow static destructors to be called, since it's conceivable that
+  // daemons may still awaken (literally).
+  _exit(art::dalvikvm(argc, argv));
 }
diff --git a/openjdkjvm/OpenjdkJvm.cc b/openjdkjvm/OpenjdkJvm.cc
index 8297c54..675a401 100644
--- a/openjdkjvm/OpenjdkJvm.cc
+++ b/openjdkjvm/OpenjdkJvm.cc
@@ -313,7 +313,9 @@
 JNIEXPORT __attribute__((noreturn)) void JVM_Exit(jint status) {
   LOG(INFO) << "System.exit called, status: " << status;
   art::Runtime::Current()->CallExitHook(status);
-  exit(status);
+  // Unsafe to call exit() while threads may still be running. They would race
+  // with static destructors.
+  _exit(status);
 }
 
 JNIEXPORT jstring JVM_NativeLoad(JNIEnv* env,
@@ -471,7 +473,7 @@
 }
 
 JNIEXPORT __attribute__((noreturn))  void JVM_Halt(jint code) {
-  exit(code);
+  _exit(code);
 }
 
 JNIEXPORT jboolean JVM_IsNaN(jdouble d) {