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

Commit bd33dc01 authored by Jim Miller's avatar Jim Miller Committed by Android Git Automerger
Browse files

am 8e69abf8: am 46e63117: DO NOT MERGE - Fix memory leak caused by mismatched...

am 8e69abf8: am 46e63117: DO NOT MERGE - Fix memory leak caused by mismatched linkToDeath() in WindowManagerService

* commit '8e69abf8':
  DO NOT MERGE - Fix memory leak caused by mismatched linkToDeath() in WindowManagerService
parents e0683de5 8e69abf8
Loading
Loading
Loading
Loading
+21 −10
Original line number Diff line number Diff line
@@ -441,8 +441,15 @@ public class WindowManagerService extends IWindowManager.Stub
    int mRotation = 0;
    int mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
    boolean mAltOrientation = false;
    ArrayList<IRotationWatcher> mRotationWatchers
            = new ArrayList<IRotationWatcher>();
    class RotationWatcher {
        IRotationWatcher watcher;
        IBinder.DeathRecipient dr;
        RotationWatcher(IRotationWatcher w, IBinder.DeathRecipient d) {
            watcher = w;
            dr = d;
        }
    }
    ArrayList<RotationWatcher> mRotationWatchers = new ArrayList<RotationWatcher>();
    int mDeferredRotationPauseCount;

    int mSystemDecorLayer = 0;
@@ -6075,7 +6082,7 @@ public class WindowManagerService extends IWindowManager.Stub

        for (int i=mRotationWatchers.size()-1; i>=0; i--) {
            try {
                mRotationWatchers.get(i).onRotationChanged(rotation);
                mRotationWatchers.get(i).watcher.onRotationChanged(rotation);
            } catch (RemoteException e) {
            }
        }
@@ -6107,10 +6114,10 @@ public class WindowManagerService extends IWindowManager.Stub
            public void binderDied() {
                synchronized (mWindowMap) {
                    for (int i=0; i<mRotationWatchers.size(); i++) {
                        if (watcherBinder == mRotationWatchers.get(i).asBinder()) {
                            IRotationWatcher removed = mRotationWatchers.remove(i);
                        if (watcherBinder == mRotationWatchers.get(i).watcher.asBinder()) {
                            RotationWatcher removed = mRotationWatchers.remove(i);
                            if (removed != null) {
                                removed.asBinder().unlinkToDeath(this, 0);
                                removed.watcher.asBinder().unlinkToDeath(this, 0);
                            }
                            i--;
                        }
@@ -6122,7 +6129,7 @@ public class WindowManagerService extends IWindowManager.Stub
        synchronized (mWindowMap) {
            try {
                watcher.asBinder().linkToDeath(dr, 0);
                mRotationWatchers.add(watcher);
                mRotationWatchers.add(new RotationWatcher(watcher, dr));
            } catch (RemoteException e) {
                // Client died, no cleanup needed.
            }
@@ -6136,13 +6143,17 @@ public class WindowManagerService extends IWindowManager.Stub
        final IBinder watcherBinder = watcher.asBinder();
        synchronized (mWindowMap) {
            for (int i=0; i<mRotationWatchers.size(); i++) {
                if (watcherBinder == mRotationWatchers.get(i).asBinder()) {
                    mRotationWatchers.remove(i);
                RotationWatcher rotationWatcher = mRotationWatchers.get(i);
                if (watcherBinder == rotationWatcher.watcher.asBinder()) {
                    RotationWatcher removed = mRotationWatchers.remove(i);
                    if (removed != null) {
                        removed.watcher.asBinder().unlinkToDeath(removed.dr, 0);
                        i--;
                    }
                }
            }
        }
    }

    /**
     * Apps that use the compact menu panel (as controlled by the panelMenuIsCompact