summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kenny Root <kroot@google.com> 2010-10-15 00:08:22 -0700
committer Android Git Automerger <android-git-automerger@android.com> 2010-10-15 00:08:22 -0700
commit9456714cfb9eb5ba4882fdcc922b787d77ed4da4 (patch)
treeecf5b32ba086af72d8936c60a48bb6468d7f9960
parentb079a106524c8028a1602b6df9be5d273a6552cf (diff)
parentb4f26a9d37caf7762b66b68d50825c5b075b42bd (diff)
am b4f26a9d: am e6ae5c39: Merge "Add shutdown assurance" into gingerbread
Merge commit 'b4f26a9d37caf7762b66b68d50825c5b075b42bd' * commit 'b4f26a9d37caf7762b66b68d50825c5b075b42bd': Add shutdown assurance
-rw-r--r--core/java/com/android/internal/app/ShutdownThread.java33
-rw-r--r--services/java/com/android/server/SystemServer.java19
2 files changed, 48 insertions, 4 deletions
diff --git a/core/java/com/android/internal/app/ShutdownThread.java b/core/java/com/android/internal/app/ShutdownThread.java
index d6f5db145257..1b851691065c 100644
--- a/core/java/com/android/internal/app/ShutdownThread.java
+++ b/core/java/com/android/internal/app/ShutdownThread.java
@@ -35,6 +35,7 @@ import android.os.PowerManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
+import android.os.SystemProperties;
import android.os.Vibrator;
import android.os.storage.IMountService;
import android.os.storage.IMountShutdownObserver;
@@ -62,6 +63,9 @@ public final class ShutdownThread extends Thread {
private static boolean mReboot;
private static String mRebootReason;
+ // Provides shutdown assurance in case the system_server is killed
+ public static final String SHUTDOWN_ACTION_PROPERTY = "sys.shutdown.requested";
+
// static instance of this thread
private static final ShutdownThread sInstance = new ShutdownThread();
@@ -244,7 +248,17 @@ public final class ShutdownThread extends Thread {
actionDone();
}
};
-
+
+ /*
+ * Write a system property in case the system_server reboots before we
+ * get to the actual hardware restart. If that happens, we'll retry at
+ * the beginning of the SystemServer startup.
+ */
+ {
+ String reason = (mReboot ? "1" : "0") + (mRebootReason != null ? mRebootReason : "");
+ SystemProperties.set(SHUTDOWN_ACTION_PROPERTY, reason);
+ }
+
Log.i(TAG, "Sending shutdown broadcast...");
// First send the high-level shut down broadcast.
@@ -374,10 +388,21 @@ public final class ShutdownThread extends Thread {
}
}
- if (mReboot) {
- Log.i(TAG, "Rebooting, reason: " + mRebootReason);
+ rebootOrShutdown(mReboot, mRebootReason);
+ }
+
+ /**
+ * Do not call this directly. Use {@link #reboot(Context, String, boolean)}
+ * or {@link #shutdown(Context, boolean)} instead.
+ *
+ * @param reboot true to reboot or false to shutdown
+ * @param reason reason for reboot
+ */
+ public static void rebootOrShutdown(boolean reboot, String reason) {
+ if (reboot) {
+ Log.i(TAG, "Rebooting, reason: " + reason);
try {
- Power.reboot(mRebootReason);
+ Power.reboot(reason);
} catch (Exception e) {
Log.e(TAG, "Reboot failed, will attempt shutdown instead", e);
}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 2da3e3b0c959..a6de8ed53422 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -17,6 +17,7 @@
package com.android.server;
import com.android.server.am.ActivityManagerService;
+import com.android.internal.app.ShutdownThread;
import com.android.internal.os.BinderInternal;
import com.android.internal.os.SamplingProfilerIntegration;
import com.trustedlogic.trustednfc.android.server.NfcService;
@@ -88,6 +89,24 @@ class ServerThread extends Thread {
BinderInternal.disableBackgroundScheduling(true);
android.os.Process.setCanSelfBackground(false);
+ // Check whether we failed to shut down last time we tried.
+ {
+ final String shutdownAction = SystemProperties.get(
+ ShutdownThread.SHUTDOWN_ACTION_PROPERTY, "");
+ if (shutdownAction != null && shutdownAction.length() > 0) {
+ boolean reboot = (shutdownAction.charAt(0) == '1');
+
+ final String reason;
+ if (shutdownAction.length() > 1) {
+ reason = shutdownAction.substring(1, shutdownAction.length());
+ } else {
+ reason = null;
+ }
+
+ ShutdownThread.rebootOrShutdown(reboot, reason);
+ }
+ }
+
String factoryTestStr = SystemProperties.get("ro.factorytest");
int factoryTest = "".equals(factoryTestStr) ? SystemServer.FACTORY_TEST_OFF
: Integer.parseInt(factoryTestStr);