1 #ifndef SZA_UTIL_GENERICMASTERTASK_H
2 #define SZA_UTIL_GENERICMASTERTASK_H
22 class GenericMasterTask :
35 virtual ~GenericMasterTask();
37 static void signalHandler(
int sigNo);
41 static GenericMasterTask<Msg>* masterTask_;
51 void processTaskMsg(
bool* stop);
57 void sendInstallTimerMsg(std::string name,
int sigNo,
58 unsigned long intervalSec,
59 unsigned long intervalNsec,
60 SIGNALTASK_HANDLER_FN(*handler));
65 void sendInstallTimerMsg(std::string name,
int sigNo,
66 unsigned long initSec,
67 unsigned long initNsec,
68 unsigned long intervalSec,
69 unsigned long intervalNsec,
70 SIGNALTASK_HANDLER_FN(*handler));
75 void installTimer(Msg* msg);
80 virtual void installTimers();
85 void sendInstallSignalMsg(
int sigNo, SIGNALTASK_HANDLER_FN(*handler));
90 void installSignal(Msg* msg);
95 virtual void installSignals();
100 void sendEnableTimerMsg(std::string name,
bool enable);
105 void enableTimer(Msg* msg);
110 void sendAddHandlerMsg(std::string name,
111 SIGNALTASK_HANDLER_FN(*handler),
117 void addHandler(Msg* msg);
124 GenericMasterTask<Msg>* GenericMasterTask<Msg>::masterTask_ = 0;
130 GenericMasterTask<Msg>::GenericMasterTask() :
131 GenericTask<Msg>::GenericTask()
133 DBPRINT(
true, Debug::DEBUG7,
"Inside MasterTask constructor");
142 GenericMasterTask<Msg>::~GenericMasterTask() {};
148 void GenericMasterTask<Msg>::processTaskMsg(
bool* stop)
152 GenericTask<Msg>::msgq_.readMsg(&msg);
154 switch (msg.genericMsgType_) {
170 case Msg::INSTALL_TIMER:
173 case Msg::INSTALL_SIGNAL:
174 DBPRINT(
true, Debug::DEBUG31,
"Got an install signal message");
177 case Msg::ADD_HANDLER:
180 case Msg::ENABLE_TIMER:
181 DBPRINT(
true, Debug::DEBUG10,
"Got an enable timer message");
186 this->processMsg(&msg);
197 void GenericMasterTask<Msg>::sendInstallTimerMsg(std::string name,
int sigNo,
198 unsigned long initSec,
199 unsigned long initNsec,
200 unsigned long intervalSec,
201 unsigned long intervalNsec,
202 SIGNALTASK_HANDLER_FN(*handler))
204 DBPRINT(
true, DEBUG_SIGNAL,
"Inside");
208 msg.packInstallTimerMsg(name, sigNo,
210 intervalSec, intervalNsec,
213 this->sendTaskMsg(&msg);
221 void GenericMasterTask<Msg>::sendInstallTimerMsg(std::string name,
int sigNo,
222 unsigned long intervalSec,
223 unsigned long intervalNsec,
224 SIGNALTASK_HANDLER_FN(*handler))
226 DBPRINT(
true, DEBUG_SIGNAL,
"Inside");
230 msg.packInstallTimerMsg(name, sigNo, intervalSec, intervalNsec, handler);
232 this->sendTaskMsg(&msg);
239 void GenericMasterTask<Msg>::installTimer(Msg* msg)
243 COUT(
"Installing signalhandler for signal: " << msg->genericMasterBody.installTimer.sigNo <<
"(" << pthread_self() <<
")");
245 struct sigaction action;
246 sigfillset (&(action.sa_mask));
247 action.sa_restorer = NULL;
248 action.sa_handler = signalHandler;
249 sigaction (msg->genericMasterBody.installTimer.sigNo, &action, NULL);
252 signal_->sendInstallTimerMsg(msg->genericMasterBody.installTimer.name,
253 msg->genericMasterBody.installTimer.sigNo,
254 msg->genericMasterBody.installTimer.initSec,
255 msg->genericMasterBody.installTimer.initNsec,
256 msg->genericMasterBody.installTimer.intervalSec,
257 msg->genericMasterBody.installTimer.intervalNsec,
258 msg->genericMasterBody.installTimer.handler);
265 void GenericMasterTask<Msg>::installTimers() {};
271 void GenericMasterTask<Msg>::sendInstallSignalMsg(
int sigNo,
272 SIGNALTASK_HANDLER_FN(*handler))
276 msg.packInstallSignalMsg(sigNo, handler);
278 this->sendTaskMsg(&msg);
285 void GenericMasterTask<Msg>::installSignal(Msg* msg)
290 COUT(
"Installing signalhandler for signal: " << msg->genericMasterBody.installSignal.sigNo <<
"(" << pthread_self() <<
")");
292 struct sigaction action;
293 sigfillset (&(action.sa_mask));
294 action.sa_restorer = NULL;
295 action.sa_handler = signalHandler;
296 sigaction (msg->genericMasterBody.installSignal.sigNo, &action, NULL);
301 signal_->sendInstallSignalMsg(msg->genericMasterBody.installSignal.sigNo,
302 msg->genericMasterBody.installSignal.handler);
309 void GenericMasterTask<Msg>::installSignals() {};
315 void GenericMasterTask<Msg>::sendEnableTimerMsg(std::string name,
bool enable)
317 DBPRINT(
true, Debug::DEBUG2,
"Inside");
321 msg.packEnableTimerMsg(name, enable);
323 this->sendTaskMsg(&msg);
330 void GenericMasterTask<Msg>::sendAddHandlerMsg(std::string name,
331 SIGNALTASK_HANDLER_FN(*handler),
334 DBPRINT(
true, Debug::DEBUG2,
"Inside, name = " << name
335 <<
" add = " << add);
338 msg.packAddHandlerMsg(name, handler, add);
340 this->sendTaskMsg(&msg);
347 void GenericMasterTask<Msg>::enableTimer(Msg* msg)
349 DBPRINT(
true, Debug::DEBUG2,
"Signal_ is: "
350 << (signal_ == 0 ?
"NULL" :
"not NULL"));
353 signal_->sendEnableTimerMsg(msg->genericMasterBody.enableTimer.name,
354 msg->genericMasterBody.enableTimer.enable);
361 void GenericMasterTask<Msg>::addHandler(Msg* msg)
363 if(Debug::debugging(DEBUG_DELAY)) {
366 DBPRINT(
true, DEBUG_DELAY,
367 "Adding a handler to: " << msg->genericMasterBody.addHandler.name <<
" "
371 DBPRINT(
true, Debug::DEBUG2,
"Signal_ is: "
372 << (signal_ == 0 ?
"NULL" :
"not NULL"));
375 signal_->sendAddHandlerMsg(msg->genericMasterBody.addHandler.name,
376 msg->genericMasterBody.addHandler.handler,
377 msg->genericMasterBody.addHandler.add);
384 void GenericMasterTask<Msg>::signalHandler(
int sigNo)
387 if(masterTask_->signal_) {
388 pthread_kill(masterTask_->signal_->getThreadId(), sigNo);
399 #endif // End #ifndef SZA_UTIL_GENERICMASTERTASK_H
void setToCurrentTime(clockid_t clock=CLOCK_REALTIME)
Fill this structure with the current time from the specified clock.
A class for managing timeval/timespec structs.
Tagged: Fri Nov 14 12:39:34 UTC 2003.
Tagged: Fri Nov 14 12:39:33 UTC 2003.
unsigned long getSeconds()
Return just the integer seconds.
Tagged: Fri Nov 14 12:39:38 UTC 2003.
virtual void restart(void)
Restart this thread.
All tasks will have the following functionality:
virtual void respondToHeartBeat()
Respond to a heartbeat message.
Tagged: Fri Nov 14 12:39:36 UTC 2003.
A generic base-class task for handling timers & signals.
GenericMasterMsgType
Enumerate supported generic message types.