Merge "snapshotcache: replce global lock with local one" into main
diff --git a/services/core/java/com/android/server/wm/ActivitySnapshotCache.java b/services/core/java/com/android/server/wm/ActivitySnapshotCache.java
index a54dd82..3609837 100644
--- a/services/core/java/com/android/server/wm/ActivitySnapshotCache.java
+++ b/services/core/java/com/android/server/wm/ActivitySnapshotCache.java
@@ -23,18 +23,20 @@
*/
class ActivitySnapshotCache extends SnapshotCache<ActivityRecord> {
- ActivitySnapshotCache(WindowManagerService service) {
- super(service, "Activity");
+ ActivitySnapshotCache() {
+ super("Activity");
}
@Override
void putSnapshot(ActivityRecord ar, TaskSnapshot snapshot) {
final int hasCode = System.identityHashCode(ar);
- final CacheEntry entry = mRunningCache.get(hasCode);
- if (entry != null) {
- mAppIdMap.remove(entry.topApp);
+ synchronized (mLock) {
+ final CacheEntry entry = mRunningCache.get(hasCode);
+ if (entry != null) {
+ mAppIdMap.remove(entry.topApp);
+ }
+ mAppIdMap.put(ar, hasCode);
+ mRunningCache.put(hasCode, new CacheEntry(snapshot, ar));
}
- mAppIdMap.put(ar, hasCode);
- mRunningCache.put(hasCode, new CacheEntry(snapshot, ar));
}
}
diff --git a/services/core/java/com/android/server/wm/ActivitySnapshotController.java b/services/core/java/com/android/server/wm/ActivitySnapshotController.java
index 1f013b9..f83003d 100644
--- a/services/core/java/com/android/server/wm/ActivitySnapshotController.java
+++ b/services/core/java/com/android/server/wm/ActivitySnapshotController.java
@@ -102,7 +102,7 @@
Environment::getDataSystemCeDirectory);
mPersister = new TaskSnapshotPersister(persistQueue, mPersistInfoProvider);
mSnapshotLoader = new AppSnapshotLoader(mPersistInfoProvider);
- initialize(new ActivitySnapshotCache(service));
+ initialize(new ActivitySnapshotCache());
final boolean snapshotEnabled =
!service.mContext
diff --git a/services/core/java/com/android/server/wm/SnapshotCache.java b/services/core/java/com/android/server/wm/SnapshotCache.java
index 401b260..8680436 100644
--- a/services/core/java/com/android/server/wm/SnapshotCache.java
+++ b/services/core/java/com/android/server/wm/SnapshotCache.java
@@ -19,6 +19,8 @@
import android.util.ArrayMap;
import android.window.TaskSnapshot;
+import com.android.internal.annotations.GuardedBy;
+
import java.io.PrintWriter;
/**
@@ -26,25 +28,31 @@
* @param <TYPE> The basic type, either Task or ActivityRecord
*/
abstract class SnapshotCache<TYPE extends WindowContainer> {
- protected final WindowManagerService mService;
+ protected final Object mLock = new Object();
+
protected final String mName;
+
+ @GuardedBy("mLock")
protected final ArrayMap<ActivityRecord, Integer> mAppIdMap = new ArrayMap<>();
+
+ @GuardedBy("mLock")
protected final ArrayMap<Integer, CacheEntry> mRunningCache = new ArrayMap<>();
- SnapshotCache(WindowManagerService service, String name) {
- mService = service;
+ SnapshotCache(String name) {
mName = name;
}
abstract void putSnapshot(TYPE window, TaskSnapshot snapshot);
void clearRunningCache() {
- mRunningCache.clear();
+ synchronized (mLock) {
+ mRunningCache.clear();
+ }
}
@Nullable
final TaskSnapshot getSnapshot(Integer id) {
- synchronized (mService.mGlobalLock) {
+ synchronized (mLock) {
// Try the running cache.
final CacheEntry entry = mRunningCache.get(id);
if (entry != null) {
@@ -56,17 +64,21 @@
/** Called when an app token has been removed. */
void onAppRemoved(ActivityRecord activity) {
- final Integer id = mAppIdMap.get(activity);
- if (id != null) {
- removeRunningEntry(id);
+ synchronized (mLock) {
+ final Integer id = mAppIdMap.get(activity);
+ if (id != null) {
+ removeRunningEntry(id);
+ }
}
}
/** Called when an app window token's process died. */
void onAppDied(ActivityRecord activity) {
- final Integer id = mAppIdMap.get(activity);
- if (id != null) {
- removeRunningEntry(id);
+ synchronized (mLock) {
+ final Integer id = mAppIdMap.get(activity);
+ if (id != null) {
+ removeRunningEntry(id);
+ }
}
}
@@ -75,10 +87,12 @@
}
void removeRunningEntry(Integer id) {
- final CacheEntry entry = mRunningCache.get(id);
- if (entry != null) {
- mAppIdMap.remove(entry.topApp);
- mRunningCache.remove(id);
+ synchronized (mLock) {
+ final CacheEntry entry = mRunningCache.get(id);
+ if (entry != null) {
+ mAppIdMap.remove(entry.topApp);
+ mRunningCache.remove(id);
+ }
}
}
@@ -86,11 +100,14 @@
final String doublePrefix = prefix + " ";
final String triplePrefix = doublePrefix + " ";
pw.println(prefix + "SnapshotCache " + mName);
- for (int i = mRunningCache.size() - 1; i >= 0; i--) {
- final CacheEntry entry = mRunningCache.valueAt(i);
- pw.println(doublePrefix + "Entry token=" + mRunningCache.keyAt(i));
- pw.println(triplePrefix + "topApp=" + entry.topApp);
- pw.println(triplePrefix + "snapshot=" + entry.snapshot);
+
+ synchronized (mLock) {
+ for (int i = mRunningCache.size() - 1; i >= 0; i--) {
+ final CacheEntry entry = mRunningCache.valueAt(i);
+ pw.println(doublePrefix + "Entry token=" + mRunningCache.keyAt(i));
+ pw.println(triplePrefix + "topApp=" + entry.topApp);
+ pw.println(triplePrefix + "snapshot=" + entry.snapshot);
+ }
}
}
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotCache.java b/services/core/java/com/android/server/wm/TaskSnapshotCache.java
index 33486cc..b69ac1b 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotCache.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotCache.java
@@ -28,19 +28,21 @@
private final AppSnapshotLoader mLoader;
- TaskSnapshotCache(WindowManagerService service, AppSnapshotLoader loader) {
- super(service, "Task");
+ TaskSnapshotCache(AppSnapshotLoader loader) {
+ super("Task");
mLoader = loader;
}
void putSnapshot(Task task, TaskSnapshot snapshot) {
- final CacheEntry entry = mRunningCache.get(task.mTaskId);
- if (entry != null) {
- mAppIdMap.remove(entry.topApp);
+ synchronized (mLock) {
+ final CacheEntry entry = mRunningCache.get(task.mTaskId);
+ if (entry != null) {
+ mAppIdMap.remove(entry.topApp);
+ }
+ final ActivityRecord top = task.getTopMostActivity();
+ mAppIdMap.put(top, task.mTaskId);
+ mRunningCache.put(task.mTaskId, new CacheEntry(snapshot, top));
}
- final ActivityRecord top = task.getTopMostActivity();
- mAppIdMap.put(top, task.mTaskId);
- mRunningCache.put(task.mTaskId, new CacheEntry(snapshot, top));
}
/**
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index d8e18e4..8b622d2 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -68,7 +68,7 @@
Environment::getDataSystemCeDirectory);
mPersister = new TaskSnapshotPersister(persistQueue, mPersistInfoProvider);
- initialize(new TaskSnapshotCache(service, new AppSnapshotLoader(mPersistInfoProvider)));
+ initialize(new TaskSnapshotCache(new AppSnapshotLoader(mPersistInfoProvider)));
final boolean snapshotEnabled =
!service.mContext
.getResources()
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotCacheTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotCacheTest.java
index 06d30fc..29f48b8 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotCacheTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotCacheTest.java
@@ -58,7 +58,7 @@
public void setUp() {
super.setUp();
MockitoAnnotations.initMocks(this);
- mCache = new TaskSnapshotCache(mWm, mLoader);
+ mCache = new TaskSnapshotCache(mLoader);
}
@Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotLowResDisabledTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotLowResDisabledTest.java
index df5f3d1..7432537 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotLowResDisabledTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotLowResDisabledTest.java
@@ -61,7 +61,7 @@
public void setUp() {
super.setUp();
MockitoAnnotations.initMocks(this);
- mCache = new TaskSnapshotCache(mWm, mLoader);
+ mCache = new TaskSnapshotCache(mLoader);
}
@Test