summaryrefslogtreecommitdiff
path: root/cpp/test/IceUtil/thread/CountDownLatchTest.cpp
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2004-04-20 20:41:05 +0000
committerBernard Normier <bernard@zeroc.com>2004-04-20 20:41:05 +0000
commit5640702be731df825d94487c5397f39ce1f8ca00 (patch)
treeb1f8391b165a88390c47fc361c8482b6f3634cb7 /cpp/test/IceUtil/thread/CountDownLatchTest.cpp
parentmore facet fixes (diff)
downloadice-5640702be731df825d94487c5397f39ce1f8ca00.tar.bz2
ice-5640702be731df825d94487c5397f39ce1f8ca00.tar.xz
ice-5640702be731df825d94487c5397f39ce1f8ca00.zip
Added CountDownLatch test
Diffstat (limited to 'cpp/test/IceUtil/thread/CountDownLatchTest.cpp')
-rw-r--r--cpp/test/IceUtil/thread/CountDownLatchTest.cpp159
1 files changed, 159 insertions, 0 deletions
diff --git a/cpp/test/IceUtil/thread/CountDownLatchTest.cpp b/cpp/test/IceUtil/thread/CountDownLatchTest.cpp
new file mode 100644
index 00000000000..4351f6140d7
--- /dev/null
+++ b/cpp/test/IceUtil/thread/CountDownLatchTest.cpp
@@ -0,0 +1,159 @@
+// **********************************************************************
+//
+// Copyright (c) 2004
+// ZeroC, Inc.
+// Billerica, MA, USA
+//
+// All Rights Reserved.
+//
+// Ice is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License version 2 as published by
+// the Free Software Foundation.
+//
+// **********************************************************************
+
+#include <IceUtil/IceUtil.h>
+
+#include <CountDownLatchTest.h>
+#include <TestCommon.h>
+
+using namespace std;
+using namespace IceUtil;
+
+static const string testName("countDownLatch");
+
+static const int magic = 0xbeef;
+
+class CountDownLatchTestThread : public Thread
+{
+public:
+
+ CountDownLatchTestThread(CountDownLatch& latch, int& val, bool takeOne) :
+ _latch(latch),
+ _val(val),
+ _takeOne(takeOne)
+ {
+ }
+
+ virtual void run()
+ {
+
+ if(_takeOne)
+ {
+ _latch.countDown();
+ }
+
+ if(_latch.getCount() == 0)
+ {
+ test(_val == magic);
+ }
+
+ _latch.await();
+ test(_latch.getCount() == 0);
+ test(_val == magic);
+ }
+
+private:
+
+ CountDownLatch& _latch;
+ int& _val;
+ bool _takeOne;
+};
+
+CountDownLatchTest::CountDownLatchTest() :
+ TestBase(testName)
+{
+}
+
+void
+CountDownLatchTest::run()
+{
+ const int fullCount = 11;
+
+ int val = 0xabcd;
+
+ CountDownLatch latch(fullCount);
+ test(latch.getCount() == fullCount);
+
+ const int wave1Count = 6;
+
+ int i = 0;
+ ThreadPtr t1[wave1Count];
+ for(i = 0; i < wave1Count; i++)
+ {
+ t1[i] = new CountDownLatchTestThread(latch, val, false);
+ t1[i]->start();
+ }
+
+ //
+ // Sleep a little bit, and check count
+ //
+ ThreadControl::sleep(Time::seconds(1));
+ test(latch.getCount() == fullCount);
+
+ //
+ // Let's count down all except 1
+ //
+ ThreadPtr t2[fullCount - 1];
+ for(i = 0; i < fullCount - 1; i++)
+ {
+ t2[i] = new CountDownLatchTestThread(latch, val, true);
+ t2[i]->start();
+ }
+
+ //
+ // Sleep until count == 1
+ //
+ do
+ {
+ ThreadControl::sleep(Time::milliSeconds(100));
+
+ for(i = 0; i < wave1Count; i++)
+ {
+ test(t1[i]->getThreadControl().isAlive());
+ }
+
+ for(i = 0; i < fullCount - 1; i++)
+ {
+ test(t2[i]->getThreadControl().isAlive());
+ }
+
+ } while(latch.getCount() > 1);
+
+ //
+ // Set val and release last count
+ //
+ val = magic;
+ latch.countDown();
+ test(latch.getCount() == 0);
+
+ //
+ // Join them all
+ //
+ for(i = 0; i < wave1Count; i++)
+ {
+ t1[i]->getThreadControl().join();
+ }
+
+ for(i = 0; i < fullCount - 1; i++)
+ {
+ t2[i]->getThreadControl().join();
+ }
+
+ test(latch.getCount() == 0);
+
+ const int wave2Count = 4;
+ ThreadPtr t3[wave2Count];
+ for(i = 0; i < wave2Count; i++)
+ {
+ t3[i] = new CountDownLatchTestThread(latch, val, true);
+ t3[i]->start();
+ }
+ test(latch.getCount() == 0);
+
+ for(i = 0; i < wave2Count; i++)
+ {
+ t3[i]->getThreadControl().join();
+ }
+ test(latch.getCount() == 0);
+}