From 5a9200b48b8455185b0fcbd55c69deca88a1184c Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sat, 28 May 2011 12:52:16 +0300 Subject: [PATCH] Refactor Thread class with pimpl to avoid exposing platform-specific parts --- source/core/thread.cpp | 71 ++++++++++++++++++++++++++---------------- source/core/thread.h | 27 +++++----------- 2 files changed, 53 insertions(+), 45 deletions(-) diff --git a/source/core/thread.cpp b/source/core/thread.cpp index 810b1f8..b382f06 100644 --- a/source/core/thread.cpp +++ b/source/core/thread.cpp @@ -5,13 +5,51 @@ Copyright © 2006 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ -#ifndef WIN32 +#ifdef WIN32 +#include +#else +#include #include #endif #include "thread.h" namespace Msp { +struct Thread::Private +{ +#ifdef WIN32 + HANDLE handle; +#else + pthread_t handle; +#endif + + Private(): handle(0) { } + +#ifdef WIN32 + static DWORD WINAPI main_wrapper(void *t) + { reinterpret_cast(t)->main(); return 0; } +#else + static void *main_wrapper(void *t) + { reinterpret_cast(t)->main(); return 0; } +#endif +}; + + +Thread::Thread(): + priv_(new Private), + launched_(false) +{ } + +Thread::~Thread() +{ + if(launched_) + { + kill(); + join(); + } + delete priv_; +} + /** Waits for the thread to exit. Calling this from the thread will cause a deadlock. @@ -22,44 +60,25 @@ void Thread::join() return; #ifdef WIN32 - WaitForSingleObject(thread_, INFINITE); + WaitForSingleObject(priv_->handle, INFINITE); #else - pthread_join(thread_, 0); + pthread_join(priv_->handle, 0); #endif launched_ = false; } -/** -Requests the thread to terminate gracefully. Currently unimplemented on win32. -*/ -void Thread::cancel() -{ -#ifndef WIN32 //XXX - pthread_cancel(thread_); -#endif -} - /** Violently terminates the thread. */ void Thread::kill() { #ifdef WIN32 - TerminateThread(thread_, 0); + TerminateThread(priv_->handle, 0); #else - pthread_kill(thread_, SIGKILL); + pthread_kill(priv_->handle, SIGKILL); #endif } -Thread::~Thread() -{ - if(launched_) - { - kill(); - join(); - } -} - void Thread::launch() { if(launched_) @@ -67,9 +86,9 @@ void Thread::launch() #ifdef WIN32 DWORD dummy; // Win9x needs the lpTthreadId parameter - thread_ = CreateThread(0, 0, &main_, this, 0, &dummy); + priv_->handle = CreateThread(0, 0, &Private::main_wrapper, this, 0, &dummy); #else - pthread_create(&thread_, 0, &main_, this); + pthread_create(&priv_->handle, 0, &Private::main_wrapper, this); #endif launched_ = true; } diff --git a/source/core/thread.h b/source/core/thread.h index 92923f3..59e6e06 100644 --- a/source/core/thread.h +++ b/source/core/thread.h @@ -8,8 +8,6 @@ Distributed under the LGPL #ifndef MSP_CORE_THREAD_H_ #define MSP_CORE_THREAD_H_ -#include "types.h" - namespace Msp { /** @@ -22,33 +20,24 @@ is started. class Thread { private: - ThreadHandle thread_; - bool launched_; + struct Private; + + Private *priv_; + bool launched_; protected: - Thread(): launched_(false) { } + Thread(); +private: + Thread(const Thread &); + Thread &operator=(const Thread &); public: virtual ~Thread(); void join(); - void cancel(); void kill(); protected: void launch(); virtual void main() = 0; - void check_cancel(); - -private: - static -#ifdef WIN32 - DWORD WINAPI -#else - void * -#endif - main_(void *t) { (reinterpret_cast(t))->main(); return 0; } - - Thread(const Thread &); - Thread &operator=(const Thread &); }; } // namespace Msp -- 2.45.2