// license: public domain // authors: jonas.sundstrom@kirilla.com #ifndef _GENERIC_THREAD_H #define _GENERIC_THREAD_H #include #include class GenericThread { public: GenericThread( const char* threadName = "generic_thread", int32 priority = B_NORMAL_PRIORITY, BMessage* message = NULL); virtual ~GenericThread(void); BMessage* GetDataStore(void); void SetDataStore(BMessage* message); status_t Start(void); status_t Pause(bool shouldBlock = true, bigtime_t timeout = 0); void Quit(void); bool IsPaused(void); bool HasQuitBeenRequested(void); status_t Suspend(void); status_t Resume(void); status_t Kill(void); void ExitWithReturnValue(status_t returnValue); status_t SetExitCallback(void (*callback)(void*), void* data); status_t WaitForThread(status_t* exitValue); status_t Rename(char* name); status_t SendData(int32 code, void* buffer, size_t size); int32 ReceiveData(thread_id* sender, void* buffer, size_t size); bool HasData(void); status_t SetPriority(int32 priority); void Snooze(bigtime_t delay); void SnoozeUntil(bigtime_t delay, int timeBase = B_SYSTEM_TIMEBASE); status_t GetInfo(thread_info* info); thread_id GetThread(void); team_id GetTeam(void); char* GetName(void); thread_state GetState(void); sem_id GetSemaphore(void); int32 GetPriority(void); bigtime_t GetUserTime(void); bigtime_t GetKernelTime(void); void* GetStackBase(void); void* GetStackEnd(void); protected: virtual status_t ThreadFunction(void); virtual status_t ThreadStartup(void); virtual status_t ExecuteUnit(void); virtual status_t ThreadShutdown(void); virtual void ThreadStartupFailed(status_t status); virtual void ExecuteUnitFailed(status_t status); virtual void ThreadShutdownFailed(status_t status); void BeginUnit(void); // acquire m_execute_cycle void EndUnit(void); // release m_execute_cycle BMessage* fThreadDataStore; private: static status_t private_thread_function(void* pointer); thread_id fThreadId; sem_id fExecuteUnit; // acquire/relase within tread_function... // for Pause() bool fQuitRequested; bool fThreadIsPaused; }; #endif // _GENERIC_THREAD_H