X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fcore%2Fthread.h;h=6a17912fdc3c03e0d0904aeb768b8a40ee316212;hp=937d161938b20aad593653bbe99ed882aeb77156;hb=c3e242c2629cbc9645258b30aaf07b7285d4372b;hpb=fe77fc6b869a71bf94d501a0762579f4ddbc5094 diff --git a/source/core/thread.h b/source/core/thread.h index 937d161..6a17912 100644 --- a/source/core/thread.h +++ b/source/core/thread.h @@ -1,12 +1,8 @@ -/* -This file is part of libmspcore -Copyright © 2006 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ -#ifndef MSP_FRAMEWORK_THREAD_H_ -#define MSP_FRAMEWORK_THREAD_H_ +#ifndef MSP_CORE_THREAD_H_ +#define MSP_CORE_THREAD_H_ -#include "types.h" +#include +#include "noncopyable.h" namespace Msp { @@ -17,32 +13,54 @@ automatically started upon creation - you must manually call launch() instead. This is to allow initializing variables of the derived class before the thread is started. */ -class Thread +class Thread: private NonCopyable { +private: + struct Private; + + enum State + { + PENDING, + RUNNING, + FINISHED, + KILLED, + JOINED + }; + + Private *priv_; + std::string name_; + State state_; + +protected: + Thread(const std::string & = std::string()); public: + virtual ~Thread(); + + const std::string &get_name() const { return name_; } + + /** Indicates whether the thread has finished running. */ + bool is_finished() { return state_>=FINISHED; } + + /** Waits for the thread to exit. Calling this from the thread will cause a + deadlock. */ void join(); - void cancel(); + + /** Violently terminates the thread. This should only be used as a last + resort, as the thread gets no chance to clean up. */ void kill(); - virtual ~Thread(); + protected: - Thread(): launched_(false) { } + /** Starts the thread. Can only be called once for each Thread instance. */ void launch(); - virtual void main()=0; - void check_cancel(); -private: - ThreadHandle thread_; - bool launched_; - Thread(const Thread &); - Thread &operator=(const Thread &); +private: + void platform_join(); + void platform_kill(); + void platform_launch(); + void platform_setname(); -#ifdef WIN32 -# define THREAD_RETURN_ DWORD WINAPI -#else -# define THREAD_RETURN_ void * -#endif - static THREAD_RETURN_ main_(void *t) { ((Thread *)t)->main(); return 0; } -#undef THREAD_RETURN_ +protected: + virtual void main() = 0; }; } // namespace Msp