Merge "Copy leashes about to return to prevent others release them" into rvc-dev am: d4ec66b4f3

Change-Id: Ic6ce627c475c34a7bb90beb61579144c851fd0dc
This commit is contained in:
Tiger Huang
2020-04-21 16:13:53 +00:00
committed by Automerger Merge Worker

View File

@@ -2446,17 +2446,15 @@ public class WindowManagerService extends IWindowManager.Stub
if (controls != null) {
final int length = Math.min(controls.length, outControls.length);
for (int i = 0; i < length; i++) {
final InsetsSourceControl control = controls[i];
// Check if we are sending invalid leashes.
final SurfaceControl leash = control != null ? control.getLeash() : null;
if (leash != null && !leash.isValid()) {
Slog.wtf(TAG, leash + " is not valid before sending to " + win,
leash.getReleaseStack());
}
outControls[i] = win.isClientLocal() && control != null
? new InsetsSourceControl(control) : control;
// We will leave the critical section before returning the leash to the client,
// so we need to copy the leash to prevent others release the one that we are
// about to return.
// TODO: We will have an extra copy if the client is not local.
// For now, we rely on GC to release it.
// Maybe we can modify InsetsSourceControl.writeToParcel so it can release
// the extra leash as soon as possible.
outControls[i] = controls[i] != null
? new InsetsSourceControl(controls[i]) : null;
}
}
}