#ifndef __GENERIC_THREAD_H__ #define __GENERIC_THREAD_H__ #include #include class GenericThread { public: GenericThread (const char * a_thread_name = "generic_thread", int32 a_priority = B_NORMAL_PRIORITY, BMessage * a_message = NULL); virtual ~GenericThread (void); BMessage * GetDataStore (void); void SetDataStore (BMessage * a_message); status_t Start (void); status_t Pause (bool a_do_block = TRUE, bigtime_t a_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 a_return_value); status_t SetExitCallback (void (* a_callback)(void *), void * a_data); status_t WaitForThread (status_t * a_exit_value); status_t Rename (char * a_name); status_t SendData (int32 a_code, void * a_buffer, size_t a_buffer_size); int32 ReceiveData (thread_id * a_sender, void * a_buffer, size_t a_buffer_size); bool HasData (void); status_t SetPriority (int32 a_new_priority); void Snooze (bigtime_t a_microseconds); void SnoozeUntil (bigtime_t a_microseconds, int a_timebase = B_SYSTEM_TIMEBASE); status_t GetInfo (thread_info * a_thread_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 a_status); virtual void ExecuteUnitFailed (status_t a_status); virtual void ThreadShutdownFailed (status_t a_status); void BeginUnit (void); // acquire m_execute_cycle void EndUnit (void); // release m_execute_cycle BMessage * m_thread_data_store; private: static status_t private_thread_function (void * a_simple_thread_ptr); thread_id m_thread_id; sem_id m_execute_unit; // acq./relase within tread_function.. For Pause() bool m_quit_requested; bool m_thread_is_paused; }; #endif