My Project
 All Classes Files Functions Variables Enumerations Enumerator Friends Macros Pages
Thread.h
Go to the documentation of this file.
1 #ifndef thread_h
2 #define thread_h
3 
11 #include <iostream>
12 #include <pthread.h>
13 #include <string>
14 #include <unistd.h>
15 
16 // A thread start-up function
17 
18 #define THREAD_START(fn) void* (fn)(void *arg)
19 
20 // A thread shutdown function
21 
22 #define THREAD_STOP(fn) void (fn)(void *arg)
23 
24 // A thread cleanup function
25 
26 #define THREAD_CLEAN(fn) void (fn)(void *arg)
27 
28 // A method by which we can ping this thread
29 
30 #define THREAD_PING(fn) void (fn)(void *arg)
31 
32 // A pair of macros which we will use to safely lock/unlock a mutex.
33 // Also includes a fix to work-around the bug under kernel 2.4.20 that
34 // CORBA calls scramble the cancellation type.
35 
36 #define INSTALL_MUTEX_CLEANUP(mutex, logStream) \
37 {\
38  int oldtype;\
39  if(pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype) != 0) \
40  logStream.appendSysError(true, "pthread_setcanceltype");\
41  pthread_cleanup_push(&Thread::unlockMutex, (void *) (&mutex));\
42  if(oldtype != PTHREAD_CANCEL_DEFERRED && oldtype != PTHREAD_CANCEL_ASYNCHRONOUS) ;\
43  oldtype = PTHREAD_CANCEL_ASYNCHRONOUS
44 
45 #define UNINSTALL_MUTEX_CLEANUP(logStream) \
46  pthread_cleanup_pop(0);\
47  if(pthread_setcanceltype(oldtype, NULL) != 0) \
48  logStream.appendSysError(true, "pthread_setcanceltype");\
49 }
50 
51 namespace gcp {
52  namespace util {
53 
57  class Thread {
58 
59  public:
60 
72  void start(void* arg);
73 
79  void cancel();
80 
86  void ping(void* arg);
87 
93  void broadcastReady();
94 
100  void broadcastDone();
101 
108  void setRunState(bool state);
109 
114  bool matchName(std::string compname);
115 
119  std::string strName();
120 
144  Thread(THREAD_START(*startFn),
145  THREAD_CLEAN(*cleanFn),
146  THREAD_PING(*pingFn),
147  std::string name,
148  unsigned startOrder=0,
149  unsigned cancelOrder=0);
150 
151  // Note that if you use this constructor, you will have to
152  // specify the start and stop order
153 
154  Thread(THREAD_START(*startFn),
155  THREAD_CLEAN(*cleanFn),
156  THREAD_PING(*pingFn),
157  std::string name,
158  unsigned startOrder,
159  unsigned cancelOrder,
160  int priority,
161  int schedPolicy=SCHED_RR);
162 
166  ~Thread();
167 
171  bool isRunning();
172 
176  bool isPingable();
177 
181  void raise(int sigNo);
182 
187  static THREAD_CLEAN(unlockMutex);
188 
192  bool wasError_;
193 
194  inline unsigned startOrder() {
195  return startOrder_;
196  }
197 
198  inline unsigned cancelOrder() {
199  return cancelOrder_;
200  }
201 
202  void waitUntilReady();
203 
204  inline std::string name() {
205  return name_;
206  };
207 
208  private:
209 
210  unsigned startOrder_;
211  unsigned cancelOrder_;
212 
213  pthread_attr_t attr_;
214 
219  void* startupArg_;
220 
225  bool running_;
226 
230  pthread_mutex_t runningGuard_;
231 
235  pthread_t id_;
236 
241  struct CondVar {
242 
246  pthread_mutex_t guard;
247 
251  pthread_cond_t cond;
252  };
253 
258  CondVar ready_;
259 
264  CondVar done_;
265 
269  std::string name_;
270 
274  void privateConstructor(THREAD_START(*startFn),
275  THREAD_CLEAN(*cleanFn),
276  THREAD_PING(*pingFn),
277  std::string name,
278  unsigned startOrder, unsigned cancelOrder,
279  int priority,
280  int schedPolicy);
281 
285  static THREAD_START(startThread);
286 
290  static THREAD_CLEAN(cleanThread);
291 
297  THREAD_START(*userStartFn_);
298 
304  THREAD_CLEAN(*userCleanFn_);
305 
310  THREAD_PING(*userPingFn_);
311 
316  bool setRunStatePrivate(bool state);
317 
318  }; // End class Thread
319 
320  } // End namespace util
321 } // End namespace gcp
322 
323 
324 #endif
325 
326 
327 
328 
329 
330 
331 
332 
333 
bool isPingable()
Definition: Thread.cc:444
void setRunState(bool state)
Definition: Thread.cc:140
void ping(void *arg)
Definition: Thread.cc:331
void cancel()
Definition: Thread.cc:261
bool isRunning()
Definition: Thread.cc:340
bool matchName(std::string compname)
Definition: Thread.cc:411
void broadcastDone()
Definition: Thread.cc:402
Definition: Thread.h:57
Thread(THREAD_START(*startFn), THREAD_CLEAN(*cleanFn), THREAD_PING(*pingFn), std::string name, unsigned startOrder=0, unsigned cancelOrder=0)
std::string strName()
Definition: Thread.cc:419
~Thread()
Definition: Thread.cc:125
static THREAD_CLEAN(unlockMutex)
void start(void *arg)
Definition: Thread.cc:196
bool wasError_
Definition: Thread.h:192
void broadcastReady()
Definition: Thread.cc:348