1 #ifndef __GENERIC_THREAD_H__ 2 #define __GENERIC_THREAD_H__ 3 4 #include <OS.h> 5 #include <Message.h> 6 7 class GenericThread 8 { 9 public: 10 GenericThread(const char * a_thread_name = "generic_thread", int32 a_priority = B_NORMAL_PRIORITY, BMessage * a_message = NULL); 11 virtual ~GenericThread(void); 12 13 BMessage * GetDataStore(void); 14 void SetDataStore(BMessage * a_message); 15 16 status_t Start(void); 17 status_t Pause(bool a_do_block = TRUE, bigtime_t a_timeout = 0); 18 void Quit(void); 19 bool IsPaused(void); 20 bool HasQuitBeenRequested(void); 21 22 status_t Suspend(void); 23 status_t Resume(void); 24 status_t Kill(void); 25 26 void ExitWithReturnValue(status_t a_return_value); 27 status_t SetExitCallback(void(* a_callback)(void *), void * a_data); 28 status_t WaitForThread(status_t * a_exit_value); 29 30 status_t Rename(char * a_name); 31 32 status_t SendData(int32 a_code, void * a_buffer, size_t a_buffer_size); 33 int32 ReceiveData(thread_id * a_sender, void * a_buffer, size_t a_buffer_size); 34 bool HasData(void); 35 36 status_t SetPriority(int32 a_new_priority); 37 38 void Snooze(bigtime_t a_microseconds); 39 void SnoozeUntil(bigtime_t a_microseconds, int a_timebase = B_SYSTEM_TIMEBASE); 40 41 42 status_t GetInfo(thread_info * a_thread_info); 43 thread_id GetThread(void); 44 team_id GetTeam(void); 45 char * GetName(void); 46 thread_state GetState(void); 47 sem_id GetSemaphore(void); 48 int32 GetPriority(void); 49 bigtime_t GetUserTime(void); 50 bigtime_t GetKernelTime(void); 51 void * GetStackBase(void); 52 void * GetStackEnd(void); 53 54 protected: 55 56 virtual status_t ThreadFunction(void); 57 virtual status_t ThreadStartup(void); 58 virtual status_t ExecuteUnit(void); 59 virtual status_t ThreadShutdown(void); 60 61 virtual void ThreadStartupFailed(status_t a_status); 62 virtual void ExecuteUnitFailed(status_t a_status); 63 virtual void ThreadShutdownFailed(status_t a_status); 64 65 void BeginUnit(void); // acquire m_execute_cycle 66 void EndUnit(void); // release m_execute_cycle 67 68 BMessage * m_thread_data_store; 69 70 private: 71 72 static status_t private_thread_function(void * a_simple_thread_ptr); 73 74 thread_id m_thread_id; 75 76 sem_id m_execute_unit; // acq./relase within tread_function.. For Pause() 77 78 bool m_quit_requested; 79 bool m_thread_is_paused; 80 81 }; 82 83 #endif 84