summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jeff Brown <jeffbrown@google.com> 2012-03-16 11:01:20 -0700
committer Android (Google) Code Review <android-gerrit@google.com> 2012-03-16 11:01:20 -0700
commit543ec1c808e0064371cdf491bb8ff1e08134ed93 (patch)
tree0b59ae11be2b413a9a841614a3e3cb692878a137
parentc1ac23db267c0acddfeed3204c2737d110ca0ab9 (diff)
parent4280c4a93ea17f2e9d3f651e49d8c13dc3fb92aa (diff)
Merge "If an application calls System.exit() terminate it immediately."
-rw-r--r--core/java/com/android/internal/os/RuntimeInit.java8
-rw-r--r--core/jni/AndroidRuntime.cpp26
-rw-r--r--include/android_runtime/AndroidRuntime.h16
3 files changed, 39 insertions, 11 deletions
diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java
index 333c12c75193..cdd2ad137b59 100644
--- a/core/java/com/android/internal/os/RuntimeInit.java
+++ b/core/java/com/android/internal/os/RuntimeInit.java
@@ -52,6 +52,7 @@ public class RuntimeInit {
private static final native void nativeZygoteInit();
private static final native void nativeFinishInit();
+ private static final native void nativeSetExitWithoutCleanup(boolean exitWithoutCleanup);
/**
* Use this to log a message when a thread exits due to an uncaught
@@ -281,6 +282,13 @@ public class RuntimeInit {
private static void applicationInit(int targetSdkVersion, String[] argv)
throws ZygoteInit.MethodAndArgsCaller {
+ // If the application calls System.exit(), terminate the process
+ // immediately without running any shutdown hooks. It is not possible to
+ // shutdown an Android application gracefully. Among other things, the
+ // Android runtime shutdown hooks close the Binder driver, which can cause
+ // leftover running threads to crash before the process actually exits.
+ nativeSetExitWithoutCleanup(true);
+
// We want to be fairly aggressive about heap utilization, to avoid
// holding on to a lot of memory that isn't needed.
VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index d33dccb8be6d..e705c4739626 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -199,6 +199,12 @@ static void com_android_internal_os_RuntimeInit_nativeZygoteInit(JNIEnv* env, jo
gCurRuntime->onZygoteInit();
}
+static void com_android_internal_os_RuntimeInit_nativeSetExitWithoutCleanup(JNIEnv* env,
+ jobject clazz, jboolean exitWithoutCleanup)
+{
+ gCurRuntime->setExitWithoutCleanup(exitWithoutCleanup);
+}
+
/*
* JNI registration.
*/
@@ -207,6 +213,8 @@ static JNINativeMethod gMethods[] = {
(void*) com_android_internal_os_RuntimeInit_nativeFinishInit },
{ "nativeZygoteInit", "()V",
(void*) com_android_internal_os_RuntimeInit_nativeZygoteInit },
+ { "nativeSetExitWithoutCleanup", "(Z)V",
+ (void*) com_android_internal_os_RuntimeInit_nativeSetExitWithoutCleanup },
};
int register_com_android_internal_os_RuntimeInit(JNIEnv* env)
@@ -220,7 +228,8 @@ int register_com_android_internal_os_RuntimeInit(JNIEnv* env)
/*static*/ JavaVM* AndroidRuntime::mJavaVM = NULL;
-AndroidRuntime::AndroidRuntime()
+AndroidRuntime::AndroidRuntime() :
+ mExitWithoutCleanup(false)
{
SkGraphics::Init();
// this sets our preference for 16bit images during decode
@@ -298,8 +307,7 @@ status_t AndroidRuntime::callMain(const char* className,
*/
static void runtime_exit(int code)
{
- gCurRuntime->onExit(code);
- exit(code);
+ gCurRuntime->exit(code);
}
/*
@@ -870,10 +878,16 @@ void AndroidRuntime::start(const char* className, const char* options)
ALOGW("Warning: VM did not shut down cleanly\n");
}
-void AndroidRuntime::onExit(int code)
+void AndroidRuntime::exit(int code)
{
- ALOGV("AndroidRuntime onExit calling exit(%d)", code);
- exit(code);
+ if (mExitWithoutCleanup) {
+ ALOGI("VM exiting with result code %d, cleanup skipped.", code);
+ ::_exit(code);
+ } else {
+ ALOGI("VM exiting with result code %d.", code);
+ onExit(code);
+ ::exit(code);
+ }
}
void AndroidRuntime::onVmCreated(JNIEnv* env)
diff --git a/include/android_runtime/AndroidRuntime.h b/include/android_runtime/AndroidRuntime.h
index fd33d59845d7..0b3ce9a261b4 100644
--- a/include/android_runtime/AndroidRuntime.h
+++ b/include/android_runtime/AndroidRuntime.h
@@ -66,6 +66,12 @@ public:
void start(const char *classname, const char* options);
+ void exit(int code);
+
+ void setExitWithoutCleanup(bool exitWithoutCleanup) {
+ mExitWithoutCleanup = exitWithoutCleanup;
+ }
+
static AndroidRuntime* getRuntime();
/**
@@ -86,14 +92,13 @@ public:
* fork. Override it to initialize threads, etc. Upon return, the
* correct static main will be invoked.
*/
- virtual void onZygoteInit() {};
-
+ virtual void onZygoteInit() { }
/**
- * Called when the Java application exits. The default
- * implementation calls exit(code).
+ * Called when the Java application exits to perform additional cleanup actions
+ * before the process is terminated.
*/
- virtual void onExit(int code);
+ virtual void onExit(int code) { }
/** create a new thread that is visible from Java */
static android_thread_id_t createJavaThread(const char* name, void (*start)(void *),
@@ -114,6 +119,7 @@ private:
int startVm(JavaVM** pJavaVM, JNIEnv** pEnv);
Vector<JavaVMOption> mOptions;
+ bool mExitWithoutCleanup;
/* JNI JavaVM pointer */
static JavaVM* mJavaVM;