OSDN Git Service

Make sure NaturalSurfaceLayout is consistent with SurfaceControl
authoryang.xa.liu <yang.xa.liu@sonymobile.com>
Fri, 18 Dec 2015 08:40:31 +0000 (16:40 +0800)
committerTakahiro Aizawa <takahiro.aizawa@sonymobile.com>
Fri, 25 Dec 2015 04:51:31 +0000 (13:51 +0900)
SurfaceControl and NaturalSurfaceLayout will be created in screen-off
mode. Screen-on animation also creates NaturalSurfaceLayout. And
NaturalSurfaceLayout uses the reference of SurfaceControl.

SurfaceControl points to NULL when screen-on process calls destory
function, which will not be called in screen-off process. It makes
NaturalSurfaceLayout's member points to the SurfaceControl with NULL.
Crash occurs by accessing the destroyed SurfaceControl.

This CL makes the creation of SurfaceControl and NaturalSurfaceLayout
to one-to-one.

Change-Id: Ic47ea73dea67d2aba4e3e0766d1353198d7dff1d

services/core/java/com/android/server/display/ColorFade.java

index 835ba17..a16fcd2 100644 (file)
@@ -587,16 +587,16 @@ final class ColorFade {
                     Slog.e(TAG, "Unable to create surface.", ex);
                     return false;
                 }
-            }
 
-            mSurfaceControl.setLayerStack(mDisplayLayerStack);
-            mSurfaceControl.setSize(mDisplayWidth, mDisplayHeight);
-            mSurface = new Surface();
-            mSurface.copyFrom(mSurfaceControl);
+                mSurfaceControl.setLayerStack(mDisplayLayerStack);
+                mSurfaceControl.setSize(mDisplayWidth, mDisplayHeight);
+                mSurface = new Surface();
+                mSurface.copyFrom(mSurfaceControl);
 
-            mSurfaceLayout = new NaturalSurfaceLayout(mDisplayManagerInternal,
-                    mDisplayId, mSurfaceControl);
-            mSurfaceLayout.onDisplayTransaction();
+                mSurfaceLayout = new NaturalSurfaceLayout(mDisplayManagerInternal,
+                        mDisplayId, mSurfaceControl);
+                mSurfaceLayout.onDisplayTransaction();
+            }
         } finally {
             SurfaceControl.closeTransaction();
         }