Index: chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java |
index a38c1c49b2bd15897994928a972312c55fed8929..9aea9801823bbc8d361841df358f332b9d6c876b 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java |
@@ -40,6 +40,7 @@ import java.io.FileOutputStream; |
import java.io.IOException; |
import java.util.ArrayDeque; |
import java.util.ArrayList; |
+import java.util.Arrays; |
import java.util.Deque; |
import java.util.List; |
import java.util.concurrent.ExecutionException; |
@@ -178,6 +179,7 @@ public class TabPersistentStore extends TabPersister { |
private SharedPreferences mPreferences; |
private AsyncTask<Void, Void, DataInputStream> mPrefetchTabListTask; |
+ private byte[] mLastSavedMetadata; |
@VisibleForTesting |
AsyncTask<Void, Void, TabState> mPrefetchActiveTabTask; |
@@ -258,7 +260,7 @@ public class TabPersistentStore extends TabPersister { |
private void logExecutionTime(String name, long time) { |
if (LibraryLoader.isInitialized()) { |
RecordHistogram.recordTimesHistogram("Android.StrictMode.TabPersistentStore." + name, |
- SystemClock.elapsedRealtime() - time, TimeUnit.MILLISECONDS); |
+ SystemClock.uptimeMillis() - time, TimeUnit.MILLISECONDS); |
} |
} |
@@ -266,7 +268,7 @@ public class TabPersistentStore extends TabPersister { |
// Temporarily allowing disk access. TODO: Fix. See http://b/5518024 |
StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites(); |
try { |
- long time = SystemClock.elapsedRealtime(); |
+ long saveStateStartTime = SystemClock.uptimeMillis(); |
// The list of tabs should be saved first in case our activity is terminated early. |
// Explicitly toss out any existing SaveListTask because they only save the TabModel as |
// it looked when the SaveListTask was first created. |
@@ -276,6 +278,7 @@ public class TabPersistentStore extends TabPersister { |
} catch (IOException e) { |
Log.w(TAG, "Error while saving tabs state; will attempt to continue...", e); |
} |
+ logExecutionTime("SaveListTime", saveStateStartTime); |
// Add current tabs to save because they did not get a save signal yet. |
Tab currentStandardTab = TabModelUtils.getCurrentTab(mTabModelSelector.getModel(false)); |
@@ -310,6 +313,7 @@ public class TabPersistentStore extends TabPersister { |
mSaveTabTask = null; |
} |
+ long saveTabsStartTime = SystemClock.uptimeMillis(); |
// Synchronously save any remaining unsaved tabs (hopefully very few). |
for (Tab tab : mTabsToSave) { |
int id = tab.getId(); |
@@ -331,7 +335,8 @@ public class TabPersistentStore extends TabPersister { |
} |
} |
mTabsToSave.clear(); |
- logExecutionTime("SaveStateTime", time); |
+ logExecutionTime("SaveTabsTime", saveTabsStartTime); |
+ logExecutionTime("SaveStateTime", saveStateStartTime); |
} finally { |
StrictMode.setThreadPolicy(oldPolicy); |
} |
@@ -341,7 +346,7 @@ public class TabPersistentStore extends TabPersister { |
* Restore saved state. Must be called before any tabs are added to the list. |
*/ |
public void loadState() { |
- long time = SystemClock.elapsedRealtime(); |
+ long time = SystemClock.uptimeMillis(); |
waitForMigrationToFinish(); |
logExecutionTime("LoadStateTime", time); |
@@ -350,11 +355,11 @@ public class TabPersistentStore extends TabPersister { |
mNormalTabsRestored = new SparseIntArray(); |
mIncognitoTabsRestored = new SparseIntArray(); |
try { |
- time = SystemClock.elapsedRealtime(); |
+ time = SystemClock.uptimeMillis(); |
assert mTabModelSelector.getModel(true).getCount() == 0; |
assert mTabModelSelector.getModel(false).getCount() == 0; |
checkAndUpdateMaxTabId(); |
- long timeWaitingForPrefetch = SystemClock.elapsedRealtime(); |
+ long timeWaitingForPrefetch = SystemClock.uptimeMillis(); |
DataInputStream stream = mPrefetchTabListTask.get(); |
logExecutionTime("LoadStateInternalPrefetchTime", timeWaitingForPrefetch); |
readSavedStateFile(stream, |
@@ -440,11 +445,11 @@ public class TabPersistentStore extends TabPersister { |
// 2. restoreTab is used to preempt async queue and restore immediately on the UI thread. |
StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); |
try { |
- long time = SystemClock.elapsedRealtime(); |
+ long time = SystemClock.uptimeMillis(); |
TabState state; |
int restoredTabId = mPreferences.getInt(PREF_ACTIVE_TAB_ID, Tab.INVALID_TAB_ID); |
if (restoredTabId == tabToRestore.id && mPrefetchActiveTabTask != null) { |
- long timeWaitingForPrefetch = SystemClock.elapsedRealtime(); |
+ long timeWaitingForPrefetch = SystemClock.uptimeMillis(); |
state = mPrefetchActiveTabTask.get(); |
logExecutionTime("RestoreTabPrefetchTime", timeWaitingForPrefetch); |
} else { |
@@ -713,7 +718,14 @@ public class TabPersistentStore extends TabPersister { |
} |
private void saveListToFile(byte[] listData) { |
+ if (Arrays.equals(mLastSavedMetadata, listData)) return; |
+ |
saveListToFile(getStateDirectory(), listData); |
+ mLastSavedMetadata = listData; |
+ if (LibraryLoader.isInitialized()) { |
+ RecordHistogram.recordCountHistogram( |
+ "Android.TabPersistentStore.MetadataFileSize", listData.length); |
+ } |
} |
/** |
@@ -810,7 +822,7 @@ public class TabPersistentStore extends TabPersister { |
private int readSavedStateFile(DataInputStream stream, OnTabStateReadCallback callback) |
throws IOException { |
- long time = SystemClock.elapsedRealtime(); |
+ long time = SystemClock.uptimeMillis(); |
int nextId = 0; |
boolean skipUrlRead = false; |
boolean skipIncognitoCount = false; |