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();
}