diff options
| author | 2024-02-14 17:59:13 +0000 | |
|---|---|---|
| committer | 2024-02-14 17:59:13 +0000 | |
| commit | f0a3517fb73ca4653f4f14683b6f03dc360a72cc (patch) | |
| tree | 37fe84049c87dfd2e93350b7bb7fb3197f24ab71 | |
| parent | c8d07d64f539a14d5729d2d416ed0d6ed085215f (diff) | |
| parent | c08978ce4dfa3612e5cb5130d1fc9a58d4cf611b (diff) | |
Merge "snapshotcache: replce global lock with local one" into main
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 |