Fix thread contention issues in messages and pan gestures. 60/47560/1
authorRichard Underhill <r.underhill@partner.samsung.com>
Fri, 4 Sep 2015 12:34:12 +0000 (13:34 +0100)
committerRichard Underhill <r.underhill@partner.samsung.com>
Fri, 4 Sep 2015 12:34:12 +0000 (13:34 +0100)
Change-Id: I21db78ce7a8504dfc9eb2241330ab51e8007d97f
Signed-off-by: Richard Underhill <r.underhill@partner.samsung.com>
dali/internal/common/message-buffer.cpp
dali/internal/common/message-buffer.h
dali/internal/render/common/render-manager.cpp
dali/internal/render/common/render-manager.h
dali/internal/render/queue/render-queue.cpp
dali/internal/render/queue/render-queue.h
dali/internal/update/gestures/scene-graph-pan-gesture.cpp
dali/internal/update/gestures/scene-graph-pan-gesture.h

index 869bcfc..22822aa 100644 (file)
@@ -64,6 +64,7 @@ MessageBuffer::~MessageBuffer()
 
 unsigned int* MessageBuffer::ReserveMessageSlot( std::size_t size )
 {
+  Dali::Mutex::ScopedLock lock(mMutex);
   DALI_ASSERT_DEBUG( 0 != size );
 
   // Number of aligned words required to handle a message of size in bytes
index 8e1a17a..d731b9d 100644 (file)
@@ -21,6 +21,9 @@
 // EXTERNAL INCLUDES
 #include <cstddef>
 
+// INTERNAL INCLUDES
+#include <dali/devel-api/common/mutex.h>
+
 namespace Dali
 {
 
@@ -143,6 +146,7 @@ private:
 
   std::size_t mCapacity; ///< The memory allocated with respect to sizeof(WordType)
   std::size_t mSize;     ///< The memory reserved for messages with respect to sizeof(WordType)
+  Dali::Mutex mMutex;    ///< Mutex to ensure correct access locking
 };
 
 } // namespace Internal
index 35954a9..b1fafc0 100644 (file)
@@ -150,7 +150,7 @@ struct RenderManager::Impl
 
   Vector4                       backgroundColor;          ///< The glClear color used at the beginning of each frame.
 
-  float                         frameTime;                ///< The elapsed time since the previous frame
+  volatile float                frameTime;                ///< The elapsed time since the previous frame
   float                         lastFrameTime;            ///< Last frame delta.
 
   unsigned int                  frameCount;               ///< The current frame count
@@ -249,6 +249,7 @@ void RenderManager::SetBackgroundColor( const Vector4& color )
 
 void RenderManager::SetFrameDeltaTime( float deltaTime )
 {
+  Dali::Mutex::ScopedLock lock( mMutex );
   mImpl->frameTime = deltaTime;
 }
 
@@ -446,8 +447,7 @@ bool RenderManager::Render( Integration::RenderStatus& status )
 
   PERF_MONITOR_END(PerformanceMonitor::DRAW_NODES);
 
-  // Update the frame time
-  mImpl->lastFrameTime = mImpl->frameTime;
+  SetLastFrameTime();
 
   // check if anything has been posted to the update thread
   bool updateRequired = !mImpl->resourcePostProcessQueue[ mImpl->renderBufferIndex ].empty();
@@ -473,6 +473,12 @@ bool RenderManager::Render( Integration::RenderStatus& status )
   return updateRequired;
 }
 
+void RenderManager::SetLastFrameTime()
+{
+  Dali::Mutex::ScopedLock lock(mMutex);
+  mImpl->lastFrameTime = mImpl->frameTime;
+}
+
 void RenderManager::DoRender( RenderInstruction& instruction, Shader& defaultShader, float elapsedTime )
 {
   Rect<int> viewportRect;
index d716d43..cfddbac 100644 (file)
@@ -19,6 +19,7 @@
  */
 
 // INTERNAL INCLUDES
+#include <dali/devel-api/common/mutex.h>
 #include <dali/public-api/math/rect.h>
 #include <dali/internal/common/shader-saver.h>
 #include <dali/internal/render/common/post-process-resource-dispatcher.h>
@@ -240,10 +241,14 @@ private:
   // Undefined
   RenderManager& operator=( const RenderManager& rhs );
 
+  // Set the last frame time while locking access
+  void SetLastFrameTime();
+
 private:
 
   struct Impl;
   Impl* mImpl;
+  Dali::Mutex mMutex;
 
 };
 
