diff options
Diffstat (limited to 'src/ito.h')
-rw-r--r-- | src/ito.h | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/ito.h b/src/ito.h new file mode 100644 index 0000000..c062052 --- /dev/null +++ b/src/ito.h | |||
@@ -0,0 +1,98 @@ | |||
1 | #ifndef BU_ITO_H | ||
2 | #define BU_ITO_H | ||
3 | |||
4 | #include <pthread.h> | ||
5 | |||
6 | namespace Bu | ||
7 | { | ||
8 | /** | ||
9 | * Simple thread class. This wraps the basic pthread (posix threads) system in | ||
10 | * an object oriented sort of way. It allows you to create a class with | ||
11 | * standard member variables and callable functions that can be run in it's own | ||
12 | * thread, one per class instance. | ||
13 | *@author Mike Buland | ||
14 | */ | ||
15 | class Ito | ||
16 | { | ||
17 | public: | ||
18 | /** | ||
19 | * Construct an Ito thread. | ||
20 | */ | ||
21 | Ito(); | ||
22 | |||
23 | /** | ||
24 | * Destroy an Ito thread. | ||
25 | */ | ||
26 | virtual ~Ito(); | ||
27 | |||
28 | /** | ||
29 | * Begin thread execution. This will call the overridden run function, | ||
30 | * which will simply execute in it's own thread until the function exits, | ||
31 | * the thread is killed, or the thread is cancelled (optionally). The | ||
32 | * thread started in this manner has access to all of it's class variables, | ||
33 | * but be sure to protect possible multiple-access with ItoMutex objects. | ||
34 | *@returns True if starting the thread was successful. False if something | ||
35 | * went wrong and the thread has not started. | ||
36 | */ | ||
37 | bool start(); | ||
38 | |||
39 | /** | ||
40 | * Forcibly kill a thread. This is not generally considered a good thing to | ||
41 | * do, but in those rare cases you need it, it's invaluable. The problem | ||
42 | * with stopping (or killing) a thread is that it stops it the moment you | ||
43 | * call stop, no matter what it's doing. The object oriented approach to | ||
44 | * this will help clean up any class variables that were used, but anything | ||
45 | * not managed as a member variable will probably create a memory leak type | ||
46 | * of situation. Instead of stop, consider using cancel, which can be | ||
47 | * handled by the running thread in a graceful manner. | ||
48 | *@returns True if the thread was stopped, false otherwise. When this | ||
49 | * function returns the thread may not have stopped, to ensure that the | ||
50 | * thread has really stopped, call join. | ||
51 | */ | ||
52 | bool stop(); | ||
53 | |||
54 | /** | ||
55 | * The workhorse of the Ito class. This is the function that will run in | ||
56 | * the thread, when this function exits the thread dies and is cleaned up | ||
57 | * by the system. Make sure to read up on ItoMutex, ItoCondition, and | ||
58 | * cancel to see how to control and protect everything you do in a safe way | ||
59 | * within this function. | ||
60 | *@returns I'm not sure right now, but this is the posix standard form. | ||
61 | */ | ||
62 | virtual void *run()=0; | ||
63 | |||
64 | /** | ||
65 | * Join the thread in action. This function performs what is commonly | ||
66 | * called a thread join. That is that it effectively makes the calling | ||
67 | * thread an the Ito thread contained in the called object one in the same, | ||
68 | * and pauses the calling thread until the called thread exits. That is, | ||
69 | * when called from, say, your main(), mythread.join() will not return until | ||
70 | * the thread mythread has exited. This is very handy at the end of | ||
71 | * programs to ensure all of your data was cleaned up. | ||
72 | *@returns True if the thread was joined, false if the thread couldn't be | ||
73 | * joined, usually because it isn't running to begin with. | ||
74 | */ | ||
75 | bool join(); | ||
76 | |||
77 | private: | ||
78 | pthread_t ptHandle; /**< Internal handle to the posix thread. */ | ||
79 | int nHandle; /**< Numeric handle to the posix thread. */ | ||
80 | |||
81 | protected: | ||
82 | /** | ||
83 | * This is the hidden-heard of the thread system. While run is what the | ||
84 | * user gets to override, and everything said about it is true, this is | ||
85 | * the function that actually makes up the thread, it simply calls the | ||
86 | * run member function in an OO-friendly way. This is what allows us to | ||
87 | * use member variables from within the thread itself. | ||
88 | *@param Should always be this. | ||
89 | *@returns This is specified by posix, I'm not sure yet. | ||
90 | */ | ||
91 | static void *threadRunner( void *pThread ); | ||
92 | |||
93 | void yield(); | ||
94 | |||
95 | }; | ||
96 | } | ||
97 | |||
98 | #endif | ||