diff options
| author | 2010-10-15 00:08:22 -0700 | |
|---|---|---|
| committer | 2010-10-15 00:08:22 -0700 | |
| commit | 9456714cfb9eb5ba4882fdcc922b787d77ed4da4 (patch) | |
| tree | ecf5b32ba086af72d8936c60a48bb6468d7f9960 | |
| parent | b079a106524c8028a1602b6df9be5d273a6552cf (diff) | |
| parent | b4f26a9d37caf7762b66b68d50825c5b075b42bd (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.java | 33 | ||||
| -rw-r--r-- | services/java/com/android/server/SystemServer.java | 19 |
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); |