Forgot this one
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@664727 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/cpp/src/concurrency/test/ThreadManagerTests.h b/lib/cpp/src/concurrency/test/ThreadManagerTests.h
new file mode 100644
index 0000000..aad6332
--- /dev/null
+++ b/lib/cpp/src/concurrency/test/ThreadManagerTests.h
@@ -0,0 +1,129 @@
+#include <ThreadManager.h>
+#include <PosixThreadFactory.h>
+#include <Monitor.h>
+#include <Util.h>
+
+#include <assert.h>
+#include <set>
+#include <iostream>
+
+namespace facebook { namespace thrift { namespace concurrency { namespace test {
+
+using namespace facebook::thrift::concurrency;
+
+/** ThreadManagerTests class
+
+ @author marc
+ @version $Id:$ */
+
+class ThreadManagerTests {
+
+public:
+
+ class Task: public Runnable {
+
+ public:
+
+ Task(Monitor& monitor, size_t& count, long long timeout) :
+ _monitor(monitor),
+ _count(count),
+ _timeout(timeout),
+ _addTime(Util::currentTime()),
+ _success(false),
+ _done(false) {}
+
+ void run() {
+
+ _startTime = Util::currentTime();
+
+ Monitor sleep;
+
+ {Synchronized s(sleep);
+
+ sleep.wait(_timeout);
+ }
+
+ _endTime = Util::currentTime();
+
+ _done = true;
+
+ _success = true;
+
+ {Synchronized s(_monitor);
+
+ // std::cout << "Thread " << _count << " completed " << std::endl;
+
+ _count--;
+
+ if(_count == 0) {
+
+ _monitor.notify();
+ }
+ }
+ }
+
+ Monitor& _monitor;
+ size_t& _count;
+ long long _timeout;
+ long long _addTime;
+ long long _startTime;
+ long long _endTime;
+ bool _success;
+ bool _done;
+ };
+
+ /** Dispatch count tasks, each of which blocks for timeout milliseconds then completes.
+ Verify that all tasks completed and that thread manager cleans up properly on delete. */
+
+ bool test00(size_t count=100, long long timeout=100LL, size_t workerCount=4) {
+
+ Monitor monitor;
+
+ size_t activeCount = count;
+
+ ThreadManager* threadManager = ThreadManager::newSimpleThreadManager(workerCount);
+
+ threadManager->threadFactory(new PosixThreadFactory());
+
+ std::set<ThreadManagerTests::Task*> tasks;
+
+ for(size_t ix = 0; ix < count; ix++) {
+
+ tasks.insert(new ThreadManagerTests::Task(monitor, activeCount, timeout));
+ }
+
+ for(std::set<ThreadManagerTests::Task*>::iterator ix = tasks.begin(); ix != tasks.end(); ix++) {
+
+ threadManager->add(*ix);
+ }
+
+ {Synchronized s(monitor);
+
+ while(activeCount > 0) {
+
+ monitor.wait();
+ }
+ }
+
+ bool success;
+
+ for(std::set<ThreadManagerTests::Task*>::iterator ix = tasks.begin(); ix != tasks.end(); ix++) {
+
+ success = success || (*ix)->_success;
+
+ delete *ix;
+
+ }
+
+ delete threadManager;
+
+ std::cout << "\t\t\t" << (success ? "Success" : "Failure") << "!" << std::endl;
+
+ return true;
+ }
+};
+
+}}}} // facebook::thrift::concurrency
+
+using namespace facebook::thrift::concurrency::test;
+