Merge "Add logs that indicate why a surface is invalid" into rvc-dev am: 461f380988

Change-Id: I899d92ce094c78a4d7d6de49433041c9a5fd6d0d
This commit is contained in:
Tiger Huang
2020-04-15 20:17:40 +00:00
committed by Automerger Merge Worker
2 changed files with 36 additions and 5 deletions

View File

@@ -228,6 +228,7 @@ public final class SurfaceControl implements Parcelable {
*/
public long mNativeObject;
private long mNativeHandle;
private Throwable mReleaseStack = null;
// TODO: Move this to native.
private final Object mSizeLock = new Object();
@@ -426,11 +427,18 @@ public final class SurfaceControl implements Parcelable {
if (mNativeObject != 0) {
release();
}
if (nativeObject != 0) {
if (nativeObject != 0) {
mCloseGuard.open("release");
}
mNativeObject = nativeObject;
mNativeHandle = mNativeObject != 0 ? nativeGetHandle(nativeObject) : 0;
if (mNativeObject == 0) {
if (Build.IS_DEBUGGABLE) {
mReleaseStack = new Throwable("assigned zero nativeObject here");
}
} else {
mReleaseStack = null;
}
}
/**
@@ -989,10 +997,21 @@ public final class SurfaceControl implements Parcelable {
nativeRelease(mNativeObject);
mNativeObject = 0;
mNativeHandle = 0;
if (Build.IS_DEBUGGABLE) {
mReleaseStack = new Throwable("released here");
}
mCloseGuard.close();
}
}
/**
* Returns the call stack that assigned mNativeObject to zero.
* @hide
*/
public Throwable getReleaseStack() {
return mReleaseStack;
}
/**
* Disconnect any client still connected to the surface.
* @hide
@@ -1004,8 +1023,11 @@ public final class SurfaceControl implements Parcelable {
}
private void checkNotReleased() {
if (mNativeObject == 0) throw new NullPointerException(
"mNativeObject is null. Have you called release() already?");
if (mNativeObject == 0) {
Log.wtf(TAG, "Invalid " + this + " caused by:", mReleaseStack);
throw new NullPointerException(
"mNativeObject of " + this + " is null. Have you called release() already?");
}
}
/**

View File

@@ -2445,8 +2445,17 @@ 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++) {
outControls[i] = win.isClientLocal()
? new InsetsSourceControl(controls[i]) : controls[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;
}
}
}