My Project
 All Classes Files Functions Variables Enumerations Enumerator Friends Macros Pages
SignalTask.h
Go to the documentation of this file.
1 #ifndef SIGNALTASK_H
2 #define SIGNALTASK_H
3 
11 #include <string>
12 #include <vector>
13 
14 #include "gcp/util/common/AbsTimer.h"
15 #include "gcp/util/common/GenericTask.h"
16 #include "gcp/util/common/SignalTaskMsg.h"
17 
18 namespace gcp {
19  namespace util {
20 
21  class Thread;
22 
53  class SignalTask :
54  public gcp::util::
55  GenericTask<gcp::util::SignalTaskMsg> {
56 
57  public:
58 
66  SignalTask(bool spawnThread = false);
67 
73  virtual ~SignalTask();
74 
78  void sendInstallTimerMsg(std::string name,
79  int sigNo,
80  unsigned long initSec,
81  unsigned long initNsec,
82  unsigned long intervalSec,
83  unsigned long intervaNsec,
84  SIGNALTASK_HANDLER_FN(*handler));
85 
89  void sendAddHandlerMsg(std::string name,
90  SIGNALTASK_HANDLER_FN(*handler),
91  bool add);
92 
96  void sendInstallSignalMsg(int sigNo, SIGNALTASK_HANDLER_FN(*handler),
97  void* arg=NULL);
98 
102  void sendAddHandlerMsg(int sigNo,
103  SIGNALTASK_HANDLER_FN(*handler),
104  bool add);
105 
109  void sendEnableTimerMsg(std::string name, bool enable);
110 
114  void stopTimers();
115 
119  int getIoSig();
120 
124  virtual void run();
125 
129  void serviceMsgQ();
130 
131  protected:
132 
133  class TimerInfo {
134  public:
138  TimerInfo(std::string name,
139  int sigNo,
140  unsigned long initSec,
141  unsigned long initNsec,
142  unsigned long intervalSec,
143  unsigned long intervalNsec);
144 
148  ~TimerInfo();
149 
153  void reArm();
154 
155  private:
156 
157  friend class SignalTask;
158 
159  int sigNo_; // The signal to handle.
160  unsigned long initSec_; // The intial delay, in seconds,
161  // of this timer.
162  unsigned long initNsec_; // The initial delay, in
163  // nanoseconds, of this timer.
164  unsigned long intervalSec_; // The interval, in seconds, of
165  // this timer.
166  unsigned long intervalNsec_; // The interval, in nanoseconds,
167  // of this timer.
168  std::string name_; // A name for this timer
169  bool enabled_; // True when this timer is enabled
170  AbsTimer* timer_; // The timer itself
171  };
172 
177  public:
178 
182  SignalHandler(int sigNo, SIGNALTASK_HANDLER_FN(*handler),
183  void* arg=NULL);
184 
189  SignalHandler(int sigNo,
190  SIGNALTASK_HANDLER_FN(*handler),
191  TimerInfo* timer,
192  void* arg=NULL);
193 
197  void reArm();
198 
202  ~SignalHandler();
203 
207  void addHandler(SIGNALTASK_HANDLER_FN(*handler), void* arg=NULL);
208 
212  void removeHandler(SIGNALTASK_HANDLER_FN(*handler));
213 
214  private:
215 
216  friend class SignalTask;
217 
221  int sigNo_;
222 
223  struct HandlerPair {
224 
225  HandlerPair(SIGNALTASK_HANDLER_FN(*handler), void* args) {
226  handler_ = handler;
227  args_ = args;
228  }
229 
230  SIGNALTASK_HANDLER_FN(*handler_);
231  void* args_;
232  };
233 
237  std::vector<HandlerPair> handlers_;
238 
242  TimerInfo* timer_;
243  };
244 
245  protected:
246 
252  sigset_t handledSignals_;
253 
254  private:
255 
260  void privateConstructor();
261 
266  int sigIo_;
267 
271  pthread_t id_;
272 
276  static SignalTask* signaltask_;
277 
286  std::vector<TimerInfo*> timers_;
287 
288  // Members for managing a spawned thread
289 
294  Thread* spawnedThread_;
295 
299  bool spawned_;
300 
304  static THREAD_START(startUp);
305 
310  std::vector<SignalHandler*> signalHandlers_;
311 
315  void installTimer(SignalTaskMsg* msg);
316 
320  void installTimer(std::string name,
321  int sigNo,
322  unsigned long initSec,
323  unsigned long initNsec,
324  unsigned long intervalSec,
325  unsigned long intervalNsec,
326  SIGNALTASK_HANDLER_FN(*handler));
327 
331  void addHandler(std::string name, SIGNALTASK_HANDLER_FN(*handler),
332  void* args=NULL);
333 
337  void removeHandler(std::string name, SIGNALTASK_HANDLER_FN(*handler));
338 
343  SignalHandler* getHandler(int sigNo);
344 
349  TimerInfo* getTimer(int sigNo);
350 
355  TimerInfo* getTimer(std::string name);
356 
360  void installSignal(SignalTaskMsg* msg);
361 
365  void installSignal(int sigNo, SIGNALTASK_HANDLER_FN(*handler),
366  void* arg=NULL);
367 
371  void addHandler(int sigNo, SIGNALTASK_HANDLER_FN(*handler),
372  void* args=NULL);
373 
377  void removeHandler(int sigNo, SIGNALTASK_HANDLER_FN(*handler));
378 
382  void enableTimer(SignalTaskMsg* msg);
383 
387  void startTimer(std::string name);
388 
392  void stopTimer(std::string name);
393 
397  void startTimers();
398 
402  void processTaskMsg(bool* stop);
403 
408  static SIGNALTASK_HANDLER_FN(checkMsgQ);
409 
413  void fwdTaskMsg(SignalTaskMsg* msg);
414 
415  }; // End class SignalTask
416 
417  } // End namespace util
418 } // End namespace gcp
419 
420 
421 #endif // End #ifndef
Definition: SignalTaskMsg.h:19
void stopTimers()
Definition: SignalTask.cc:638
~SignalHandler()
Definition: SignalTask.cc:109
void removeHandler(SIGNALTASK_HANDLER_FN(*handler))
Definition: SignalTask.cc:141
Definition: SignalTask.h:53
void reArm()
Definition: SignalTask.cc:114
Definition: SignalTask.h:176
virtual ~SignalTask()
Definition: SignalTask.cc:211
int getIoSig()
Definition: SignalTask.cc:823
sigset_t handledSignals_
Definition: SignalTask.h:252
void sendInstallTimerMsg(std::string name, int sigNo, unsigned long initSec, unsigned long initNsec, unsigned long intervalSec, unsigned long intervaNsec, SIGNALTASK_HANDLER_FN(*handler))
Definition: SignalTask.cc:250
void sendInstallSignalMsg(int sigNo, SIGNALTASK_HANDLER_FN(*handler), void *arg=NULL)
Definition: SignalTask.cc:448
virtual void run()
Definition: SignalTask.cc:664
void addHandler(SIGNALTASK_HANDLER_FN(*handler), void *arg=NULL)
Definition: SignalTask.cc:124
Definition: Thread.h:57
void sendEnableTimerMsg(std::string name, bool enable)
Definition: SignalTask.cc:579
SignalTask(bool spawnThread=false)
Definition: SignalTask.cc:167
void sendAddHandlerMsg(std::string name, SIGNALTASK_HANDLER_FN(*handler), bool add)
TimerInfo(std::string name, int sigNo, unsigned long initSec, unsigned long initNsec, unsigned long intervalSec, unsigned long intervalNsec)
Definition: SignalTask.cc:23
void serviceMsgQ()
Definition: SignalTask.cc:723
~TimerInfo()
Definition: SignalTask.cc:50
Definition: SignalTask.h:133
Definition: AbsTimer.h:54
void reArm()
Definition: SignalTask.cc:62
Definition: GenericTask.h:33
SignalHandler(int sigNo, SIGNALTASK_HANDLER_FN(*handler), void *arg=NULL)
Definition: SignalTask.cc:75