Merge "[SettingsProvider] skip caching in system server" into udc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
8858aacd4c
@@ -3036,9 +3036,7 @@ public final class Settings {
|
|||||||
|
|
||||||
public void destroy() {
|
public void destroy() {
|
||||||
try {
|
try {
|
||||||
// If this process is the system server process, mArray is the same object as
|
if (!mArray.isClosed()) {
|
||||||
// the memory int array kept inside SettingsProvider, so skipping the close()
|
|
||||||
if (!Settings.isInSystemServer() && !mArray.isClosed()) {
|
|
||||||
mArray.close();
|
mArray.close();
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@@ -3218,8 +3216,9 @@ public final class Settings {
|
|||||||
@UnsupportedAppUsage
|
@UnsupportedAppUsage
|
||||||
public String getStringForUser(ContentResolver cr, String name, final int userHandle) {
|
public String getStringForUser(ContentResolver cr, String name, final int userHandle) {
|
||||||
final boolean isSelf = (userHandle == UserHandle.myUserId());
|
final boolean isSelf = (userHandle == UserHandle.myUserId());
|
||||||
|
final boolean useCache = isSelf && !isInSystemServer();
|
||||||
boolean needsGenerationTracker = false;
|
boolean needsGenerationTracker = false;
|
||||||
if (isSelf) {
|
if (useCache) {
|
||||||
synchronized (NameValueCache.this) {
|
synchronized (NameValueCache.this) {
|
||||||
final GenerationTracker generationTracker = mGenerationTrackers.get(name);
|
final GenerationTracker generationTracker = mGenerationTrackers.get(name);
|
||||||
if (generationTracker != null) {
|
if (generationTracker != null) {
|
||||||
@@ -3251,8 +3250,10 @@ public final class Settings {
|
|||||||
needsGenerationTracker = true;
|
needsGenerationTracker = true;
|
||||||
} else {
|
} else {
|
||||||
if (DEBUG || LOCAL_LOGV) {
|
if (DEBUG || LOCAL_LOGV) {
|
||||||
Log.v(TAG, "get setting for user " + userHandle
|
Log.v(TAG, "get setting " + name + " for user " + userHandle + " by user "
|
||||||
+ " by user " + UserHandle.myUserId() + " so skipping cache");
|
+ UserHandle.myUserId()
|
||||||
|
+ (isInSystemServer() ? " in system_server" : "")
|
||||||
|
+ " so skipping cache");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3365,9 +3366,12 @@ public final class Settings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (LOCAL_LOGV) Log.i(TAG, "call-query of user " + userHandle
|
if (DEBUG || LOCAL_LOGV) {
|
||||||
+ " by " + UserHandle.myUserId()
|
Log.i(TAG, "call-query of user " + userHandle
|
||||||
+ " so not updating cache");
|
+ " by " + UserHandle.myUserId()
|
||||||
|
+ (isInSystemServer() ? " in system_server" : "")
|
||||||
|
+ " so not updating cache");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
@@ -3440,55 +3444,63 @@ public final class Settings {
|
|||||||
|
|
||||||
public ArrayMap<String, String> getStringsForPrefix(ContentResolver cr, String prefix,
|
public ArrayMap<String, String> getStringsForPrefix(ContentResolver cr, String prefix,
|
||||||
List<String> names) {
|
List<String> names) {
|
||||||
|
final boolean useCache = !isInSystemServer();
|
||||||
String namespace = prefix.substring(0, prefix.length() - 1);
|
String namespace = prefix.substring(0, prefix.length() - 1);
|
||||||
Config.enforceReadPermission(namespace);
|
Config.enforceReadPermission(namespace);
|
||||||
ArrayMap<String, String> keyValues = new ArrayMap<>();
|
ArrayMap<String, String> keyValues = new ArrayMap<>();
|
||||||
int currentGeneration = -1;
|
int currentGeneration = -1;
|
||||||
boolean needsGenerationTracker = false;
|
boolean needsGenerationTracker = false;
|
||||||
|
|
||||||
synchronized (NameValueCache.this) {
|
if (useCache) {
|
||||||
final GenerationTracker generationTracker = mGenerationTrackers.get(prefix);
|
synchronized (NameValueCache.this) {
|
||||||
if (generationTracker != null) {
|
final GenerationTracker generationTracker = mGenerationTrackers.get(prefix);
|
||||||
if (generationTracker.isGenerationChanged()) {
|
if (generationTracker != null) {
|
||||||
if (DEBUG) {
|
if (generationTracker.isGenerationChanged()) {
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
boolean prefixCached = mValues.containsKey(prefix);
|
|
||||||
if (prefixCached) {
|
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.i(TAG, "Cache hit for prefix:" + prefix);
|
Log.i(TAG, "Generation changed for prefix:" + prefix
|
||||||
|
+ " type:" + mUri.getPath()
|
||||||
|
+ " in package:" + cr.getPackageName());
|
||||||
}
|
}
|
||||||
if (!names.isEmpty()) {
|
for (int i = mValues.size() - 1; i >= 0; i--) {
|
||||||
for (String name : names) {
|
String key = mValues.keyAt(i);
|
||||||
if (mValues.containsKey(name)) {
|
if (key.startsWith(prefix)) {
|
||||||
keyValues.put(name, mValues.get(name));
|
mValues.remove(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;
|
} 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
currentGeneration = generationTracker.getCurrentGeneration();
|
||||||
|
} else {
|
||||||
|
needsGenerationTracker = true;
|
||||||
}
|
}
|
||||||
currentGeneration = generationTracker.getCurrentGeneration();
|
}
|
||||||
} else {
|
} else {
|
||||||
needsGenerationTracker = true;
|
if (DEBUG || LOCAL_LOGV) {
|
||||||
|
Log.v(TAG, "getting settings for prefix " + prefix + " in system_server"
|
||||||
|
+ " so skipping cache");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user