diff options
| author | Brad Fitzpatrick <bradfitz@android.com> | 2010-08-18 14:23:23 -0700 |
|---|---|---|
| committer | Android Git Automerger <android-git-automerger@android.com> | 2010-08-18 14:23:23 -0700 |
| commit | cf2c68c9c21b8af62e95374312355d22ed55e586 (patch) | |
| tree | 32588fada21b6440d483f4b8dacdb8626746d56e | |
| parent | 6d5bb88454db2fc798a07ec1085ef55572dbe670 (diff) | |
| parent | 11709ab07ca2eb97dfa3fc7bb3e0996e65908ade (diff) | |
| download | frameworks_base-cf2c68c9c21b8af62e95374312355d22ed55e586.zip frameworks_base-cf2c68c9c21b8af62e95374312355d22ed55e586.tar.gz frameworks_base-cf2c68c9c21b8af62e95374312355d22ed55e586.tar.bz2 | |
am 11709ab0: Merge "Avoid unnecessary SharedPrefences disk writes." into gingerbread
Merge commit '11709ab07ca2eb97dfa3fc7bb3e0996e65908ade' into gingerbread-plus-aosp
* commit '11709ab07ca2eb97dfa3fc7bb3e0996e65908ade':
Avoid unnecessary SharedPrefences disk writes.
| -rw-r--r-- | core/java/android/app/ContextImpl.java | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 3bfc7e7..e7eb03e 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -2842,6 +2842,7 @@ class ContextImpl extends Context { boolean returnValue; boolean hasListeners; + boolean changesMade = false; List<String> keysModified = null; Set<OnSharedPreferenceChangeListener> listeners = null; @@ -2855,17 +2856,31 @@ class ContextImpl extends Context { synchronized (this) { if (mClear) { - mMap.clear(); + if (!mMap.isEmpty()) { + changesMade = true; + mMap.clear(); + } mClear = false; } for (Entry<String, Object> e : mModified.entrySet()) { String k = e.getKey(); Object v = e.getValue(); - if (v == this) { - mMap.remove(k); + if (v == this) { // magic value for a removal mutation + if (mMap.containsKey(k)) { + mMap.remove(k); + changesMade = true; + } } else { - mMap.put(k, v); + boolean isSame = false; + if (mMap.containsKey(k)) { + Object existingValue = mMap.get(k); + isSame = existingValue != null && existingValue.equals(v); + } + if (!isSame) { + mMap.put(k, v); + changesMade = true; + } } if (hasListeners) { @@ -2876,7 +2891,7 @@ class ContextImpl extends Context { mModified.clear(); } - returnValue = writeFileLocked(); + returnValue = writeFileLocked(changesMade); } if (hasListeners) { @@ -2921,9 +2936,16 @@ class ContextImpl extends Context { return str; } - private boolean writeFileLocked() { + private boolean writeFileLocked(boolean changesMade) { // Rename the current file so it may be used as a backup during the next read if (mFile.exists()) { + if (!changesMade) { + // If the file already exists, but no changes were + // made to the underlying map, it's wasteful to + // re-write the file. Return as if we wrote it + // out. + return true; + } if (!mBackupFile.exists()) { if (!mFile.renameTo(mBackupFile)) { Log.e(TAG, "Couldn't rename file " + mFile |
