Fix VD prevent issues 03/46803/2
authorHeeyong Song <heeyong.song@samsung.com>
Wed, 26 Aug 2015 08:15:08 +0000 (17:15 +0900)
committerHeeyong Song <heeyong.song@samsung.com>
Fri, 28 Aug 2015 07:45:36 +0000 (16:45 +0900)
1. rand -> rand_r: thread unsafe
2. copy constructor and asignment operator are missed

Change-Id: I505a831eb729255b240327d08b7c436378d75aab

dali-toolkit/internal/controls/bubble-effect/bubble-actor.cpp
dali-toolkit/internal/controls/bubble-effect/bubble-actor.h
dali-toolkit/internal/controls/bubble-effect/bubble-emitter-impl.cpp
dali-toolkit/internal/controls/bubble-effect/bubble-emitter-impl.h
dali-toolkit/public-api/controls/scrollable/item-view/item-layout.h

index 50df6af..0b3a186 100644 (file)
@@ -36,7 +36,8 @@ namespace Internal
 BubbleActor::BubbleActor( unsigned int numberOfBubble,
                           const Vector2& movementArea)
 : mMovementArea( movementArea ),
-  mNumBubble( numberOfBubble )
+  mNumBubble( numberOfBubble ),
+  mRandomSeed( 0 )
 {
   mActor = Actor::New();
 }
@@ -61,18 +62,20 @@ void BubbleActor::MakeRenderable( Geometry geometry, Material material  )
 
   mIndexInvertedMovementArea = mActor.RegisterProperty( "uInvertedMovementArea", Vector2(1.f,1.f) / mMovementArea );
 
-  srand(time(NULL));
   mIndicesOffset.resize(9);
   int offset = mMovementArea.Length() / 10.f;
-  mIndicesOffset[0] = mActor.RegisterProperty( "uOffset[0]", Vector2(0.f,0.f));
-  mIndicesOffset[1] = mActor.RegisterProperty( "uOffset[1]", Vector2(rand()%offset,rand()%offset) );
-  mIndicesOffset[2] = mActor.RegisterProperty( "uOffset[2]", Vector2(rand()%offset,-rand()%offset) );
-  mIndicesOffset[3] = mActor.RegisterProperty( "uOffset[3]", Vector2(-rand()%offset,rand()%offset) );
-  mIndicesOffset[4] = mActor.RegisterProperty( "uOffset[4]", Vector2(-rand()%offset,-rand()%offset) );
-  mIndicesOffset[5] = mActor.RegisterProperty( "uOffset[5]", Vector2(rand()%offset,0.f));
-  mIndicesOffset[6] = mActor.RegisterProperty( "uOffset[6]", Vector2(-rand()%offset,0.f));
-  mIndicesOffset[7] = mActor.RegisterProperty( "uOffset[7]", Vector2(0.f,rand()%offset));
-  mIndicesOffset[8] = mActor.RegisterProperty( "uOffset[8]", Vector2(0.f,-rand()%offset));
+
+  mRandomSeed = time( NULL );
+
+  mIndicesOffset[0] = mActor.RegisterProperty( "uOffset[0]", Vector2( 0.f,0.f ) );
+  mIndicesOffset[1] = mActor.RegisterProperty( "uOffset[1]", Vector2( rand_r( &mRandomSeed ) % offset,  rand_r( &mRandomSeed ) % offset ) );
+  mIndicesOffset[2] = mActor.RegisterProperty( "uOffset[2]", Vector2( rand_r( &mRandomSeed ) % offset, -rand_r( &mRandomSeed ) % offset ) );
+  mIndicesOffset[3] = mActor.RegisterProperty( "uOffset[3]", Vector2(-rand_r( &mRandomSeed ) % offset,  rand_r( &mRandomSeed ) % offset ) );
+  mIndicesOffset[4] = mActor.RegisterProperty( "uOffset[4]", Vector2(-rand_r( &mRandomSeed ) % offset, -rand_r( &mRandomSeed ) % offset ) );
+  mIndicesOffset[5] = mActor.RegisterProperty( "uOffset[5]", Vector2( rand_r( &mRandomSeed ) % offset, 0.f ) );
+  mIndicesOffset[6] = mActor.RegisterProperty( "uOffset[6]", Vector2(-rand_r( &mRandomSeed ) % offset, 0.f ) );
+  mIndicesOffset[7] = mActor.RegisterProperty( "uOffset[7]", Vector2( 0.f,  rand_r( &mRandomSeed ) % offset ) );
+  mIndicesOffset[8] = mActor.RegisterProperty( "uOffset[8]", Vector2( 0.f, -rand_r( &mRandomSeed ) % offset ) );
 
   Vector4 zeroVector;
   mIndiceStartEndPos.resize( mNumBubble );
@@ -111,14 +114,15 @@ void BubbleActor::SetMovementArea( const Vector2& movementArea )
   mActor.SetProperty( mIndexInvertedMovementArea, Vector2(1.f,1.f) / mMovementArea );
 
   int offset = mMovementArea.Length() / 10.f;
