summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alan Viverette <alanv@google.com> 2016-02-29 20:12:37 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2016-02-29 20:12:38 +0000
commit89dea902c184a981392ceca90d28a7b5986952fc (patch)
tree58d4aee29fa4b82b2741885162e3917d67f1709c
parentb77f9ec93a11841aacb72d4fecd1bf56f6253254 (diff)
parent5c64b957dd710cce27134cd480e0b83563c50d7f (diff)
Merge "Use asset cookie in XML block cache key" into nyc-dev
-rw-r--r--core/java/android/content/res/Resources.java33
1 files changed, 20 insertions, 13 deletions
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index a9150e88701f..a54f40fc0814 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -68,6 +68,7 @@ import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.io.InputStream;
+import java.util.Arrays;
import java.util.Locale;
/**
@@ -119,6 +120,9 @@ public class Resources {
private static final LongSparseArray<android.content.res.ConstantState<ComplexColor>>
sPreloadedComplexColors = new LongSparseArray<>();
+ /** Size of the cyclical cache used to map XML files to blocks. */
+ private static final int XML_BLOCK_CACHE_SIZE = 4;
+
// Pool of TypedArrays targeted to this Resources object.
final SynchronizedPool<TypedArray> mTypedArrayPool = new SynchronizedPool<>(5);
@@ -154,8 +158,9 @@ public class Resources {
// Cyclical cache used for recently-accessed XML files.
private int mLastCachedXmlBlockIndex = -1;
- private final String[] mCachedXmlBlockFiles = new String[4];
- private final XmlBlock[] mCachedXmlBlocks = new XmlBlock[4];
+ private final int[] mCachedXmlBlockCookies = new int[XML_BLOCK_CACHE_SIZE];
+ private final String[] mCachedXmlBlockFiles = new String[XML_BLOCK_CACHE_SIZE];
+ private final XmlBlock[] mCachedXmlBlocks = new XmlBlock[XML_BLOCK_CACHE_SIZE];
final AssetManager mAssets;
final ClassLoader mClassLoader;
@@ -2339,18 +2344,18 @@ public class Resources {
* tools.
*/
public final void flushLayoutCache() {
- final String[] cachedXmlBlockFiles = mCachedXmlBlockFiles;
- final XmlBlock[] cachedXmlBlocks = mCachedXmlBlocks;
- synchronized (cachedXmlBlockFiles) {
- final int num = cachedXmlBlockFiles.length;
- for (int i = 0; i < num; i++) {
+ synchronized (mCachedXmlBlocks) {
+ Arrays.fill(mCachedXmlBlockCookies, 0);
+ Arrays.fill(mCachedXmlBlockFiles, null);
+
+ final XmlBlock[] cachedXmlBlocks = mCachedXmlBlocks;
+ for (int i = 0; i < XML_BLOCK_CACHE_SIZE; i++) {
final XmlBlock oldBlock = cachedXmlBlocks[i];
if (oldBlock != null) {
oldBlock.close();
}
- cachedXmlBlockFiles[i] = null;
- cachedXmlBlocks[i] = null;
}
+ Arrays.fill(cachedXmlBlocks, null);
}
}
@@ -2852,13 +2857,14 @@ public class Resources {
int assetCookie, @NonNull String type) throws NotFoundException {
if (id != 0) {
try {
- final String[] cachedXmlBlockFiles = mCachedXmlBlockFiles;
- final XmlBlock[] cachedXmlBlocks = mCachedXmlBlocks;
- synchronized (cachedXmlBlockFiles) {
+ synchronized (mCachedXmlBlocks) {
+ final int[] cachedXmlBlockCookies = mCachedXmlBlockCookies;
+ final String[] cachedXmlBlockFiles = mCachedXmlBlockFiles;
+ final XmlBlock[] cachedXmlBlocks = mCachedXmlBlocks;
// First see if this block is in our cache.
final int num = cachedXmlBlockFiles.length;
for (int i = 0; i < num; i++) {
- if (cachedXmlBlockFiles[i] != null
+ if (cachedXmlBlockCookies[i] == assetCookie && cachedXmlBlockFiles[i] != null
&& cachedXmlBlockFiles[i].equals(file)) {
return cachedXmlBlocks[i].newParser();
}
@@ -2874,6 +2880,7 @@ public class Resources {
if (oldBlock != null) {
oldBlock.close();
}
+ cachedXmlBlockCookies[pos] = assetCookie;
cachedXmlBlockFiles[pos] = file;
cachedXmlBlocks[pos] = block;
return block.newParser();