Distributed under the LGPL
*/
-#ifndef WIN32
+#ifdef WIN32
+#include <windows.h>
+#else
+#include <pthread.h>
#include <signal.h>
#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<Thread *>(t)->main(); return 0; }
+#else
+ static void *main_wrapper(void *t)
+ { reinterpret_cast<Thread *>(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.
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_)
#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;
}
#ifndef MSP_CORE_THREAD_H_
#define MSP_CORE_THREAD_H_
-#include "types.h"
-
namespace Msp {
/**
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<Thread *>(t))->main(); return 0; }
-
- Thread(const Thread &);
- Thread &operator=(const Thread &);
};
} // namespace Msp