-  mActor.SetProperty( mIndicesOffset[1], Vector2(rand()%offset,rand()%offset) );
-  mActor.SetProperty( mIndicesOffset[2], Vector2(rand()%offset,-rand()%offset) );
-  mActor.SetProperty( mIndicesOffset[3], Vector2(-rand()%offset,rand()%offset) );
-  mActor.SetProperty( mIndicesOffset[4], Vector2(-rand()%offset,-rand()%offset) );
-  mActor.SetProperty( mIndicesOffset[5], Vector2(rand()%offset,0.f));
-  mActor.SetProperty( mIndicesOffset[6], Vector2(-rand()%offset,0.f));
-  mActor.SetProperty( mIndicesOffset[7], Vector2(0.f,rand()%offset));
-  mActor.SetProperty( mIndicesOffset[8], Vector2(0.f,-rand()%offset));
+
+  mActor.SetProperty( mIndicesOffset[1], Vector2( rand_r( &mRandomSeed ) % offset,  rand_r( &mRandomSeed ) % offset ) );
+  mActor.SetProperty( mIndicesOffset[2], Vector2( rand_r( &mRandomSeed ) % offset, -rand_r( &mRandomSeed ) % offset ) );
+  mActor.SetProperty( mIndicesOffset[3], Vector2(-rand_r( &mRandomSeed ) % offset,  rand_r( &mRandomSeed ) % offset ) );
+  mActor.SetProperty( mIndicesOffset[4], Vector2(-rand_r( &mRandomSeed ) % offset, -rand_r( &mRandomSeed ) % offset ) );
+  mActor.SetProperty( mIndicesOffset[5], Vector2( rand_r( &mRandomSeed ) % offset, 0.f ) );
+  mActor.SetProperty( mIndicesOffset[6], Vector2(-rand_r( &mRandomSeed ) % offset, 0.f ) );
+  mActor.SetProperty( mIndicesOffset[7], Vector2( 0.f,  rand_r( &mRandomSeed ) % offset ) );
+  mActor.SetProperty( mIndicesOffset[8], Vector2( 0.f, -rand_r( &mRandomSeed ) % offset ) );
 }
 
 void BubbleActor::SetStartAndEndPosition( unsigned int index, const Vector4& startAndEndPosition )
index a0938f0..357cddf 100644 (file)
@@ -139,6 +139,7 @@ private:
   Property::Index              mIndexInvertedMovementArea; ///< Index of the property mapping to uniform 'uInvertedMovementArea'
 
   unsigned int mNumBubble;  ///< How many groups of uniforms are used to control the bubble movement.
+  unsigned int mRandomSeed; ///< Seed to generate random number.
 };
 
 } // namespace Internal
index a9b9aa9..9fed7cc 100644 (file)
@@ -48,11 +48,12 @@ struct Vertex
  * Return a random value between the given interval.
  * @param[in] f0 The low bound
  * @param[in] f1 The up bound
+ * @param[in] seed The seed to genergate random number
  * @return A random value between the given interval
  */
-float RandomRange(float f0, float f1)
+float RandomRange(float f0, float f1, unsigned int& seed)
 {
-  return f0 + (rand() & 0xfff) * (f1-f0) * (1.0f/4095.0f);
+  return f0 + (rand_r( &seed ) & 0xfff) * (f1-f0) * (1.0f/4095.0f);
 }
 
 }
@@ -76,6 +77,7 @@ BubbleEmitter::BubbleEmitter( const Vector2& movementArea,
   mDensity( 5 ),
   mTotalNumOfBubble( maximumNumberOfBubble ),
   mCurrentBubble( 0 ),
+  mRandomSeed( 0 ),
   mRenderTaskRunning(false)
 {
   // Calculate how many shaders are required
@@ -95,6 +97,8 @@ BubbleEmitter::BubbleEmitter( const Vector2& movementArea,
     mNumBubblePerActor = mTotalNumOfBubble;
     mNumActor = 1;
   }
+
+  mRandomSeed = time( NULL );
 }
 
 BubbleEmitter::~BubbleEmitter()
@@ -297,7 +301,7 @@ Geometry BubbleEmitter::CreateGeometry( unsigned int numOfPatch )
 
   for(unsigned int i = 0; i < numOfPatch; i++)
   {
-    float curSize = RandomRange(mBubbleSizeRange.x, mBubbleSizeRange.y);
+    float curSize = RandomRange(mBubbleSizeRange.x, mBubbleSizeRange.y, mRandomSeed);
 
     float index = static_cast<float>( i );
     vertexData.push_back( Vertex( index, Vector2(0.f,0.f),         Vector2(0.f,0.f) ) );
@@ -340,7 +344,7 @@ void BubbleEmitter::SetBubbleParameter( BubbleActorPtr bubbleActor, unsigned int
 
   int halfRange = displacement.x / 2;
   // for the y coordinate, always negative, so bubbles always go upwards
-  Vector2 randomVec(rand()%static_cast<int>(displacement.x) - halfRange, -rand()%static_cast<int>(displacement.y));
+  Vector2 randomVec( rand_r( &mRandomSeed ) % static_cast<int>(displacement.x) - halfRange, -rand_r( &mRandomSeed ) % static_cast<int>(displacement.y) );
   dir.Normalize();
   randomVec.x -= dir.x*halfRange;
   randomVec.y *= 1.0f - fabsf(dir.x)*0.33f;
index 91158b2..40b4b74 100644 (file)
@@ -178,6 +178,7 @@ private:
   unsigned int                mDensity;             ///< How many bubbles will emit at each time, they are controlled by same uniforms in the shader.
   unsigned int                mTotalNumOfBubble;    ///< mNumBubblePerShader*mNumShader.
   unsigned int                mCurrentBubble;       ///< Keep track of the index for the newly emitted bubble
+  unsigned int                mRandomSeed;          ///< Seed to generate random number.
 
   bool                        mRenderTaskRunning;   ///< If the background render task is currently running
 
index cc1a2ae..39370ac 100644 (file)
@@ -346,6 +346,18 @@ protected:
    */
   DALI_IMPORT_API ItemLayout();
 
+private:
+
+  /**
+   * Don't allow copy constructor
+   */
+  ItemLayout( const ItemLayout& handle );
+
+  /**
+   * Don't allow copy operator
+   */
+  ItemLayout& operator=( const ItemLayout& handle );
+
 protected:
 
   struct Impl;