From ea62b95e7c562e8d0052441d8a0d7de6d919320f Mon Sep 17 00:00:00 2001 From: Jack Palevich Date: Mon, 18 Mar 2013 22:44:58 -0700 Subject: [PATCH] Fix createSurface / eglCreateWindowSurface race. Previously we could have returned from createSurface on the main thread before calling eglCreateWindowSurface on the GLThread. That could lead to a problem because the surface could be destroyed before eglCreateWindowSurface got a chance to run. Bug: 8328715 Change-Id: I273149f7d4b165abbe218a91ff54083f3f498cb0 --- opengl/java/android/opengl/GLSurfaceView.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java index 54dcaaa44c1e9..5a2e261fa3a43 100644 --- a/opengl/java/android/opengl/GLSurfaceView.java +++ b/opengl/java/android/opengl/GLSurfaceView.java @@ -1445,6 +1445,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback Log.i("GLThread", "waiting tid=" + getId() + " mHaveEglContext: " + mHaveEglContext + " mHaveEglSurface: " + mHaveEglSurface + + " mFinishedCreatingEglSurface: " + mFinishedCreatingEglSurface + " mPaused: " + mPaused + " mHasSurface: " + mHasSurface + " mSurfaceIsBad: " + mSurfaceIsBad @@ -1468,8 +1469,14 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback if (LOG_SURFACE) { Log.w("GLThread", "egl createSurface"); } - if (!mEglHelper.createSurface()) { + if (mEglHelper.createSurface()) { synchronized(sGLThreadManager) { + mFinishedCreatingEglSurface = true; + sGLThreadManager.notifyAll(); + } + } else { + synchronized(sGLThreadManager) { + mFinishedCreatingEglSurface = true; mSurfaceIsBad = true; sGLThreadManager.notifyAll(); } @@ -1595,8 +1602,11 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback Log.i("GLThread", "surfaceCreated tid=" + getId()); } mHasSurface = true; + mFinishedCreatingEglSurface = false; sGLThreadManager.notifyAll(); - while((mWaitingForSurface) && (!mExited)) { + while (mWaitingForSurface + && !mFinishedCreatingEglSurface + && !mExited) { try { sGLThreadManager.wait(); } catch (InterruptedException e) { @@ -1735,6 +1745,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback private boolean mWaitingForSurface; private boolean mHaveEglContext; private boolean mHaveEglSurface; + private boolean mFinishedCreatingEglSurface; private boolean mShouldReleaseEglContext; private int mWidth; private int mHeight;