another small step towards fixing [2501808] sapphire: OOM in GPU Surface area

release the Surface in SurfaceView when it's not visible, after it comes back from relayout(),
it should not be holding buffers at this point, but it's cleaner to have it in the released state.

also log a warning in Surface.finalize() when there is work to do, as it means Surface.release() wasn't
called when it should have.

Change-Id: Id637d4ec2916d8fd800b0344d8dec6cecce02051
This commit is contained in:
Mathias Agopian
2010-03-23 16:44:27 -07:00
parent 484c8a2887
commit f5e32f33ed
2 changed files with 25 additions and 1 deletions

View File

@@ -28,6 +28,7 @@ import android.util.Log;
*/
public class Surface implements Parcelable {
private static final String LOG_TAG = "Surface";
private static final boolean DEBUG_RELEASE = false;
/* flags used in constructor (keep in sync with ISurfaceComposer.h) */
@@ -155,6 +156,9 @@ public class Surface implements Parcelable {
// non compatibility mode.
private Matrix mCompatibleMatrix;
@SuppressWarnings("unused")
private Exception mCreationStack;
/**
* Exception thrown when a surface couldn't be created or resized
*/
@@ -181,6 +185,9 @@ public class Surface implements Parcelable {
public Surface(SurfaceSession s,
int pid, int display, int w, int h, int format, int flags)
throws OutOfResourcesException {
if (DEBUG_RELEASE) {
mCreationStack = new Exception();
}
mCanvas = new CompatibleCanvas();
init(s,pid,null,display,w,h,format,flags);
}
@@ -192,6 +199,9 @@ public class Surface implements Parcelable {
public Surface(SurfaceSession s,
int pid, String name, int display, int w, int h, int format, int flags)
throws OutOfResourcesException {
if (DEBUG_RELEASE) {
mCreationStack = new Exception();
}
mCanvas = new CompatibleCanvas();
init(s,pid,name,display,w,h,format,flags);
}
@@ -202,6 +212,9 @@ public class Surface implements Parcelable {
* {@hide}
*/
public Surface() {
if (DEBUG_RELEASE) {
mCreationStack = new Exception();
}
mCanvas = new CompatibleCanvas();
}
@@ -407,6 +420,15 @@ public class Surface implements Parcelable {
/* no user serviceable parts here ... */
@Override
protected void finalize() throws Throwable {
if (mSurface != 0 || mSurfaceControl != 0) {
if (DEBUG_RELEASE) {
Log.w(LOG_TAG, "Surface.finalize() has work. You should have called release() ("
+ mSurface + ", " + mSurfaceControl + ")", mCreationStack);
} else {
Log.w(LOG_TAG, "Surface.finalize() has work. You should have called release() ("
+ mSurface + ", " + mSurfaceControl + ")");
}
}
release();
}

View File

@@ -422,7 +422,7 @@ public class SurfaceView extends View {
if (visibleChanged && (!visible || mNewSurfaceNeeded)) {
reportSurfaceDestroyed();
}
mNewSurfaceNeeded = false;
mSurfaceLock.lock();
@@ -470,6 +470,8 @@ public class SurfaceView extends View {
c.surfaceChanged(mSurfaceHolder, mFormat, mWidth, mHeight);
}
}
} else {
mSurface.release();
}
} finally {
mIsCreating = false;