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

Commit 3d7ca31c authored by Craig Mautner's avatar Craig Mautner
Browse files

Remove AppWindowTokens from exiting apps with task

When the task is removed from a task stack in window manager any
exiting activities left in the stack were orphaned. This led to a
memory leak. Removing all task activities from those that are exiting
fixes this problem.

Fixes bug 18943737.

Change-Id: I0a5ea8d2d3be89af7ccaf01385a226a2eafdf507
parent f61bc8a2
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -304,10 +304,11 @@ class AppWindowToken extends WindowToken {
            pw.print(prefix); pw.print("inPendingTransaction=");
                    pw.println(inPendingTransaction);
        }
        if (startingData != null || removed || firstWindowDrawn) {
        if (startingData != null || removed || firstWindowDrawn || mDeferRemoval) {
            pw.print(prefix); pw.print("startingData="); pw.print(startingData);
                    pw.print(" removed="); pw.print(removed);
                    pw.print(" firstWindowDrawn="); pw.println(firstWindowDrawn);
                    pw.print(" firstWindowDrawn="); pw.print(firstWindowDrawn);
                    pw.print(" mDeferRemoval="); pw.println(mDeferRemoval);
        }
        if (startingWindow != null || startingView != null
                || startingDisplayed || startingMoved) {
+1 −1
Original line number Diff line number Diff line
@@ -68,6 +68,6 @@ class Task {

    @Override
    public String toString() {
        return "{taskId=" + taskId + " appTokens=" + mAppTokens + "}";
        return "{taskId=" + taskId + " appTokens=" + mAppTokens + " mdr=" + mDeferRemoval + "}";
    }
}
+10 −1
Original line number Diff line number Diff line
@@ -5200,8 +5200,17 @@ public class WindowManagerService extends IWindowManager.Stub
        if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing taskId=" + taskId);
        EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, taskId, "removeTask");
        task.mDeferRemoval = false;
        task.mStack.removeTask(task);
        stack.removeTask(task);
        mTaskIdToTask.delete(task.taskId);

        final ArrayList<AppWindowToken> exitingApps = stack.mExitingAppTokens;
        for (int appNdx = exitingApps.size() - 1; appNdx >= 0; --appNdx) {
            final AppWindowToken wtoken = exitingApps.get(appNdx);
            if (wtoken.groupId == taskId) {
                wtoken.mDeferRemoval = false;
                exitingApps.remove(appNdx);
            }
        }
    }

    public void removeTask(int taskId) {