Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 925bb3c9 authored by Jorim Jaggi's avatar Jorim Jaggi
Browse files

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
parent 94b29818
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -98,7 +98,7 @@ public final class ContentSuggestionsPerUserService extends
        RemoteContentSuggestionsService service = getRemoteServiceLocked();
        if (service != null) {
            ActivityManager.TaskSnapshot snapshot =
                    mActivityTaskManagerInternal.getTaskSnapshot(taskId, false);
                    mActivityTaskManagerInternal.getTaskSnapshotNoRestore(taskId, false);
            GraphicBuffer snapshotBuffer = null;
            int colorSpaceId = 0;
            if (snapshot != null) {
+1 −1
Original line number Diff line number Diff line
@@ -553,7 +553,7 @@ public abstract class ActivityTaskManagerInternal {
    /**
     * Gets bitmap snapshot of the provided task id.
     */
    public abstract ActivityManager.TaskSnapshot getTaskSnapshot(int taskId,
    public abstract ActivityManager.TaskSnapshot getTaskSnapshotNoRestore(int taskId,
            boolean reducedResolution);

    /** Returns true if uid is considered foreground for activity start purposes. */
+20 −15
Original line number Diff line number Diff line
@@ -4507,6 +4507,14 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
        enforceCallerIsRecentsOrHasPermission(READ_FRAME_BUFFER, "getTaskSnapshot()");
        final long ident = Binder.clearCallingIdentity();
        try {
            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,
@@ -4517,10 +4525,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
            }
        }
        // Don't call this while holding the lock as this operation might hit the disk.
            return task.getSnapshot(reducedResolution);
        } finally {
            Binder.restoreCallingIdentity(ident);
        }
        return task.getSnapshot(reducedResolution, restoreFromDisk);
    }

    @Override
@@ -7399,10 +7404,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
        }

        @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
+3 −2
Original line number Diff line number Diff line
@@ -851,11 +851,12 @@ class TaskRecord extends ConfigurationContainer {
    /**
     * DO NOT HOLD THE ACTIVITY MANAGER LOCK WHEN CALLING THIS METHOD!
     */
    TaskSnapshot getSnapshot(boolean reducedResolution) {
    TaskSnapshot getSnapshot(boolean reducedResolution, boolean restoreFromDisk) {

        // TODO: Move this to {@link TaskWindowContainerController} once recent tasks are more
        // synchronized between AM and WM.
        return mService.mWindowManager.getTaskSnapshot(taskId, userId, reducedResolution);
        return mService.mWindowManager.getTaskSnapshot(taskId, userId, reducedResolution,
                restoreFromDisk);
    }

    void touchActiveTime() {
+3 −2
Original line number Diff line number Diff line
@@ -3549,8 +3549,9 @@ public class WindowManagerService extends IWindowManager.Stub
        return true;
    }

    public TaskSnapshot getTaskSnapshot(int taskId, int userId, boolean reducedResolution) {
        return mTaskSnapshotController.getSnapshot(taskId, userId, true /* restoreFromDisk */,
    public TaskSnapshot getTaskSnapshot(int taskId, int userId, boolean reducedResolution,
            boolean restoreFromDisk) {
        return mTaskSnapshotController.getSnapshot(taskId, userId, restoreFromDisk,
                reducedResolution);
    }