Do not hold lock when trying to get snapshot
Also never hit the disk for content suggestions, that doesn't
make any sense.
Test: Trace
Fixes: 134482630
Change-Id: Ie79da77152782973e1188e854fd6ebb3ca1df9cc
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 772e5e6..f661ac0 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -4507,22 +4507,27 @@
enforceCallerIsRecentsOrHasPermission(READ_FRAME_BUFFER, "getTaskSnapshot()");
final long ident = Binder.clearCallingIdentity();
try {
- final TaskRecord task;
- synchronized (mGlobalLock) {
- task = mRootActivityContainer.anyTaskForId(taskId,
- MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
- if (task == null) {
- Slog.w(TAG, "getTaskSnapshot: taskId=" + taskId + " not found");
- return null;
- }
- }
- // Don't call this while holding the lock as this operation might hit the disk.
- return task.getSnapshot(reducedResolution);
+ return getTaskSnapshot(taskId, reducedResolution, true /* restoreFromDisk */);
} finally {
Binder.restoreCallingIdentity(ident);
}
}
+ private ActivityManager.TaskSnapshot getTaskSnapshot(int taskId, boolean reducedResolution,
+ boolean restoreFromDisk) {
+ final TaskRecord task;
+ synchronized (mGlobalLock) {
+ task = mRootActivityContainer.anyTaskForId(taskId,
+ MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
+ if (task == null) {
+ Slog.w(TAG, "getTaskSnapshot: taskId=" + taskId + " not found");
+ return null;
+ }
+ }
+ // Don't call this while holding the lock as this operation might hit the disk.
+ return task.getSnapshot(reducedResolution, restoreFromDisk);
+ }
+
@Override
public void setDisablePreviewScreenshots(IBinder token, boolean disable) {
synchronized (mGlobalLock) {
@@ -7399,10 +7404,10 @@
}
@Override
- public ActivityManager.TaskSnapshot getTaskSnapshot(int taskId, boolean reducedResolution) {
- synchronized (mGlobalLock) {
- return ActivityTaskManagerService.this.getTaskSnapshot(taskId, reducedResolution);
- }
+ public ActivityManager.TaskSnapshot getTaskSnapshotNoRestore(int taskId,
+ boolean reducedResolution) {
+ return ActivityTaskManagerService.this.getTaskSnapshot(taskId, reducedResolution,
+ false /* restoreFromDisk */);
}
@Override