00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _pthread_h_
00021 #define _pthread_h_
00022
00023 #include <pclasses/pexport.h>
00024 #include <pclasses/pexception.h>
00025 #include <pclasses/psemaphore.h>
00026
00027 namespace P {
00028
00030
00034 class ThreadError: public SystemError {
00035 public:
00036 inline ThreadError(oserr_t errnum, const char* _what, const SourceInfo& _si) throw()
00037 : SystemError(errnum, _what, _si) {}
00038
00039 inline BaseError* clone() const
00040 { return new ThreadError(*this); }
00041
00042 };
00043
00045
00050 class PCORE_EXPORT Thread {
00051 public:
00053 enum state_t {
00054 Stopped,
00055 Running,
00056 Suspended
00057 };
00058
00059 Thread() throw();
00060 virtual ~Thread();
00061
00063 void start(Semaphore* sem = 0, int prio = 0) throw(LogicError, ThreadError);
00064
00066 bool stop(unsigned int timeout) throw(LogicError, SyncError);
00067
00069 void kill() throw(LogicError, SystemError);
00070
00072 bool suspend(unsigned int timeout) throw(LogicError, SyncError);
00073
00075 void resume() throw(LogicError, SyncError);
00076
00078 state_t state() const throw();
00079
00081 static void yield() throw();
00082
00084
00090 static void sleep(unsigned int timeout) throw();
00091
00093 static void exit() throw();
00094
00096 static Thread* current() throw();
00097
00098 protected:
00099 virtual bool initial() = 0;
00100 virtual void main() = 0;
00101 virtual void suspended() {};
00102 virtual void resumed() {};
00103 virtual void final() {};
00104
00105 bool testCancel() throw(LogicError, SyncError);
00106
00107 class Private;
00108 friend class Private;
00109
00110 struct thread_handle_t;
00111 friend struct thread_handle_t;
00112
00113 thread_handle_t* handle() const throw();
00114
00115 static thread_handle_t* createHandle();
00116 static void destroyHandle(thread_handle_t* handle);
00117
00118 private:
00119 thread_handle_t* m_handle;
00120 };
00121
00122 }
00123
00124 #endif