index 0eda995..6c137e9 100644 (file)
@@ -42,12 +42,14 @@ RenderQueue::RenderQueue()
 : container0( NULL ),
   container1( NULL )
 {
+  Dali::Mutex::ScopedLock lock(mMutex);
   container0 = new MessageBuffer( INITIAL_BUFFER_SIZE );
   container1 = new MessageBuffer( INITIAL_BUFFER_SIZE );
 }
 
 RenderQueue::~RenderQueue()
 {
+  Dali::Mutex::ScopedLock lock(mMutex);
   if( container0 )
   {
     for( MessageBuffer::Iterator iter = container0->Begin(); iter.IsValid(); iter.Next() )
@@ -77,6 +79,7 @@ RenderQueue::~RenderQueue()
 
 unsigned int* RenderQueue::ReserveMessageSlot( BufferIndex updateBufferIndex, std::size_t size )
 {
+  Dali::Mutex::ScopedLock lock(mMutex);
   MessageBuffer* container = GetCurrentContainer( updateBufferIndex );
 
   return container->ReserveMessageSlot( size );
@@ -84,6 +87,7 @@ unsigned int* RenderQueue::ReserveMessageSlot( BufferIndex updateBufferIndex, st
 
 void RenderQueue::ProcessMessages( BufferIndex bufferIndex )
 {
+  Dali::Mutex::ScopedLock lock(mMutex);
   MessageBuffer* container = GetCurrentContainer( bufferIndex );
 
   for( MessageBuffer::Iterator iter = container->Begin(); iter.IsValid(); iter.Next() )
index 246f67f..cdf458f 100644 (file)
@@ -19,6 +19,7 @@
  */
 
 // INTERNAL INCLUDES
+#include <dali/devel-api/common/mutex.h>
 #include <dali/internal/common/buffer-index.h>
 #include <dali/internal/common/message-buffer.h>
 
@@ -91,6 +92,7 @@ private:
 
 private:
 
+  Dali::Mutex mMutex;        ///< Mutex to ensure access locking
   MessageBuffer* container0; ///< Messages are queued here when the update buffer index == 0
   MessageBuffer* container1; ///< Messages are queued here when the update buffer index == 1
 };
index d8a119a..31e10b7 100644 (file)
@@ -62,6 +62,7 @@ PanGesture::~PanGesture()
 
 void PanGesture::AddGesture( const Dali::PanGesture& gesture )
 {
+  Dali::Mutex::ScopedLock lock( mMutex );
   mGestures[ mWritePosition ] = gesture;
 
   // Update our write position.
@@ -298,6 +299,7 @@ bool PanGesture::ReadGestures( FrameGestureInfo& info, unsigned int currentTimes
 bool PanGesture::ReadAndResampleGestures( FrameGestureInfo& info, unsigned int currentTimestamp )
 {
   PanInfo lastReadGesture;
+  Dali::Mutex::ScopedLock lock( mMutex );
   while( mReadPosition != mWritePosition )
   {
     // Copy the gesture first
index 5758a4a..bb322d9 100644 (file)
@@ -19,6 +19,7 @@
  */
 
 // INTERNAL INCLUDES
+#include <dali/devel-api/common/mutex.h>
 #include <dali/public-api/common/vector-wrapper.h>
 #include <dali/public-api/events/pan-gesture.h>
 #include <dali/internal/update/common/property-owner.h>
@@ -392,7 +393,7 @@ private:
   PanInfo mLastGesture;                       ///< The last gesture. (last update frame).
   PanInfo mTargetGesture;                     ///< The most recent input gesture, if the current used gesture does not match.
   PanInfo mLastUnmodifiedGesture;             ///< The last gesture before any processing was done on it.
-  unsigned int mWritePosition;                ///< The next PanInfo buffer to write to. (starts at 0).
+  volatile unsigned int mWritePosition;       ///< The next PanInfo buffer to write to. (starts at 0).
   unsigned int mReadPosition;                 ///< The next PanInfo buffer to read. (starts at 0).
   bool mNotAtTarget;                          ///< Keeps track of if the last gesture used was the most recent received.
   bool mInGesture;                            ///< True if the gesture is currently being handled i.e. between Started <-> Finished/Cancelled.
@@ -406,6 +407,7 @@ private:
   SmoothingMode mSmoothingMode;               ///< The pan gesture prediction mode
   float         mSmoothingAmount;             ///< How much smoothing to apply [0.0f,1.0f]
   PanGestureProfiling* mProfiling;            ///< NULL unless pan-gesture profiling information is required.
+  Dali::Mutex mMutex;                         ///< Mutex to lock access.
 };
 
 } // namespace SceneGraph