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

* commit '8e69abf8c62452e6e9bcd254a55a2d80c8ef5b3d':
  DO NOT MERGE - Fix memory leak caused by mismatched linkToDeath() in WindowManagerService
This commit is contained in:
Jim Miller
2014-03-20 02:47:09 +00:00
committed by Android Git Automerger

View File

@@ -441,8 +441,15 @@ public class WindowManagerService extends IWindowManager.Stub
int mRotation = 0; int mRotation = 0;
int mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; int mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
boolean mAltOrientation = false; boolean mAltOrientation = false;
ArrayList<IRotationWatcher> mRotationWatchers class RotationWatcher {
= new ArrayList<IRotationWatcher>(); IRotationWatcher watcher;
IBinder.DeathRecipient dr;
RotationWatcher(IRotationWatcher w, IBinder.DeathRecipient d) {
watcher = w;
dr = d;
}
}
ArrayList<RotationWatcher> mRotationWatchers = new ArrayList<RotationWatcher>();
int mDeferredRotationPauseCount; int mDeferredRotationPauseCount;
int mSystemDecorLayer = 0; int mSystemDecorLayer = 0;
@@ -6075,7 +6082,7 @@ public class WindowManagerService extends IWindowManager.Stub
for (int i=mRotationWatchers.size()-1; i>=0; i--) { for (int i=mRotationWatchers.size()-1; i>=0; i--) {
try { try {
mRotationWatchers.get(i).onRotationChanged(rotation); mRotationWatchers.get(i).watcher.onRotationChanged(rotation);
} catch (RemoteException e) { } catch (RemoteException e) {
} }
} }
@@ -6107,10 +6114,10 @@ public class WindowManagerService extends IWindowManager.Stub
public void binderDied() { public void binderDied() {
synchronized (mWindowMap) { synchronized (mWindowMap) {
for (int i=0; i<mRotationWatchers.size(); i++) { for (int i=0; i<mRotationWatchers.size(); i++) {
if (watcherBinder == mRotationWatchers.get(i).asBinder()) { if (watcherBinder == mRotationWatchers.get(i).watcher.asBinder()) {
IRotationWatcher removed = mRotationWatchers.remove(i); RotationWatcher removed = mRotationWatchers.remove(i);
if (removed != null) { if (removed != null) {
removed.asBinder().unlinkToDeath(this, 0); removed.watcher.asBinder().unlinkToDeath(this, 0);
} }
i--; i--;
} }
@@ -6122,7 +6129,7 @@ public class WindowManagerService extends IWindowManager.Stub
synchronized (mWindowMap) { synchronized (mWindowMap) {
try { try {
watcher.asBinder().linkToDeath(dr, 0); watcher.asBinder().linkToDeath(dr, 0);
mRotationWatchers.add(watcher); mRotationWatchers.add(new RotationWatcher(watcher, dr));
} catch (RemoteException e) { } catch (RemoteException e) {
// Client died, no cleanup needed. // Client died, no cleanup needed.
} }
@@ -6136,13 +6143,17 @@ public class WindowManagerService extends IWindowManager.Stub
final IBinder watcherBinder = watcher.asBinder(); final IBinder watcherBinder = watcher.asBinder();
synchronized (mWindowMap) { synchronized (mWindowMap) {
for (int i=0; i<mRotationWatchers.size(); i++) { for (int i=0; i<mRotationWatchers.size(); i++) {
if (watcherBinder == mRotationWatchers.get(i).asBinder()) { RotationWatcher rotationWatcher = mRotationWatchers.get(i);
mRotationWatchers.remove(i); if (watcherBinder == rotationWatcher.watcher.asBinder()) {
RotationWatcher removed = mRotationWatchers.remove(i);
if (removed != null) {
removed.watcher.asBinder().unlinkToDeath(removed.dr, 0);
i--; i--;
} }
} }
} }
} }
}
/** /**
* Apps that use the compact menu panel (as controlled by the panelMenuIsCompact * Apps that use the compact menu panel (as controlled by the panelMenuIsCompact