summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzhanyong.wan <zhanyong.wan@861a406c-534a-0410-8894-cb66d6ee9925>2010-03-04 22:33:46 (GMT)
committerzhanyong.wan <zhanyong.wan@861a406c-534a-0410-8894-cb66d6ee9925>2010-03-04 22:33:46 (GMT)
commit542b41e5d010cf0a18a37252d5f4b05cfa5408af (patch)
treea00669840aebfc305acb4019e03c4bddff831b7f
parent12a92c26fc0e0de81f687dbe739a6aa24f37f9dd (diff)
downloadgoogletest-542b41e5d010cf0a18a37252d5f4b05cfa5408af.zip
googletest-542b41e5d010cf0a18a37252d5f4b05cfa5408af.tar.gz
googletest-542b41e5d010cf0a18a37252d5f4b05cfa5408af.tar.bz2
Simplifies ThreadWithParam.
-rw-r--r--include/gtest/internal/gtest-port.h60
1 files changed, 20 insertions, 40 deletions
diff --git a/include/gtest/internal/gtest-port.h b/include/gtest/internal/gtest-port.h
index b1b9203..4cf9663 100644
--- a/include/gtest/internal/gtest-port.h
+++ b/include/gtest/internal/gtest-port.h
@@ -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