X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fcore%2Fthread.cpp;h=721e8cfef51f2ff772c304ff9ece65554c3f033a;hp=b382f067a3588868e4a0638dc577eb3059593b42;hb=a4596d1c2f627e4568eb6c01d81b6e45f488715a;hpb=5a9200b48b8455185b0fcbd55c69deca88a1184c diff --git a/source/core/thread.cpp b/source/core/thread.cpp index b382f06..721e8cf 100644 --- a/source/core/thread.cpp +++ b/source/core/thread.cpp @@ -1,96 +1,58 @@ -/* $Id$ - -This file is part of libmspcore -Copyright © 2006 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - -#ifdef WIN32 -#include -#else -#include -#include -#endif +#include #include "thread.h" +#include "thread_private.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 -}; +using namespace std; +namespace Msp { -Thread::Thread(): +Thread::Thread(const string &name): priv_(new Private), - launched_(false) + name_(name), + state_(PENDING) { } Thread::~Thread() { - if(launched_) - { - kill(); - join(); - } + kill(); + join(); delete priv_; } -/** -Waits for the thread to exit. Calling this from the thread will cause a -deadlock. -*/ void Thread::join() { - if(!launched_) + if(state_>=JOINED) return; -#ifdef WIN32 - WaitForSingleObject(priv_->handle, INFINITE); -#else - pthread_join(priv_->handle, 0); -#endif - launched_ = false; + platform_join(); + state_ = JOINED; } -/** -Violently terminates the thread. -*/ void Thread::kill() { -#ifdef WIN32 - TerminateThread(priv_->handle, 0); -#else - pthread_kill(priv_->handle, SIGKILL); -#endif + if(state_!=RUNNING) + return; + + platform_kill(); + state_ = KILLED; } void Thread::launch() { - if(launched_) - return; + if(state_>=RUNNING) + throw logic_error("already launched"); -#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 - launched_ = true; + platform_launch(); + state_ = RUNNING; +} + +ThreadReturn THREAD_CALL Thread::Private::main_wrapper(void *arg) +{ + Thread *thread = reinterpret_cast(arg); + thread->platform_setname(); + thread->main(); + thread->state_ = FINISHED; + return 0; } } // namespace Msp