You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@etch.apache.org by ve...@apache.org on 2012/08/02 16:50:55 UTC

svn commit: r1368497 - in /incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu: include/capu/os/arch/Windows/CondVar.inc test/os/CondVarTest.cpp

Author: veithm
Date: Thu Aug  2 14:50:54 2012
New Revision: 1368497

URL: http://svn.apache.org/viewvc?rev=1368497&view=rev
Log:
ETCH-143 Fixed condition variable bug on Windows

Change-Id: I3cbb89d1e7bf2904ef1a1a4e2bb2694a89c332d4

Modified:
    incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Windows/CondVar.inc
    incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/CondVarTest.cpp

Modified: incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Windows/CondVar.inc
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Windows/CondVar.inc?rev=1368497&r1=1368496&r2=1368497&view=diff
==============================================================================
--- incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Windows/CondVar.inc (original)
+++ incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Windows/CondVar.inc Thu Aug  2 14:50:54 2012
@@ -101,7 +101,7 @@ private:
               } else {
                 ReleaseSemaphore(mSemaphore, 1, NULL);
               }
-            }
+            } else
             if (waitResult == WAIT_TIMEOUT) {
               mLockWaitCounter.lock();
               --mWaitCounter;
@@ -110,6 +110,7 @@ private:
               mutex->lock();
               return CAPU_ETIMEOUT;
             } else {
+              mutex->lock();
               return CAPU_ERROR;
             }
         }

Modified: incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/CondVarTest.cpp
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/CondVarTest.cpp?rev=1368497&r1=1368496&r2=1368497&view=diff
==============================================================================
--- incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/CondVarTest.cpp (original)
+++ incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/CondVarTest.cpp Thu Aug  2 14:50:54 2012
@@ -23,27 +23,31 @@
 class GlobalVariables
 {
 public:
-    static capu::int32_t variable;
+    static capu::int32_t loops;
+    static capu::int32_t buffer;
     static capu::CondVar cv;
     static capu::Mutex mutex;
 };
 
-capu::int32_t GlobalVariables::variable=10;
+capu::int32_t GlobalVariables::loops = 10000;
 capu::CondVar GlobalVariables::cv;
 capu::Mutex GlobalVariables::mutex;
+capu::int32_t GlobalVariables::buffer = 0;
 
 class ThreadCondVarConsumer : public capu::Runnable
 {
 public:
     void operator()(void * param)
     {
-        capu::int32_t *value = (capu::int32_t *) param;
+      for(capu::int32_t i = 0; i < GlobalVariables::loops; i++) {
         EXPECT_TRUE(GlobalVariables::mutex.lock()== capu::CAPU_OK);
-        //wait for new value
-        EXPECT_TRUE(GlobalVariables::cv.wait(&GlobalVariables::mutex)== capu::CAPU_OK);
-        //add value to new value
-        GlobalVariables::variable = GlobalVariables::variable + *value;
+        while(GlobalVariables::buffer == 0) {
+          EXPECT_TRUE(GlobalVariables::cv.wait(&GlobalVariables::mutex)== capu::CAPU_OK);
+        }
+        GlobalVariables::buffer--;
+        EXPECT_TRUE(GlobalVariables::cv.signal()== capu::CAPU_OK);
         EXPECT_TRUE(GlobalVariables::mutex.unlock()== capu::CAPU_OK);
+      }
     }
 };
 
@@ -52,13 +56,15 @@ class ThreadCondVarProducerBroadcast : p
  public:
     void operator()(void * param)
     {
-        //delayto make sure that producer will be called after consumer started
-        capu::Thread::Sleep(1000);
+      for(capu::int32_t i = 0; i < GlobalVariables::loops * 3; i++) {
         EXPECT_TRUE(GlobalVariables::mutex.lock()== capu::CAPU_OK);
-        //update shared value
-        GlobalVariables::variable = 5;
+        while(GlobalVariables::buffer == 100) {
+          EXPECT_TRUE(GlobalVariables::cv.wait(&GlobalVariables::mutex)== capu::CAPU_OK);
+        }
+        GlobalVariables::buffer++;
         EXPECT_TRUE(GlobalVariables::cv.broadcast()== capu::CAPU_OK);
         EXPECT_TRUE(GlobalVariables::mutex.unlock()== capu::CAPU_OK);
+      }
     }
 };
 
