My Project
 All Classes Files Functions Variables Enumerations Enumerator Friends Macros Pages
GenericMasterTask.h
Go to the documentation of this file.
1 #ifndef GCP_UTIL_GENERICMASTERTASK_H
2 #define GCP_UTIL_GENERICMASTERTASK_H
3 
11 #include <string>
12 
13 #include "gcp/util/common/GenericTask.h"
14 #include "gcp/util/common/GenericMasterTaskMsg.h"
15 #include "gcp/util/common/SignalTask.h"
16 #include "gcp/util/common/TimeVal.h"
17 
18 namespace gcp {
19  namespace util {
20 
21  template<class Msg>
23  public gcp::util::GenericTask<Msg> {
24 
25  public:
26 
31 
35  virtual ~GenericMasterTask();
36 
37  protected:
38 
43 
47  void processTaskMsg(bool* stop);
48 
53  void sendInstallTimerMsg(std::string name, int sigNo,
54  unsigned long intervalSec,
55  unsigned long intervalNsec,
56  SIGNALTASK_HANDLER_FN(*handler));
57 
61  void sendInstallTimerMsg(std::string name, int sigNo,
62  unsigned long initSec,
63  unsigned long initNsec,
64  unsigned long intervalSec,
65  unsigned long intervalNsec,
66  SIGNALTASK_HANDLER_FN(*handler));
67 
71  void installTimer(Msg* msg);
72 
76  virtual void installTimers();
77 
81  void sendInstallSignalMsg(int sigNo, SIGNALTASK_HANDLER_FN(*handler));
82 
86  void installSignal(Msg* msg);
87 
91  virtual void installSignals();
92 
96  void sendEnableTimerMsg(std::string name, bool enable);
97 
101  void enableTimer(Msg* msg);
102 
106  void sendAddHandlerMsg(std::string name,
107  SIGNALTASK_HANDLER_FN(*handler),
108  bool add);
109 
113  void addHandler(Msg* msg);
114 
115  }; // End class GenericMasterTask
116 
117  // Template functions must be defined in the header file
118 
119  /*
120  * Constructor
121  */
122  template<class Msg>
124  GenericTask<Msg>::GenericTask()
125  {
126  DBPRINT(true, Debug::DEBUG7, "Inside MasterTask constructor");
127  signal_ = 0;
128  };
129 
130  /*
131  * Detructor
132  */
133  template<class Msg>
135 
139  template<class Msg>
141  {
142  Msg msg;
143 
144  GenericTask<Msg>::msgq_.readMsg(&msg);
145 
146  switch (msg.genericMsgType_) {
147  case Msg::HEARTBEAT: // Is this a heartbeat request?
149  break;
150  case Msg::RESTART: // Is this a request to restart?
152  break;
153  case Msg::STOP: // Did we receive a request to shut
154  // down?
155  *stop = true;
156  break;
157  default:
158  {
160  (GenericMasterTaskMsg::GenericMasterMsgType)msg.genericMsgType_;
161  switch(type) {
162  case Msg::INSTALL_TIMER:
163  installTimer(&msg);
164  break;
165  case Msg::INSTALL_SIGNAL:
166  DBPRINT(true, Debug::DEBUG31, "Got an install signal message");
167  installSignal(&msg);
168  break;
169  case Msg::ADD_HANDLER:
170  addHandler(&msg);
171  break;
172  case Msg::ENABLE_TIMER:
173  DBPRINT(true, Debug::DEBUG10, "Got an enable timer message");
174  enableTimer(&msg);
175  break;
176  default: // Else forward this message to the task-specific
177  // process method
178  processMsg(&msg);
179  break;
180  }
181  }
182  }
183  };
184 
188  template<class Msg>
189  void GenericMasterTask<Msg>::sendInstallTimerMsg(std::string name, int sigNo,
190  unsigned long initSec,
191  unsigned long initNsec,
192  unsigned long intervalSec,
193  unsigned long intervalNsec,
194  SIGNALTASK_HANDLER_FN(*handler))
195  {
196  DBPRINT(true, DEBUG_SIGNAL, "Inside");
197 
198  Msg msg;
199 
200  msg.packInstallTimerMsg(name, sigNo,
201  initSec, initNsec,
202  intervalSec, intervalNsec,
203  handler);
204 
205  sendTaskMsg(&msg);
206  }
207 
212  template<class Msg>
213  void GenericMasterTask<Msg>::sendInstallTimerMsg(std::string name, int sigNo,
214  unsigned long intervalSec,
215  unsigned long intervalNsec,
216  SIGNALTASK_HANDLER_FN(*handler))
217  {
218  DBPRINT(true, DEBUG_SIGNAL, "Inside");
219 
220  Msg msg;
221 
222  msg.packInstallTimerMsg(name, sigNo, intervalSec, intervalNsec, handler);
223 
224  sendTaskMsg(&msg);
225  }
226 
230  template<class Msg>
232  {
233  // Install the timer.
234 
235  DBPRINT(true, Debug::DEBUG2, "Signal_ is: "
236  << (signal_ == 0 ? "NULL" : "not NULL"));
237 
238  if(signal_ != 0)
239  signal_->sendInstallTimerMsg(msg->genericMasterBody.installTimer.name,
240  msg->genericMasterBody.installTimer.sigNo,
241  msg->genericMasterBody.installTimer.initSec,
242  msg->genericMasterBody.installTimer.initNsec,
243  msg->genericMasterBody.installTimer.intervalSec,
244  msg->genericMasterBody.installTimer.intervalNsec,
245  msg->genericMasterBody.installTimer.handler);
246  }
247 
251  template<class Msg>
253 
257  template<class Msg>
259  SIGNALTASK_HANDLER_FN(*handler))
260  {
261  Msg msg;
262 
263  DBPRINT(true, Debug::DEBUG2, "Signal_ is: "
264  << (signal_ == 0 ? "NULL" : "not NULL"));
265 
266  msg.packInstallSignalMsg(sigNo, handler);
267 
268  sendTaskMsg(&msg);
269  }
270 
274  template<class Msg>
276  {
277  // Install the signal.
278 
279  DBPRINT(true, Debug::DEBUG2, "Signal_ is: "
280  << (signal_ == 0 ? "NULL" : "not NULL"));
281 
282 
283  if(signal_)
284  signal_->sendInstallSignalMsg(msg->genericMasterBody.installSignal.sigNo,
285  msg->genericMasterBody.installSignal.handler);
286  }
287 
291  template<class Msg>
293 
297  template<class Msg>
298  void GenericMasterTask<Msg>::sendEnableTimerMsg(std::string name, bool enable)
299  {
300  DBPRINT(true, Debug::DEBUG2, "Inside");
301 
302  Msg msg;
303 
304  msg.packEnableTimerMsg(name, enable);
305 
306  sendTaskMsg(&msg);
307  }
308 
312  template<class Msg>
314  SIGNALTASK_HANDLER_FN(*handler),
315  bool add)
316  {
317  DBPRINT(true, Debug::DEBUG2, "Inside, name = " << name
318  << " add = " << add);
319  Msg msg;
320 
321  msg.packAddHandlerMsg(name, handler, add);
322 
323  sendTaskMsg(&msg);
324  }
325 
329  template<class Msg>
331  {
332  DBPRINT(true, Debug::DEBUG2, "Signal_ is: "
333  << (signal_ == 0 ? "NULL" : "not NULL"));
334 
335  if(signal_ != 0)
336  signal_->sendEnableTimerMsg(msg->genericMasterBody.enableTimer.name,
337  msg->genericMasterBody.enableTimer.enable);
338  }
339 
343  template<class Msg>
345  {
346  if(Debug::debugging(DEBUG_DELAY)) {
347  gcp::util::TimeVal timeVal;
348  timeVal.setToCurrentTime();
349  DBPRINT(true, DEBUG_DELAY,
350  "Adding a handler to: " << msg->genericMasterBody.addHandler.name << " "
351  << timeVal.getSeconds());
352  }
353 
354  DBPRINT(true, Debug::DEBUG2, "Signal_ is: "
355  << (signal_ == 0 ? "NULL" : "not NULL"));
356 
357  if(signal_ != 0)
358  signal_->sendAddHandlerMsg(msg->genericMasterBody.addHandler.name,
359  msg->genericMasterBody.addHandler.handler,
360  msg->genericMasterBody.addHandler.add);
361  }
362 
363  } // End namespace util
364 } // End namespace gcp
365 
366 
367 
368 
369 #endif // End #ifndef GCP_UTIL_GENERICMASTERTASK_H
virtual void respondToHeartBeat()
Definition: GenericTask.h:442
void sendEnableTimerMsg(std::string name, bool enable)
Definition: GenericMasterTask.h:298
void addHandler(Msg *msg)
Definition: GenericMasterTask.h:344
Definition: SignalTask.h:53
void installTimer(Msg *msg)
Definition: GenericMasterTask.h:231
void sendInstallSignalMsg(int sigNo, SIGNALTASK_HANDLER_FN(*handler))
Definition: GenericMasterTask.h:258
virtual void installTimers()
Definition: GenericMasterTask.h:252
void sendInstallTimerMsg(std::string name, int sigNo, unsigned long intervalSec, unsigned long intervalNsec, SIGNALTASK_HANDLER_FN(*handler))
Definition: GenericMasterTask.h:213
void setToCurrentTime(clockid_t clock=CLOCK_REALTIME)
Definition: TimeVal.cc:710
Definition: GenericMasterTask.h:22
GenericMasterMsgType
Definition: GenericMasterTaskMsg.h:43
unsigned int getSeconds()
Definition: TimeVal.cc:636
void enableTimer(Msg *msg)
Definition: GenericMasterTask.h:330
Definition: TimeVal.h:55
void processTaskMsg(bool *stop)
Definition: GenericMasterTask.h:140
GenericMasterTask()
Definition: GenericMasterTask.h:123
void installSignal(Msg *msg)
Definition: GenericMasterTask.h:275
void sendAddHandlerMsg(std::string name, SIGNALTASK_HANDLER_FN(*handler), bool add)
Definition: GenericMasterTask.h:313
gcp::util::SignalTask * signal_
Definition: GenericMasterTask.h:42
virtual void restart(void)
Definition: GenericTask.h:351
virtual void installSignals()
Definition: GenericMasterTask.h:292
virtual ~GenericMasterTask()
Definition: GenericMasterTask.h:134
Definition: GenericTask.h:33
static bool debugging(Level level=Debug::DEBUGANY)
Definition: Debug.cc:62