summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/provider/Settings.java100
1 files changed, 44 insertions, 56 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 49425452c3aa..2efb26593780 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -3036,7 +3036,9 @@ public final class Settings {
public void destroy() {
try {
- if (!mArray.isClosed()) {
+ // If this process is the system server process, mArray is the same object as
+ // the memory int array kept inside SettingsProvider, so skipping the close()
+ if (!Settings.isInSystemServer() && !mArray.isClosed()) {
mArray.close();
}
} catch (IOException e) {
@@ -3216,9 +3218,8 @@ public final class Settings {
@UnsupportedAppUsage
public String getStringForUser(ContentResolver cr, String name, final int userHandle) {
final boolean isSelf = (userHandle == UserHandle.myUserId());
- final boolean useCache = isSelf && !isInSystemServer();
boolean needsGenerationTracker = false;
- if (useCache) {
+ if (isSelf) {
synchronized (NameValueCache.this) {
final GenerationTracker generationTracker = mGenerationTrackers.get(name);
if (generationTracker != null) {
@@ -3250,10 +3251,8 @@ public final class Settings {
needsGenerationTracker = true;
} else {
if (DEBUG || LOCAL_LOGV) {
- Log.v(TAG, "get setting " + name + " for user " + userHandle + " by user "
- + UserHandle.myUserId()
- + (isInSystemServer() ? " in system_server" : "")
- + " so skipping cache");
+ Log.v(TAG, "get setting for user " + userHandle
+ + " by user " + UserHandle.myUserId() + " so skipping cache");
}
}
@@ -3366,12 +3365,9 @@ public final class Settings {
}
}
} else {
- if (DEBUG || LOCAL_LOGV) {
- Log.i(TAG, "call-query of user " + userHandle
- + " by " + UserHandle.myUserId()
- + (isInSystemServer() ? " in system_server" : "")
- + " so not updating cache");
- }
+ if (LOCAL_LOGV) Log.i(TAG, "call-query of user " + userHandle
+ + " by " + UserHandle.myUserId()
+ + " so not updating cache");
}
return value;
}
@@ -3444,63 +3440,55 @@ public final class Settings {
public ArrayMap<String, String> getStringsForPrefix(ContentResolver cr, String prefix,
List<String> names) {
- final boolean useCache = !isInSystemServer();
String namespace = prefix.substring(0, prefix.length() - 1);
Config.enforceReadPermission(namespace);
ArrayMap<String, String> keyValues = new ArrayMap<>();
int currentGeneration = -1;
boolean needsGenerationTracker = false;
- if (useCache) {
- synchronized (NameValueCache.this) {
- final GenerationTracker generationTracker = mGenerationTrackers.get(prefix);
- if (generationTracker != null) {
- if (generationTracker.isGenerationChanged()) {
- if (DEBUG) {
- Log.i(TAG, "Generation changed for prefix:" + prefix
- + " type:" + mUri.getPath()
- + " in package:" + cr.getPackageName());
+ synchronized (NameValueCache.this) {
+ final GenerationTracker generationTracker = mGenerationTrackers.get(prefix);
+ if (generationTracker != null) {
+ if (generationTracker.isGenerationChanged()) {
+ if (DEBUG) {
+ Log.i(TAG, "Generation changed for prefix:" + prefix
+ + " type:" + mUri.getPath()
+ + " in package:" + cr.getPackageName());
+ }
+ for (int i = mValues.size() - 1; i >= 0; i--) {
+ String key = mValues.keyAt(i);
+ if (key.startsWith(prefix)) {
+ mValues.remove(key);
}
- for (int i = mValues.size() - 1; i >= 0; i--) {
- String key = mValues.keyAt(i);
- if (key.startsWith(prefix)) {
- mValues.remove(key);
- }
+ }
+ } else {
+ boolean prefixCached = mValues.containsKey(prefix);
+ if (prefixCached) {
+ if (DEBUG) {
+ Log.i(TAG, "Cache hit for prefix:" + prefix);
}
- } else {
- boolean prefixCached = mValues.containsKey(prefix);
- if (prefixCached) {
- if (DEBUG) {
- Log.i(TAG, "Cache hit for prefix:" + prefix);
- }
- if (!names.isEmpty()) {
- for (String name : names) {
- if (mValues.containsKey(name)) {
- keyValues.put(name, mValues.get(name));
- }
+ if (!names.isEmpty()) {
+ for (String name : names) {
+ if (mValues.containsKey(name)) {
+ keyValues.put(name, mValues.get(name));
}
- } else {
- for (int i = 0; i < mValues.size(); ++i) {
- String key = mValues.keyAt(i);
- // Explicitly exclude the prefix as it is only there to
- // signal that the prefix has been cached.
- if (key.startsWith(prefix) && !key.equals(prefix)) {
- keyValues.put(key, mValues.get(key));
- }
+ }
+ } else {
+ for (int i = 0; i < mValues.size(); ++i) {
+ String key = mValues.keyAt(i);
+ // Explicitly exclude the prefix as it is only there to
+ // signal that the prefix has been cached.
+ if (key.startsWith(prefix) && !key.equals(prefix)) {
+ keyValues.put(key, mValues.get(key));
}
}
- return keyValues;
}
+ return keyValues;
}
- currentGeneration = generationTracker.getCurrentGeneration();
- } else {
- needsGenerationTracker = true;
}
- }
- } else {
- if (DEBUG || LOCAL_LOGV) {
- Log.v(TAG, "getting settings for prefix " + prefix + " in system_server"
- + " so skipping cache");
+ currentGeneration = generationTracker.getCurrentGeneration();
+ } else {
+ needsGenerationTracker = true;
}
}