summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yifei Zhang <yfz@google.com> 2024-02-14 17:59:13 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-02-14 17:59:13 +0000
commitf0a3517fb73ca4653f4f14683b6f03dc360a72cc (patch)
tree37fe84049c87dfd2e93350b7bb7fb3197f24ab71
parentc8d07d64f539a14d5729d2d416ed0d6ed085215f (diff)
parentc08978ce4dfa3612e5cb5130d1fc9a58d4cf611b (diff)
Merge "snapshotcache: replce global lock with local one" into main
-rw-r--r--services/core/java/com/android/server/wm/ActivitySnapshotCache.java16
-rw-r--r--services/core/java/com/android/server/wm/ActivitySnapshotController.java2
-rw-r--r--services/core/java/com/android/server/wm/SnapshotCache.java57
-rw-r--r--services/core/java/com/android/server/wm/TaskSnapshotCache.java18
-rw-r--r--services/core/java/com/android/server/wm/TaskSnapshotController.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskSnapshotCacheTest.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskSnapshotLowResDisabledTest.java2
7 files changed, 60 insertions, 39 deletions
diff --git a/services/core/java/com/android/server/wm/ActivitySnapshotCache.java b/services/core/java/com/android/server/wm/ActivitySnapshotCache.java
index a54dd826b5bb..3609837f417b 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 @@ import android.window.TaskSnapshot;
*/
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 1f013b913283..f83003d4e278 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 @@ class ActivitySnapshotController extends AbsAppSnapshotController<ActivityRecord
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 401b2604c28f..86804360f6f4 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.annotation.Nullable;
import android.util.ArrayMap;
import android.window.TaskSnapshot;
+import com.android.internal.annotations.GuardedBy;
+
import java.io.PrintWriter;
/**
@@ -26,25 +28,31 @@ import java.io.PrintWriter;
* @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 @@ abstract class SnapshotCache<TYPE extends WindowContainer> {
/** 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 @@ abstract class SnapshotCache<TYPE extends WindowContainer> {
}
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 @@ abstract class SnapshotCache<TYPE extends WindowContainer> {
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 33486ccb995f..b69ac1bb2795 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 @@ class TaskSnapshotCache extends SnapshotCache<Task> {
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 d8e18e47fa89..8b622d28b651 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 @@ class TaskSnapshotController extends AbsAppSnapshotController<Task, TaskSnapshot
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 06d30fc98c6a..29f48b86a375 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 class TaskSnapshotCacheTest extends TaskSnapshotPersisterTestBase {
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 df5f3d149e88..7432537902a0 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 class TaskSnapshotLowResDisabledTest extends TaskSnapshotPersisterTestBas
public void setUp() {
super.setUp();
MockitoAnnotations.initMocks(this);
- mCache = new TaskSnapshotCache(mWm, mLoader);
+ mCache = new TaskSnapshotCache(mLoader);
}
@Test