-/*
-This file is part of libmspframework
-Copyright © 2006 Mikko Rasa, Mikkosoft Productions
-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);
-#endif
- launched_=false;
-}
-
-/**
-Requests the thread to terminate gracefully. Currently unimplemented on win32.
-*/
-void Thread::cancel()
-{
-#ifndef WIN32 //XXX
- pthread_cancel(thread_);
+ pthread_join(priv_->handle, 0);
#endif
+ launched_ = false;
}
/**
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();
-}
-
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;
+ launched_ = true;
}
} // namespace Msp