1#ifndef __GENERIC_THREAD_H__
2#define __GENERIC_THREAD_H__
3
4
5#include <Message.h>
6
7
8class GenericThread
9{
10public:
11							GenericThread(const char*
12								thread_name = "generic_thread",
13								int32 priority = B_NORMAL_PRIORITY,
14								BMessage* message = NULL);
15	virtual					~GenericThread();
16
17			BMessage*		GetDataStore();
18			void			SetDataStore(BMessage* message);
19
20			status_t		Start();
21			status_t		Pause(bool doBlock = TRUE, bigtime_t timeout = 0);
22			void			Quit();
23			bool			IsPaused();
24			bool			HasQuitBeenRequested();
25
26			status_t		Suspend();
27			status_t		Resume();
28			status_t		Kill();
29
30			void			ExitWithReturnValue(status_t returnValue);
31			status_t		SetExitCallback(void (*callback)(void*),
32								void* data);
33			status_t		WaitForThread(status_t* exitValue);
34
35			status_t		Rename(char* name);
36
37			status_t		SendData(int32 code, void* buffer,
38								size_t bufferSize);
39			int32			ReceiveData(thread_id* sender, void* buffer,
40								size_t bufferSize);
41			bool			HasData();
42
43			status_t		SetPriority(int32 newPriority);
44
45			void			Snooze(bigtime_t microseconds);
46			void			SnoozeUntil(bigtime_t microseconds,
47								int timebase = B_SYSTEM_TIMEBASE);
48
49			status_t		GetInfo(thread_info* threadInfo);
50			thread_id		GetThread();
51			team_id			GetTeam();
52			char*			GetName();
53			thread_state	GetState();
54			sem_id			GetSemaphore();
55			int32			GetPriority();
56			bigtime_t		GetUserTime();
57			bigtime_t		GetKernelTime();
58			void*			GetStackBase();
59			void*			GetStackEnd();
60
61protected:
62	virtual	status_t		ThreadFunction();
63	virtual	status_t		ThreadStartup();
64	virtual	status_t		ExecuteUnit();
65	virtual	status_t		ThreadShutdown();
66
67	virtual	void			ThreadStartupFailed(status_t status);
68	virtual	void			ExecuteUnitFailed(status_t status);
69	virtual	void			ThreadShutdownFailed(status_t status);
70
71			void			BeginUnit();
72			void			EndUnit();
73
74			BMessage*		fThreadDataStore;
75
76private:
77	static	status_t		_ThreadFunction(void* simpleThreadPtr);
78
79			thread_id		fThreadId;
80			sem_id			fExecuteUnitSem;
81			bool			fQuitRequested;
82			bool			fThreadIsPaused;
83
84};
85
86#endif	// __GENERIC_THREAD_H__
87
88