@@ -67,13 +73,15 @@ class ThreadCondVarProducerSignal : publ
  public:
     void operator()(void * param)
     {
-        //delayto make sure that producer will be called after consumer started
-        capu::Thread::Sleep(1000);
+      for(capu::int32_t i = 0; i < GlobalVariables::loops; i++) {
         EXPECT_TRUE(GlobalVariables::mutex.lock()== capu::CAPU_OK);
-        //update shared value
-        GlobalVariables::variable = 5;
+        while(GlobalVariables::buffer == 100) {
+          EXPECT_EQ(capu::CAPU_OK, GlobalVariables::cv.wait(&GlobalVariables::mutex));
+        }
+        GlobalVariables::buffer++;
         EXPECT_TRUE(GlobalVariables::cv.signal()== capu::CAPU_OK);
         EXPECT_TRUE(GlobalVariables::mutex.unlock()== capu::CAPU_OK);
+      }
     }
 };
 
@@ -93,14 +101,13 @@ TEST(CondVar,WaitTest)
 
 TEST(CondVar,WaitAndBroadcastTest)
 {
-    capu::int32_t newval = 6;
     ThreadCondVarConsumer consumer;
     ThreadCondVarProducerBroadcast producer;
     //create two thread
-    capu::Thread * CAPU_thread = new capu::Thread(&consumer,&newval);
-    capu::Thread * CAPU_thread2 = new capu::Thread(&consumer,&newval);
-    capu::Thread * CAPU_thread3 = new capu::Thread(&consumer,&newval);
-    capu::Thread * CAPU_thread4 = new capu::Thread(&producer,&newval);
+    capu::Thread * CAPU_thread = new capu::Thread(&consumer);
+    capu::Thread * CAPU_thread2 = new capu::Thread(&consumer);
+    capu::Thread * CAPU_thread3 = new capu::Thread(&consumer);
+    capu::Thread * CAPU_thread4 = new capu::Thread(&producer);
 
     //wait for them to finish
     CAPU_thread->join();
@@ -109,7 +116,7 @@ TEST(CondVar,WaitAndBroadcastTest)
     CAPU_thread4->join();
 
     //expected value
-    EXPECT_EQ(23, GlobalVariables::variable);
+    EXPECT_EQ(0, GlobalVariables::buffer);
     delete CAPU_thread;
     delete CAPU_thread2;
     delete CAPU_thread3;
@@ -118,17 +125,16 @@ TEST(CondVar,WaitAndBroadcastTest)
 
 TEST(CondVar,WaitAndSignalTest)
 {
-    capu::int32_t newval = 6;
     ThreadCondVarConsumer consumer;
     ThreadCondVarProducerSignal producer;
     //create two thread
-    capu::Thread * CAPU_thread = new capu::Thread(&consumer,&newval);
-    capu::Thread * CAPU_thread2 = new capu::Thread(&producer,&newval);
+    capu::Thread * CAPU_thread = new capu::Thread(&consumer);
+    capu::Thread * CAPU_thread2 = new capu::Thread(&producer);
     //wait for them to finish
     CAPU_thread->join();
     CAPU_thread2->join();
     //expected value
-    EXPECT_EQ(11, GlobalVariables::variable);
+    EXPECT_EQ(0, GlobalVariables::buffer);
     delete CAPU_thread;
     delete CAPU_thread2;
 }
@@ -140,6 +146,6 @@ TEST(CondVar,TimedWaitTest)
     capu::CondVar condvar;
     mutex.lock();
     //2 second wait and timeout
-    EXPECT_TRUE(condvar.wait(&mutex,2000) == capu::CAPU_ETIMEOUT);
+    EXPECT_TRUE(condvar.wait(&mutex, 2000) == capu::CAPU_ETIMEOUT);
     mutex.unlock();
 }