(ThreadSync) Ensure we continue to wait if we're still post-rendering 57/48157/1
authorAdeel Kazmi <adeel.kazmi@samsung.com>
Tue, 15 Sep 2015 08:11:06 +0000 (09:11 +0100)
committerAdeel Kazmi <adeel.kazmi@samsung.com>
Tue, 15 Sep 2015 08:11:09 +0000 (09:11 +0100)
[Problem]  If we're post-rendering and UpdateReady is called, we start another render rather than
           waiting for the post-render to finish.
[Solution] Use a while loop in PostRenderWaitForCompletion instead so that even if we're triggered
           by the update-thread, we don't carry on until the post-render is actually complete or
           if we need to replace the surface.

Change-Id: Id285a8ef09bb74d183534d7011c7a40eb45a6b0b

adaptors/base/thread-synchronization.cpp
adaptors/base/thread-synchronization.h

index fe1fa3f..f6fa28b 100644 (file)
@@ -60,7 +60,7 @@ ThreadSynchronization::ThreadSynchronization( AdaptorInternalServices& adaptorIn
   mVSyncThreadStop( FALSE ),
   mRenderThreadStop( FALSE ),
   mRenderThreadReplacingSurface( FALSE ),
-  mRenderThreadSurfaceRendered( FALSE ),
+  mRenderThreadPostRendering( FALSE ),
   mEventThreadSurfaceReplaced( FALSE ),
   mVSyncThreadInitialised( FALSE ),
   mRenderThreadInitialised( FALSE ),
@@ -603,7 +603,7 @@ void ThreadSynchronization::PostRenderComplete()
 
   {
     ConditionalWait::ScopedLock lock( mRenderThreadWaitCondition );
-    mRenderThreadSurfaceRendered = TRUE;
+    mRenderThreadPostRendering = FALSE;
   }
   mRenderThreadWaitCondition.Notify();
 }
@@ -617,7 +617,7 @@ void ThreadSynchronization::PostRenderStarted()
   LOG_RENDER_TRACE;
 
   ConditionalWait::ScopedLock lock( mRenderThreadWaitCondition );
-  mRenderThreadSurfaceRendered = FALSE;
+  mRenderThreadPostRendering = TRUE;
 }
 
 void ThreadSynchronization::PostRenderWaitForCompletion()
@@ -625,8 +625,8 @@ void ThreadSynchronization::PostRenderWaitForCompletion()
   LOG_RENDER_TRACE;
 
   ConditionalWait::ScopedLock lock( mRenderThreadWaitCondition );
-  if( !mRenderThreadSurfaceRendered &&
-      !mRenderThreadReplacingSurface )
+  while( mRenderThreadPostRendering &&
+         ! mRenderThreadReplacingSurface ) // We should NOT wait if we're replacing the surface
   {
     LOG_RENDER( "WAIT" );
     mRenderThreadWaitCondition.Wait( lock );
index 93de6a2..8f532f4 100644 (file)
@@ -411,7 +411,7 @@ private:
   volatile unsigned int mRenderThreadStop;            ///< Whether the render-thread should be stopped (set by the update-thread, read by the render-thread).
   volatile unsigned int mRenderThreadReplacingSurface;///< Whether the render-thread should replace the surface (set by the event & render threads, read by the render-thread).
 
-  volatile unsigned int mRenderThreadSurfaceRendered; ///< Whether the render-surface has rendered our surface (set by the event & render threads, read by the render-thread).
+  volatile unsigned int mRenderThreadPostRendering;   ///< Whether post-rendering is taking place (set by the event & render threads, read by the render-thread).
 
   volatile unsigned int mEventThreadSurfaceReplaced;  ///< Checked by the event-thread & set by the render-thread when the surface has been replaced (set by the event & render threads, read by the event-thread).