Simplifies ThreadWithParam.

This commit is contained in:
zhanyong.wan 2010-03-04 22:33:46 +00:00
parent 12a92c26fc
commit 542b41e5d0

View File

@ -811,10 +811,7 @@ class Notification {
};
// Helper class for testing Google Test's multi-threading constructs.
// To use it, derive a class template ThreadWithParam<T> from
// ThreadWithParamBase<T> and implement thread creation and startup in
// the constructor and joining the thread in JoinUnderlyingThread().
// Then you can write:
// To use it, write:
//
// void ThreadFunc(int param) { /* Do things with param */ }
// Notification thread_can_start;
@ -826,40 +823,51 @@ class Notification {
// These classes are only for testing Google Test's own constructs. Do
// not use them in user tests, either directly or indirectly.
template <typename T>
class ThreadWithParamBase {
class ThreadWithParam {
public:
typedef void (*UserThreadFunc)(T);
ThreadWithParamBase(
ThreadWithParam(
UserThreadFunc func, T param, Notification* thread_can_start)
: func_(func),
param_(param),
thread_can_start_(thread_can_start),
finished_(false) {}
virtual ~ThreadWithParamBase() {}
finished_(false) {
// The thread can be created only after all fields except thread_
// have been initialized.
GTEST_CHECK_POSIX_SUCCESS_(
pthread_create(&thread_, 0, ThreadMainStatic, this));
}
~ThreadWithParam() { Join(); }
void Join() {
if (!finished_) {
JoinUnderlyingThread();
GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
finished_ = true;
}
}
virtual void JoinUnderlyingThread() = 0;
private:
void ThreadMain() {
if (thread_can_start_ != NULL)
thread_can_start_->WaitForNotification();
func_(param_);
}
protected:
static void* ThreadMainStatic(void* thread_with_param) {
static_cast<ThreadWithParam<T>*>(thread_with_param)->ThreadMain();
return NULL; // We are not interested in the thread exit code.
}
const UserThreadFunc func_; // User-supplied thread function.
const T param_; // User-supplied parameter to the thread function.
// When non-NULL, used to block execution until the controller thread
// notifies.
Notification* const thread_can_start_;
bool finished_; // true iff we know that the thread function has finished.
pthread_t thread_; // The native thread object.
GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
};
// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
@ -1024,34 +1032,6 @@ class ThreadLocal {
GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
};
// Helper class for testing Google Test's multi-threading constructs.
template <typename T>
class ThreadWithParam : public ThreadWithParamBase<T> {
public:
ThreadWithParam(void (*func)(T), T param, Notification* thread_can_start)
: ThreadWithParamBase<T>(func, param, thread_can_start) {
// The thread can be created only after all fields except thread_
// have been initialized.
GTEST_CHECK_POSIX_SUCCESS_(
pthread_create(&thread_, 0, ThreadMainStatic, this));
}
virtual ~ThreadWithParam() { this->Join(); }
virtual void JoinUnderlyingThread() {
GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
}
private:
static void* ThreadMainStatic(void* thread_with_param) {
static_cast<ThreadWithParam<T>*>(thread_with_param)->ThreadMain();
return NULL; // We are not interested in the thread exit code.
}
pthread_t thread_; // The native thread object.
GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
};
#define GTEST_IS_THREADSAFE 1
#else // GTEST_HAS_PTHREAD