summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2012-03-15 17:48:02 -0700
committerJeff Brown <jeffbrown@google.com>2012-03-15 19:59:23 -0700
commit4280c4a93ea17f2e9d3f651e49d8c13dc3fb92aa (patch)
treef77523cff7d2f3a4d55ab2b3aa1ec0841d17cb89 /include
parent16f5f5cc9d4c480fac3dc7f176f3f1edfbd256f4 (diff)
downloadframeworks_base-4280c4a93ea17f2e9d3f651e49d8c13dc3fb92aa.zip
frameworks_base-4280c4a93ea17f2e9d3f651e49d8c13dc3fb92aa.tar.gz
frameworks_base-4280c4a93ea17f2e9d3f651e49d8c13dc3fb92aa.tar.bz2
If an application calls System.exit() terminate it immediately.
There is no graceful way to kill Android application processes. They typically have many threads running doing various things When System.exit() is called, those threads just keep going while the cleanup actions run until the process finally. Performing shutdown actions can easily cause more harm than good. For example, closing the Binder driver's file descriptor may cause other threads waiting on Binder to wake up and then crash in nasty ways after receiving EBADF. So when an Android application exits, skip the cleanup and just call _exit() to end it all. Bug: 6168809 Change-Id: I29790c064426a0bf7dae7cdf444eea3eef1d5275
Diffstat (limited to 'include')
-rw-r--r--include/android_runtime/AndroidRuntime.h16
1 files changed, 11 insertions, 5 deletions
diff --git a/include/android_runtime/AndroidRuntime.h b/include/android_runtime/AndroidRuntime.h
index fd33d59..0b3ce9a 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;