summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@android.com>2010-08-18 14:23:23 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2010-08-18 14:23:23 -0700
commitcf2c68c9c21b8af62e95374312355d22ed55e586 (patch)
tree32588fada21b6440d483f4b8dacdb8626746d56e
parent6d5bb88454db2fc798a07ec1085ef55572dbe670 (diff)
parent11709ab07ca2eb97dfa3fc7bb3e0996e65908ade (diff)
downloadframeworks_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.java34
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