summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Hans Boehm <hboehm@google.com> 2020-03-09 14:23:23 -0700
committer Hans Boehm <hboehm@google.com> 2020-04-13 20:44:56 +0000
commit36896be3815ce0db8dd5f23accfbee24492d7f8a (patch)
treefa9c3af4dc45508efa1fe557c9e8d8c65afd9753
parent69847caf009afebbc299e24a3cba890adb23750e (diff)
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
-rw-r--r--dalvikvm/dalvikvm.cc4
-rw-r--r--openjdkjvm/OpenjdkJvm.cc6
2 files changed, 7 insertions, 3 deletions
diff --git a/dalvikvm/dalvikvm.cc b/dalvikvm/dalvikvm.cc
index d46779ecfb..4808a1fa09 100644
--- a/dalvikvm/dalvikvm.cc
+++ b/dalvikvm/dalvikvm.cc
@@ -214,5 +214,7 @@ extern "C" const char *__asan_default_options() {
}
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 8297c54174..675a401bb6 100644
--- a/openjdkjvm/OpenjdkJvm.cc
+++ b/openjdkjvm/OpenjdkJvm.cc
@@ -313,7 +313,9 @@ JNIEXPORT void JVM_GC(void) {
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)) jboolean JVM_RaiseSignal(jint signum ATTRIBU
}
JNIEXPORT __attribute__((noreturn)) void JVM_Halt(jint code) {
- exit(code);
+ _exit(code);
}
JNIEXPORT jboolean JVM_IsNaN(jdouble d) {