-static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/worker.c,v 6.9 2001-11-14 09:29:27 hadaq Exp $";
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/worker.c,v 6.10 2001-11-14 17:18:52 hadaq Exp $";
#define _POSIX_C_SOURCE 199309L
{
Worker *retVal;
Worker *my;
+ int s0;
+ int s1;
if (NULL == (my = malloc(sizeof(Worker)))) {
syslog(LOG_ERR, "%s:%d: %s", __FILE__, __LINE__, strerror(errno));
my->pid = getpid();
my->isStandalone = isStandalone;
- if (-1 == installSigHandlers(my, SIGINT, SIGTERM, sigHandler)) {
+ if (!my->isStandalone) {
+ s0 = SIGUSR1;
+ s1 = SIGUSR2;
+ } else {
+ s0 = SIGINT;
+ s1 = SIGTERM;
+ }
+
+ if (-1 == installSigHandlers(my, s0, s1, sigHandler)) {
syslog(LOG_DEBUG, "%s:%d: %s", __FILE__, __LINE__, strerror(errno));
- Worker_fini(my);
retVal = NULL;
} else if (-1 == createStatShm(my)) {
syslog(LOG_DEBUG, "%s:%d: %s", __FILE__, __LINE__, strerror(errno));
- Worker_fini(my);
+ removeSigHandlers(my);
retVal = NULL;
} else {
- unsigned long *pidP;
-
- pidP = Worker_addStatistic(my, "pid");
- *pidP = my->pid;
+ my->pidP = Worker_addStatistic(my, "pid");
+ *my->pidP = my->pid;
if (0 > changePriority(priority)) {
syslog(LOG_WARNING, "changeing priority: %s", strerror(errno));
void Worker_fini(Worker *my)
{
+
+ if (!my->isStandalone) {
+ sigset_t sigMaskS, *sigMask = &sigMaskS;
+
+ removeSigHandlers(my);
+ installSigHandlers(my, SIGINT, SIGTERM, noopHandler);
+
+ *my->pidP |= (1 << 31);
+
+ /* BUGBUG there should be a timeout here */
+ sigemptyset(sigMask);
+ sigsuspend(sigMask);
+ }
+
+
removeStatShm(my);
removeSigHandlers(my);
return retVal;
}
-void Worker_stop(const char *name, int timeout)
+void Worker_halt(const char *name, int timeout)
{
Worker myS, *my = &myS;
if (0 == openStatShm(my)) {
my->pid = my->statistics[0].value;
+ if (my->pid > 0) {
+ if (0 == kill(my->pid, SIGUSR1)) {
+ while (((my->pid = my->statistics[0].value) & (1 << 31)) == 0) {
+ sleep(1);
+ }
+ }
+ }
+ closeStatShm(my);
+ }
+}
+
+void Worker_stop(const char *name, int timeout)
+{
+ Worker myS, *my = &myS;
+
+ strcpy(my->name, name);
+
+ if (0 == openStatShm(my)) {
+ my->pid = my->statistics[0].value & ~(1 << 31);
if (my->pid > 0) {
if (0 == kill(my->pid, SIGTERM)) {
sleep(1);
wait(NULL);
}
}
+ closeStatShm(my);
}
}