-#ifdef WIN32
-#include <windows.h>
-#else
-#include <pthread.h>
-#include <signal.h>
-#endif
-#include <stdexcept>
+#include "except.h"
#include "thread.h"
+#include "thread_private.h"
using namespace std;
namespace Msp {
-struct Thread::Private
-{
-#ifdef WIN32
- HANDLE handle;
-#else
- pthread_t handle;
-#endif
-
- Private(): handle(0) { }
-
-#ifdef WIN32
- static DWORD WINAPI
-#else
- static void *
-#endif
- main_wrapper(void *a)
- {
- Thread *t = reinterpret_cast<Thread *>(a);
- t->main();
- t->state_ = FINISHED;
- return 0;
- }
-};
-
-
-Thread::Thread():
- priv_(new Private),
- state_(PENDING)
+Thread::Thread(const string &name):
+ _priv(new Private),
+ _name(name)
{ }
Thread::~Thread()
{
kill();
join();
- delete priv_;
+ delete _priv;
}
void Thread::join()
{
- if(state_>=JOINED)
+ if(_state>=JOINED)
return;
-#ifdef WIN32
- WaitForSingleObject(priv_->handle, INFINITE);
-#else
- pthread_join(priv_->handle, 0);
-#endif
- state_ = JOINED;
+ platform_join();
+ _state = JOINED;
}
void Thread::kill()
{
- if(state_!=RUNNING)
+ if(_state!=RUNNING)
return;
-#ifdef WIN32
- TerminateThread(priv_->handle, 0);
-#else
- pthread_kill(priv_->handle, SIGKILL);
-#endif
- state_ = KILLED;
+ platform_kill();
+ _state = KILLED;
}
void Thread::launch()
{
- if(state_>=RUNNING)
- throw logic_error("already launched");
+ if(_state>=RUNNING)
+ throw already_called("Thread::launch");
+
+ platform_launch();
+ _state = RUNNING;
+}
-#ifdef WIN32
- DWORD dummy; // Win9x needs the lpTthreadId parameter
- priv_->handle = CreateThread(0, 0, &Private::main_wrapper, this, 0, &dummy);
-#else
- pthread_create(&priv_->handle, 0, &Private::main_wrapper, this);
-#endif
- state_ = RUNNING;
+ThreadReturn THREAD_CALL Thread::Private::main_wrapper(void *arg)
+{
+ Thread *thread = reinterpret_cast<Thread *>(arg);
+ thread->platform_setname();
+ thread->main();
+ thread->_state = FINISHED;
+ return 0;
}
} // namespace Msp