scuffed-code/icu4c/source/test/intltest/simplethread.h
Andy Heninger 47d455a725 ICU-20179 Remove platform-specific mutex and atomics implementations.
Remove all POSIX and Win32 specific mutex, atomic and threading implementations
in favor of C++11 std library functions.

Move the related (internal) ICU types and functions into the icu namespace.
2018-11-19 17:17:09 -08:00

88 lines
2.9 KiB
C++
Executable File

// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/********************************************************************
* COPYRIGHT:
* Copyright (c) 1997-2015, International Business Machines Corporation and
* others. All Rights Reserved.
********************************************************************/
#ifndef SIMPLETHREAD_H
#define SIMPLETHREAD_H
#include <thread>
#include "unicode/utypes.h"
/*
* Simple class for creating threads in ICU tests.
* Originally created to provide a portable abstraction over platform
* (POSIX or Win32) threading interfaces.
*
* New threaded tests should consider skipping this class and directly using C++ std library
* threading functions. SimpleThread is retained primarily to support existing use.
*/
class SimpleThread
{
public:
SimpleThread();
virtual ~SimpleThread();
int32_t start(); // start the thread. Return 0 if successfull.
void join(); // A thread must be joined before deleting its SimpleThread.
virtual void run() = 0; // Override this to provide the code to run
// in the thread.
private:
std::thread fThread = {};
};
class IntlTest;
// ThreadPool - utililty class to simplify the spawning a group of threads by
// a multi-threaded test.
//
// Usage: from within an intltest test function,
// ThreadPool<TestClass> pool(
// this, // The current intltest test object,
// // of type "TestClass *"
// numberOfThreads, // How many threads to spawn.
// &TestClass::func); // The function to be run by each thread.
// // It takes one int32_t parameter which
// // is set to the thread number, 0 to numberOfThreads-1.
//
// pool.start(); // Start all threads running.
// pool.join(); // Wait until all threads have terminated.
class ThreadPoolBase {
public:
ThreadPoolBase(IntlTest *test, int32_t numThreads);
virtual ~ThreadPoolBase();
void start();
void join();
protected:
virtual void callFn(int32_t param) = 0;
friend class ThreadPoolThread;
IntlTest *fIntlTest;
int32_t fNumThreads;
SimpleThread **fThreads;
};
template<class TestClass>
class ThreadPool : public ThreadPoolBase {
private:
void (TestClass::*fRunFnPtr)(int32_t);
public:
ThreadPool(TestClass *test, int howMany, void (TestClass::*runFnPtr)(int32_t threadNumber)) :
ThreadPoolBase(test, howMany), fRunFnPtr(runFnPtr) {};
virtual ~ThreadPool() {};
private:
virtual void callFn(int32_t param) {
TestClass *test = dynamic_cast<TestClass *>(fIntlTest);
(test->*fRunFnPtr)(param);
}
};
#endif