CARMA C++
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 "carma/szautil/AbsTimer.h"
17 
18 #include <pthread.h>
19 
20 namespace sza {
21  namespace util {
22 
23  class Thread;
24 
55  class SignalTask :
56  public sza::util::
57  GenericTask<sza::util::SignalTaskMsg> {
58 
59  public:
60 
68  SignalTask(bool spawnThread = false);
69 
75  virtual ~SignalTask();
76 
80  void sendInstallTimerMsg(std::string name,
81  int sigNo,
82  unsigned long initSec,
83  unsigned long initNsec,
84  unsigned long intervalSec,
85  unsigned long intervaNsec,
86  SIGNALTASK_HANDLER_FN(*handler));
87 
91  void sendAddHandlerMsg(std::string name,
92  SIGNALTASK_HANDLER_FN(*handler),
93  bool add);
94 
98  void sendInstallSignalMsg(int sigNo, SIGNALTASK_HANDLER_FN(*handler),
99  void* arg=NULL);
100 
104  void sendAddHandlerMsg(int sigNo,
105  SIGNALTASK_HANDLER_FN(*handler),
106  bool add);
107 
111  void sendEnableTimerMsg(std::string name, bool enable);
112 
116  void stopTimers();
117 
121  int getIoSig();
122 
126  virtual void run();
127 
131  void serviceMsgQ();
132 
133  pthread_t getThreadId();
134 
135  protected:
136 
137  class TimerInfo {
138  public:
142  TimerInfo(std::string name,
143  int sigNo,
144  unsigned long initSec,
145  unsigned long initNsec,
146  unsigned long intervalSec,
147  unsigned long intervalNsec);
148 
152  ~TimerInfo();
153 
157  void reArm();
158 
159  private:
160 
161  friend class SignalTask;
162 
163  int sigNo_; // The signal to handle.
164  unsigned long initSec_; // The intial delay, in seconds,
165  // of this timer.
166  unsigned long initNsec_; // The initial delay, in
167  // nanoseconds, of this timer.
168  unsigned long intervalSec_; // The interval, in seconds, of
169  // this timer.
170  unsigned long intervalNsec_; // The interval, in nanoseconds,
171  // of this timer.
172  std::string name_; // A name for this timer
173  bool enabled_; // True when this timer is enabled
174  AbsTimer* timer_; // The timer.
175  };
176 
181  public:
182 
186  SignalHandler(int sigNo, SIGNALTASK_HANDLER_FN(*handler), void* arg=NULL);
187 
192  SignalHandler(int sigNo,
193  SIGNALTASK_HANDLER_FN(*handler),
194  TimerInfo* timer,
195  void* arg=NULL);
196 
200  void reArm();
201 
205  ~SignalHandler();
206 
210  void addHandler(SIGNALTASK_HANDLER_FN(*handler), void* arg=NULL);
211 
215  void removeHandler(SIGNALTASK_HANDLER_FN(*handler));
216 
217  private:
218 
219  friend class SignalTask;
220 
224  int sigNo_;
225 
226  struct HandlerPair {
227 
228  HandlerPair(SIGNALTASK_HANDLER_FN(*handler), void* args) {
229  handler_ = handler;
230  args_ = args;
231  }
232 
233  SIGNALTASK_HANDLER_FN(*handler_);
234  void* args_;
235  };
236 
240  std::vector<HandlerPair> handlers_;
241 
245  TimerInfo* timer_;
246  };
247 
248  protected:
249 
255  sigset_t handledSignals_;
256 
257  private:
258 
263  void privateConstructor();
264 
269  int sigIo_;
270 
274  pthread_t id_;
275 
279  static SignalTask* signaltask_;
280 
289  std::vector<TimerInfo*> timers_;
290 
291  // Members for managing a spawned thread
292 
297  Thread* spawnedThread_;
298 
302  bool spawned_;
303 
307  static THREAD_START(startUp);
308 
313  std::vector<SignalHandler*> signalHandlers_;
314 
318  void installTimer(SignalTaskMsg* msg);
319 
323  void installTimer(std::string name,
324  int sigNo,
325  unsigned long initSec,
326  unsigned long initNsec,
327  unsigned long intervalSec,
328  unsigned long intervalNsec,
329  SIGNALTASK_HANDLER_FN(*handler));
330 
334  void addHandler(std::string name, SIGNALTASK_HANDLER_FN(*handler), void* args=NULL);
335 
339  void removeHandler(std::string name, SIGNALTASK_HANDLER_FN(*handler));
340 
345  SignalHandler* getHandler(int sigNo);
346 
351  TimerInfo* getTimer(int sigNo);
352 
357  TimerInfo* getTimer(std::string name);
358 
362  void installSignal(SignalTaskMsg* msg);
363 
367  void installSignal(int sigNo, SIGNALTASK_HANDLER_FN(*handler), void* arg=NULL);
368 
372  void addHandler(int sigNo, SIGNALTASK_HANDLER_FN(*handler), 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  }; // End namespace util
417 }; // End namespace sza
418 
419 #endif // End #ifndef
virtual void run()
Run, handling signals.
Tagged: Fri Nov 14 12:39:36 UTC 2003.
Tagged: Fri Nov 14 12:39:33 UTC 2003.
void sendEnableTimerMsg(std::string name, bool enable)
Send a message to enable/disable a timer.
void addHandler(SIGNALTASK_HANDLER_FN(*handler), void *arg=NULL)
Add a handler to the set attached to this signal.
int getIoSig()
Query what signal this object uses for I/O events.
sigset_t handledSignals_
The set of signals handled by this task.
Definition: SignalTask.h:255
virtual ~SignalTask()
Making the destructor virtual ensures that the right destructor will be called for classes which inhe...
void sendAddHandlerMsg(std::string name, SIGNALTASK_HANDLER_FN(*handler), bool add)
Send a message to attach a handler to an existing timer.
All tasks will have the following functionality:
Definition: GenericTask.h:32
void serviceMsgQ()
Service our message queue.
void stopTimers()
Stop all timers.
Tagged: Fri Nov 14 12:39:30 UTC 2003.
SignalHandler(int sigNo, SIGNALTASK_HANDLER_FN(*handler), void *arg=NULL)
Constructors.
void removeHandler(SIGNALTASK_HANDLER_FN(*handler))
Remove a handler to the set attached to this signal.
A class to manage signal handlers for all handled signals.
Definition: SignalTask.h:180
Class used to set up repetitive or one-shot timers on integral boundries relative to the system clock...
Definition: AbsTimer.h:52
void sendInstallTimerMsg(std::string name, int sigNo, unsigned long initSec, unsigned long initNsec, unsigned long intervalSec, unsigned long intervaNsec, SIGNALTASK_HANDLER_FN(*handler))
Send a message to install a timer.
A generic base-class task for handling timers &amp; signals.
Definition: SignalTask.h:55
void reArm()
Re-arm any periodic timer associated with this handler.
SignalTask(bool spawnThread=false)
Constructor for SignalTask.
void sendInstallSignalMsg(int sigNo, SIGNALTASK_HANDLER_FN(*handler), void *arg=NULL)
Send a message to install a signal.
Define a class to encapsulate thread handling.
Definition: Thread.h:57