From 6c2e2f34718043f36488b4a94879dc2605aaac49 Mon Sep 17 00:00:00 2001 From: John Reck Date: Mon, 22 Aug 2011 13:41:23 -0700 Subject: Add bulletproofing to state recovery Bug: 5166335 Change-Id: Ife9ef2da7664f8de6b0ff9655611efa78d84df05 --- src/com/android/browser/CrashRecoveryHandler.java | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src/com/android/browser/CrashRecoveryHandler.java') diff --git a/src/com/android/browser/CrashRecoveryHandler.java b/src/com/android/browser/CrashRecoveryHandler.java index 8cb5929..c2fbbd2 100644 --- a/src/com/android/browser/CrashRecoveryHandler.java +++ b/src/com/android/browser/CrashRecoveryHandler.java @@ -34,6 +34,7 @@ import java.io.IOException; public class CrashRecoveryHandler { + private static final boolean LOGV_ENABLED = Browser.LOGV_ENABLED; private static final String LOGTAG = "BrowserCrashRecovery"; private static final String STATE_FILE = "browser_state.parcel"; private static final String RECOVERY_PREFERENCES = "browser_recovery_prefs"; @@ -84,14 +85,26 @@ public class CrashRecoveryHandler { public void handleMessage(Message msg) { switch (msg.what) { case MSG_WRITE_STATE: + if (LOGV_ENABLED) { + Log.v(LOGTAG, "Saving crash recovery state"); + } Parcel p = Parcel.obtain(); try { Bundle state = (Bundle) msg.obj; state.writeToParcel(p, 0); - File stateFile = new File(mContext.getCacheDir(), STATE_FILE); - FileOutputStream fout = new FileOutputStream(stateFile); + File stateJournal = new File(mContext.getCacheDir(), + STATE_FILE + ".journal"); + FileOutputStream fout = new FileOutputStream(stateJournal); fout.write(p.marshall()); fout.close(); + File stateFile = new File(mContext.getCacheDir(), + STATE_FILE); + if (!stateJournal.renameTo(stateFile)) { + // Failed to rename, try deleting the existing + // file and try again + stateFile.delete(); + stateJournal.renameTo(stateFile); + } } catch (Throwable e) { Log.i(LOGTAG, "Failed to save persistent state", e); } finally { @@ -99,6 +112,9 @@ public class CrashRecoveryHandler { } break; case MSG_CLEAR_STATE: + if (LOGV_ENABLED) { + Log.v(LOGTAG, "Clearing crash recovery state"); + } File state = new File(mContext.getCacheDir(), STATE_FILE); if (state.exists()) { state.delete(); -- cgit v1.1