Add logs that indicate why a surface is invalid

This helps us to debug.

Bug: 154056280
Test: Locally make leashes invalid and check the log format.
Change-Id: Idcde497ffee1f10a4289520e154aa8b39eed1f78
This commit is contained in:
Tiger Huang
2020-04-15 22:16:13 +08:00
parent 82dc6147f1
commit 0fd6748bf6
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;
}
}
}