COPTS = -g
CFLAGS = $(COPTS) $(INCLUDES) $(DEFINES)
+DAQCTRL_OBJS = daqctrl.o daq_lib.o param.o \
+ worker.o psxshm.o mman.o
DAQ_XMANAGE_OBJS = tcldaq.o tkAppInit.o \
agent_clnt.o agent_xdr.o worker.o psxshm.o mman.o
DAQ_MANAGE_OBJS = tcldaq.o tclAppInit.o \
all : seb eb anal
+daqctrl: $(DAQCTRL_OBJS)
+ $(CC) $(CFLAGS) $(LDFLAGS) $(DAQCTRL_OBJS) $(LOADLIBES) -o daqctrl
+
daq_xmanage: $(DAQ_XMANAGE_OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) $(DAQ_XMANAGE_OBJS) $(LOADLIBES) -o daq_xmanage
#include "worker.h"
#define NWORKERS 16
-Worker *workers[NWORKERS]; /* inplicitly set to zero */
+char workers[NWORKERS][32]; /* inplicitly set to zero */
-static int addWorker(Worker *worker)
+static int addWorker(const char *worker)
{
int i;
- for (i = 0; workers[i] != NULL; i++) { /* BUGBUG crash if workers full */
+ for (i = 0; strcmp(workers[i], "") != 0; i++) {
+ /* BUGBUG crash if workers full */
}
- workers[i] = worker;
+ strcpy(workers[i], worker);
return i;
}
-static Worker *getWorker(int id)
+static char *getWorker(int id)
{
return workers[id];
}
static void removeWorker(int id)
{
- workers[id] = NULL;
+ strcpy(workers[id], "");
}
int *rpcworker_start_1(RpcWorker_startArgs * args, CLIENT * cl)
}
argv[i] = NULL;
- worker = Worker_start(args->name, argv);
+ Worker_start(args->name, argv);
+ retVal = addWorker(argv[0]);
free(argv);
- retVal = addWorker(worker);
return &retVal;
}
static int retVal;
Worker_stop(getWorker(*id), 15);
+ removeWorker(*id);
retVal = 0;
--- /dev/null
+static char rcsId[] = "$Id: daq_lib.c,v 6.1 2000-07-18 14:24:36 hades Exp $";
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <lvme.h>
+#include "param.h"
+#include "worker.h"
+#include "daq_lib.h"
+
+int Daq_reset(const char *name, const Param *param)
+{
+ Daq_stop(name, param);
+
+ return 0;
+}
+
+int Daq_init(const char *name, const Param *param)
+{
+ Daq_reset(name, param);
+
+ return 0;
+}
+
+int Daq_start(const char *name, const Param *param)
+{
+ const char *file;
+ const char *args;
+ char *argv[512];
+ int i;
+ char *s;
+
+ file = Param_getString(param, name, "file");
+ args = Param_getString(param, name, "args");
+
+ i = 0;
+ s = malloc(strlen(args));
+ strcpy(s, args);
+ while((argv[i++] = strtok(s, " \t\n")) != NULL) {
+ s = NULL;
+ }
+ free(s);
+ return Worker_start(file, argv);
+}
+
+int Daq_stop(const char *name, const Param *param)
+{
+ const char *args;
+ char *s;
+
+ args = Param_getString(param, name, "args");
+ s = malloc(strlen(args));
+ strcpy(s, args);
+ strtok(s, " \t\n");
+ Worker_stop(s, 15);
+ free(s);
+ return 0;
+}
+
+int Daq_status(const char *name, const Param *param)
+{
+ const char *args;
+ char *s;
+
+ args = Param_getString(param, name, "args");
+ s = malloc(strlen(args));
+ strcpy(s, args);
+ strtok(s, " \t\n");
+ puts(Worker_status(s));
+ free(s);
+ return 0;
+}
--- /dev/null
+#ifndef Daq_LIB_H
+#define Daq_LIB_H
+
+#include "param.h"
+
+int Daq_init(const char *name, const Param *param);
+int Daq_reset(const char *name, const Param *param);
+int Daq_start(const char *name, const Param *param);
+int Daq_stop(const char *name, const Param *param);
+int Daq_status(const char *name, const Param *param);
+
+#endif
--- /dev/null
+static char rcsId[] = "$Id: daqctrl.c,v 6.1 2000-07-18 14:24:36 hades Exp $";
+
+#include <stdlib.h>
+#include <stddef.h>
+#include <setjmp.h>
+#include <stdio.h>
+#include <strings.h>
+#include <signal.h>
+
+#include "param.h"
+
+#include "daq_lib.h"
+
+jmp_buf terminateJmp;
+
+void sighandler(int sig) {
+ longjmp(terminateJmp, sig);
+}
+
+void usage(char *commandName) {
+ fprintf(stderr, "Usage: %s command boardName\n", commandName);
+ fprintf(stderr, "where command may be one of the following:\n");
+ fprintf(stderr, "init\n");
+ fprintf(stderr, "reset\n");
+ fprintf(stderr, "start\n");
+ fprintf(stderr, "stop\n");
+ fprintf(stderr, "status\n");
+}
+
+
+int main(int argc, char *argv[]) {
+ Param paramS, *param = ¶mS;
+ char *name;
+ char *command;
+
+ if(argc < 3) {
+ usage(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ command = argv[1];
+ name = argv[2];
+
+ if (-1 == conParam(param)) {
+ perror("conParam");
+ exit(EXIT_FAILURE);
+ }
+ if (0 == setjmp(terminateJmp)) {
+ signal(SIGHUP, sighandler);
+ signal(SIGINT, sighandler);
+ signal(SIGTERM, sighandler);
+
+ if(strcmp(command, "init") == 0) {
+ Daq_init(name, param);
+ } else if(strcmp(command, "reset") == 0) {
+ Daq_reset(name, param);
+ } else if(strcmp(command, "start") == 0) {
+ Daq_start(name, param);
+ } else if(strcmp(command, "stop") == 0) {
+ Daq_stop(name, param);
+ } else if(strcmp(command, "status") == 0) {
+ Daq_status(name, param);
+ } else {
+ usage(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ }
+ desParam(param);
+ exit(EXIT_SUCCESS);
+}
-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwdtu.c,v 1.2 1999-09-05 11:20:08 hades Stab $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwdtu.c,v 1.3 2000-07-18 14:24:36 hades Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
strcpy(my->name, name);
my->trigNr = 0;
- cardBase = Param_getVal(param, my->name, "cardbase");
+ cardBase = Param_getInt(param, my->name, "cardbase");
my->lvme = allocMem(sizeof(LVme));
if (0 > conLVme(my->lvme, cardBase, 0x10000, 0x09, DTU_MAGIC, 1)) {
-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwmdc.c,v 6.3 2000-02-03 10:11:08 muench Stab $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwmdc.c,v 6.4 2000-07-18 14:24:36 hades Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
system("cd /home/hades/ht99/slow; mdc init >/dev/null 2>&1");
#endif
- if (0 > conParam(param, "param.tcl")) {
+ if (0 > conParam(param)) {
msglog(LOG_DEBUG, "%s:%d:%s\n", __FILE__, __LINE__, strerror(errno));
return NULL;
}
-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwrace.c,v 6.6 2000-05-27 05:22:22 hades Exp $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwrace.c,v 6.7 2000-07-18 14:24:36 hades Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
my->trigNr = 0;
- cardBase = Param_getVal(param, my->name, "cardbase");
+ cardBase = Param_getInt(param, my->name, "cardbase");
my->rc = allocMem(sizeof(Rc));
if (0 > conRc(my->rc, "rc", cardBase)) {
-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwrich.c,v 6.7 2000-05-27 06:02:32 hades Exp $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwrich.c,v 6.8 2000-07-18 14:24:36 hades Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
cardBase = 0x44100000;
#endif
- if (0 > conParam(param, "param.tcl")) {
+ if (0 > conParam(param)) {
msglog(LOG_DEBUG, "%s:%d:%s\n", __FILE__, __LINE__, strerror(errno));
return NULL;
}
strcpy(my->name, name);
- cardBase = Param_getVal(param, my->name, "cardbase");
+ cardBase = Param_getInt(param, my->name, "cardbase");
my->cram = allocMem(sizeof(LVme));
if (0 > conLVme(my->cram, cardBase, 0x10000L, 0x09, 0x0, 4)) {
msglog(LOG_ERR, "HwSam on %p not found\n", cardBase);
strcpy(my->name, name);
- cardBase = Param_getVal(param, my->name, "cardbase");
+ cardBase = Param_getInt(param, my->name, "cardbase");
my->lvme = allocMem(sizeof(LVme));
if (0 > conLVme(my->lvme, cardBase, 0x400000UL, 0x39UL, 0, 0)) {
msglog(LOG_ERR, "HwShip on %p not found\n", cardBase);
-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwshow.c,v 6.6 2000-05-28 14:44:39 hades Exp $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwshow.c,v 6.7 2000-07-18 14:24:36 hades Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
Param paramS, *param = ¶mS;
int i;
- if (0 > conParam(param, "param.tcl")) {
+ if (0 > conParam(param)) {
msglog(LOG_DEBUG, "%s:%d:%s\n", __FILE__, __LINE__, strerror(errno));
return NULL;
}
-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwsis3801.c,v 1.1 1999-09-05 11:08:34 hades Stab $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwsis3801.c,v 1.2 2000-07-18 14:24:36 hades Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
strcpy(my->name, name);
my->trigNr = 0;
- cardBase = Param_getVal(param, my->name, "cardbase");
+ cardBase = Param_getInt(param, my->name, "cardbase");
my->lvme = allocMem(sizeof(LVme));
if (0 > conLVme(my->lvme, cardBase, 0x10000, 0x09, SIS3801_MODID, 4)) {
my->maxSubEvtSize = 3 * SubEvt_hdrSize() + 1001 * sizeof(UInt4);
param = allocMem(sizeof(Param));
- conParam(param, "param.tcl");
- printf("%d\n", Param_getVal(param, "soft", "size"));
+ conParam(param);
+ printf("%d\n", Param_getInt(param, "soft", "size"));
desParam(param);
return my;
}
-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtbus.c,v 1.2 1999-11-22 10:45:55 hades Stab $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtbus.c,v 1.3 2000-07-18 14:24:36 hades Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
Param paramS, *param = ¶mS;
HwDtu *dtu;
- if (0 > conParam(param, "param.tcl")) {
+ if (0 > conParam(param)) {
msglog(LOG_DEBUG, "%s:%d:%s\n", __FILE__, __LINE__, strerror(errno));
return NULL;
}
signal(SIGBUS, sigbusHandler);
strcpy(my->name, name);
- cardBase = Param_getVal(param, my->name, "cardbase");
+ cardBase = Param_getInt(param, my->name, "cardbase");
my->lvme = allocMem(sizeof(LVme));
if (0 > conLVme(my->lvme, cardBase, 0x2000000UL, 0x09UL, 0, 0)) {
msglog(LOG_ERR, "HwTip on %p not found\n", cardBase);
-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtof.c,v 1.11 2000-06-01 08:39:32 hades Exp $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwtof.c,v 1.12 2000-07-18 14:24:36 hades Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
Param paramS, *param = ¶mS;
int i;
- if (0 > conParam(param, "param.tcl")) {
+ if (0 > conParam(param)) {
msglog(LOG_DEBUG, "%s:%d:%s\n", __FILE__, __LINE__, strerror(errno));
return NULL;
}
my->old_evtCount = 0;
param = allocMem(sizeof(Param));
- conParam(param, "param.tcl");
- cardBase = Param_getVal(param, "mu", "cardbase");
+ conParam(param);
+ cardBase = Param_getInt(param, "mu", "cardbase");
desParam(param);
my->lvme0 = allocMem(sizeof(LVme));
-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwv488.c,v 1.4 2000-02-03 18:52:37 muench Stab $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwv488.c,v 1.5 2000-07-18 14:24:36 hades Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
strcpy(my->name, name);
my->trigNr = 0;
- cardBase = Param_getVal(param, my->name, "cardbase");
+ cardBase = Param_getInt(param, my->name, "cardbase");
my->lvme = allocMem(sizeof(LVme));
if (0 > conLVme(my->lvme, cardBase, 0x10000, 0x39, V488_TYPE, 2)) {
}
LVme_setW(my->lvme, V488_RESET, 0);
LVme_setW(my->lvme, V488_FF_REG, 0);
- LVme_setW(my->lvme, V488_CTRL_REG, Param_getVal(param, my->name, "ctrl"));
- LVme_setW(my->lvme, V488_THRL, Param_getVal(param, my->name, "thrl"));
- LVme_setW(my->lvme, V488_THRH, Param_getVal(param, my->name, "thrh"));
- LVme_setW(my->lvme, V488_RANGE, Param_getVal(param, my->name, "range"));
- my->id = Param_getVal(param, my->name, "id");
+ LVme_setW(my->lvme, V488_CTRL_REG, Param_getInt(param, my->name, "ctrl"));
+ LVme_setW(my->lvme, V488_THRL, Param_getInt(param, my->name, "thrl"));
+ LVme_setW(my->lvme, V488_THRH, Param_getInt(param, my->name, "thrh"));
+ LVme_setW(my->lvme, V488_RANGE, Param_getInt(param, my->name, "range"));
+ my->id = Param_getInt(param, my->name, "id");
return 0;
}
-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwv775.c,v 1.9 2000-02-03 18:28:47 muench Stab $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwv775.c,v 1.10 2000-07-18 14:24:36 hades Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
strcpy(my->name, name);
- cardBase = Param_getVal(param, my->name, "cardbase");
+ cardBase = Param_getInt(param, my->name, "cardbase");
my->lvme = allocMem(sizeof(LVme));
if (0 > conLVme(my->lvme, cardBase, 0x10000, 0x09, V775_GEO_ADDR, 2)) {
LVme_setW(my->lvme, V775_BIT_SET_2, 0x0020);
LVme_setW(my->lvme, V775_CTRL_REG_2, 0x0003);
LVme_setW(my->lvme, V775_CRATE_REG, 0x0000);
- LVme_setW(my->lvme, V775_RANGE_SET, Param_getVal(param, my->name, "range"));
- LVme_setW(my->lvme, V775_VSET, Param_getVal(param, my->name, "vset"));
- LVme_setW(my->lvme, V775_VOFF, Param_getVal(param, my->name, "voff"));
+ LVme_setW(my->lvme, V775_RANGE_SET, Param_getInt(param, my->name, "range"));
+ LVme_setW(my->lvme, V775_VSET, Param_getInt(param, my->name, "vset"));
+ LVme_setW(my->lvme, V775_VOFF, Param_getInt(param, my->name, "voff"));
for (i = 0; i < V775_NCHANNELS; i++) {
char buf[16];
sprintf(buf, "threshold%02d", i);
LVme_setW(my->lvme,
- V775_THRESH + 2 * i, Param_getVal(param, my->name, buf));
+ V775_THRESH + 2 * i, Param_getInt(param, my->name, buf));
}
return 0;
}
-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwv878.c,v 1.7 2000-02-03 18:28:47 muench Stab $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwv878.c,v 1.8 2000-07-18 14:24:36 hades Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
strcpy(my->name, name);
- cardBase = Param_getVal(param, my->name, "cardbase");
+ cardBase = Param_getInt(param, my->name, "cardbase");
my->lvme = allocMem(sizeof(LVme));
if (0 > conLVme(my->lvme, cardBase, 0x10000, 0x09, V878_GEO_ADDR, 2)) {
LVme_setW(my->lvme, V878_BIT_SET_2, 0xf800);
LVme_setW(my->lvme, V878_CRATE_REG, 0x0000);
LVme_setW(my->lvme, V878_SLIDE, 0);
- LVme_setW(my->lvme, V878_FCLR_WIN, Param_getVal(param, my->name, "fclr_win"));
- LVme_setW(my->lvme, V878_VSET, Param_getVal(param, my->name, "vset"));
- LVme_setW(my->lvme, V878_VOFF, Param_getVal(param, my->name, "voff"));
- LVme_setW(my->lvme, V878_CLR_TIME, Param_getVal(param, my->name, "clr_time"));
+ LVme_setW(my->lvme, V878_FCLR_WIN, Param_getInt(param, my->name, "fclr_win"));
+ LVme_setW(my->lvme, V878_VSET, Param_getInt(param, my->name, "vset"));
+ LVme_setW(my->lvme, V878_VOFF, Param_getInt(param, my->name, "voff"));
+ LVme_setW(my->lvme, V878_CLR_TIME, Param_getInt(param, my->name, "clr_time"));
for (i = 0; i < V878_NCHANNELS; i++) {
char buf[16];
sprintf(buf, "threshold%02d", i);
LVme_setW(my->lvme,
- V878_THRESH + 2 * i, Param_getVal(param, my->name, buf));
+ V878_THRESH + 2 * i, Param_getInt(param, my->name, buf));
}
return 0;
}
-static char rcsId[] = "$Id: param.c,v 6.2 1999-08-31 10:45:16 muench Stab $";
+static char rcsId[] = "$Id: param.c,v 6.3 2000-07-18 14:24:36 hades Exp $";
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-
-#include <hadesstd.h>
+#include <tcl.h>
#include "param.h"
-int conParam(Param *my, const char *fileName)
+int conParam(Param *my)
{
- int i;
- FILE *f;
- char buf[132 + 1];
+ int retVal;
+ char *fileName;
+ int code;
- if (NULL == (f = fopen(fileName, "r"))) {
- msglog(LOG_ERR, "opening param file: %s\n", strerror(errno));
- return -1;
+ fileName = getenv("DAQSLOW_PARAM_FILE");
+ if (fileName == NULL) {
+ fileName = "param.tcl";
}
- for (
- i = 0;
- i < PARAM_MAXNVALS
- && NULL != fgets(buf, 132, f);
- i++
- ) {
- if (buf[0] != '#') {
- char s[512];
- sscanf(buf, "set%s%s", &my->name[i], s);
- my->val[i] = strtoul(s, NULL, 0);
+ my->interp = Tcl_CreateInterp();
+ code = Tcl_EvalFile(my->interp, fileName);
+ if (*my->interp->result != 0) {
+ fprintf(stderr, "opening param file: %s\n", my->interp->result);
+ retVal = -1;
+ } else {
+ if (code != TCL_OK) {
+ retVal = -1;
+ } else {
+ retVal = 0;
}
}
- if (i == PARAM_MAXNVALS) {
- msglog(LOG_WARNING,
- "More than %d Parameter in file, ignoring the rest\n", PARAM_MAXNVALS);
- }
- fclose(f);
+ return retVal;
}
void desParam(Param *my)
{
+ Tcl_DeleteInterp(my->interp);
}
-long Param_getVal(const Param *my, const char *name, const char *idx)
+const char *Param_getString(const Param *my, const char *name, const char *idx)
{
- int i;
- int val;
- char fullName[PARAM_MAXNAMELEN];
+ const char *val;
- sprintf(fullName, "%s(%s)", name, idx);
- for (
- i = 0;
- i < PARAM_MAXNVALS
- && strcmp(my->name[i], fullName) != 0;
- i++
- ) {
- }
- if (i == PARAM_MAXNVALS) {
- val = 0;
- msglog(LOG_WARNING, "Parameter %s not found, defaulting to 0\n", fullName);
- } else {
- val = my->val[i];
+ val = Tcl_GetVar2(my->interp, name, idx, 0);
+ if (val == NULL) {
+ val = "";
+ fprintf(stderr,
+ "Parameter %s(%s) not found, default is \"\"\n", name, idx);
}
return val;
}
+
+unsigned long Param_getInt(const Param *my, const char *name, const char *idx)
+{
+ return strtoul(Param_getString(my, name, idx), NULL, 0);
+}
#ifndef PARAM_H
#define PARAM_H
-#define PARAM_MAXNVALS 1024
-#define PARAM_MAXNAMELEN 32
+#include <tcl.h>
typedef struct ParamS {
- int nVals;
- char name[PARAM_MAXNVALS][PARAM_MAXNAMELEN];
- long val[PARAM_MAXNVALS];
+ Tcl_Interp *interp;
} Param;
-int conParam(Param *my, const char *fileName);
+int conParam(Param *my);
void desParam(Param *my);
-long Param_getVal(const Param *my, const char *name, const char *idx);
+const char *Param_getString(const Param *my, const char *name, const char *idx);
+unsigned long Param_getInt(const Param *my, const char *name, const char *idx);
#endif
+set evtbuild(file) ./daq_evtbuild
+set evtbuild(args) "daq_evtbuild -s 1 -a"
+set readout(file) ./daq_readout
+set readout(args) "daq_readout -a"
+
set sam0(cardbase) 0x9C000000
set soft(size) 1024
-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/worker.c,v 6.1 1999-08-31 10:37:25 muench Stab $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/worker.c,v 6.2 2000-07-18 14:24:37 hades Exp $";
#define _POSIX_C_SOURCE 199309L
#include <unistd.h>
#include "worker.h"
-static struct sigaction ourOldSigActionS, *ourOldSigAction = &ourOldSigActionS;
-
static sigReceived = 0;
static void noopHandler(int sig)
sched_getparam(0, sp);
}
sp->sched_priority += p;
- if (0 > sched_setscheduler(0, SCHED_FIFO, sp)) {
- msglog(LOG_DEBUG,
- "%s, line %d: %s\n", __FILE__, __LINE__, strerror(errno));
- goto bailOut0;
+
+ return sched_setscheduler(0, SCHED_FIFO, sp);
+}
+
+static int createStatShm(Worker *my)
+{
+ int retVal;
+ char ipcName[_POSIX_PATH_MAX];
+
+ strcpy(ipcName, my->name);
+ strcat(ipcName, ".shm");
+
+ if (-1 == PsxShm_unlink(ipcName) && errno != ENOENT) {
+ msglog(LOG_DEBUG, "%s:%d: %s\n", __FILE__, __LINE__, strerror(errno));
+ retVal = -1;
+ } else {
+ my->shm = PsxShm_open(ipcName, O_CREAT | O_RDWR, S_IRWXU, 32 * sizeof(Statistic));
+ if (NULL == my->shm) {
+ msglog(LOG_DEBUG, "%s:%d: %s\n", __FILE__, __LINE__, strerror(errno));
+ retVal = -1;
+ } else {
+ my->statistics = my->shm->addr;
+ strcpy(my->statistics[0].name, "");
+ retVal = 0;
+ }
}
- return 0;
- bailOut0:
- return -1;
+ return retVal;
}
-Worker *Worker_initBegin(const char *name, void (*sigHandler) (int), int priority, int isStandalone)
+static int removeStatShm(Worker *my)
{
- Worker *my;
char ipcName[_POSIX_PATH_MAX];
- struct sigaction actS, *act = &actS;
- my = allocMem(sizeof(Worker));
+ PsxShm_close(my->shm);
- strcpy(my->name, name);
- my->pid = getpid();
+ strcpy(ipcName, my->name);
+ strcat(ipcName, ".shm");
+ PsxShm_unlink(ipcName);
+
+ return 0;
+}
+
+static int openStatShm(Worker *my)
+{
+ int retVal;
+ char ipcName[_POSIX_PATH_MAX];
+
+ strcpy(ipcName, my->name);
+ strcat(ipcName, ".shm");
+
+ my->shm = PsxShm_open(ipcName, O_RDWR, 0, 32 * sizeof(Statistic));
+ if (NULL == my->shm) {
+ msglog(LOG_DEBUG, "%s:%d: %s\n", __FILE__, __LINE__, strerror(errno));
+ retVal = -1;
+ } else {
+ my->statistics = my->shm->addr;
+ retVal = 0;
+ }
+
+ return retVal;
+}
+
+static int closeStatShm(Worker *my)
+{
+ return PsxShm_close(my->shm);
+}
+
+static int removeSigHandlers(Worker *my) {
+ return sigaction(SIGINT, my->oldSigAction0, NULL)
+ | sigaction(SIGTERM, my->oldSigAction1, NULL);
+}
+
+static int installSigHandlers(Worker *my, int s0, int s1, void (*sigHandler) (int)) {
+ int retVal;
+ struct sigaction actS, *act = &actS;
act->sa_handler = sigHandler;
- sigfillset(&(act->sa_mask));
+ sigfillset(&act->sa_mask);
act->sa_flags = 0;
- if (0 > sigaction(SIGTERM, act, ourOldSigAction)) {
- msglog(LOG_DEBUG, "%s, line %d: %s\n", __FILE__, __LINE__, strerror(errno));
- goto bailOut1;
+
+ my->oldSigAction0 = &my->oldSigAction0S;
+ if (0 > sigaction(s0, act, my->oldSigAction0)) {
+ msglog(LOG_DEBUG, "%s:%d: %s\n", __FILE__, __LINE__, strerror(errno));
+ my->oldSigAction0 = NULL;
}
- if (0 > sigaction(SIGINT, act, ourOldSigAction)) {
- msglog(LOG_DEBUG, "%s, line %d: %s\n", __FILE__, __LINE__, strerror(errno));
- goto bailOut2;
+
+ my->oldSigAction1 = &my->oldSigAction1S;
+ if (0 > sigaction(s1, act, my->oldSigAction1)) {
+ msglog(LOG_DEBUG, "%s:%d: %s\n", __FILE__, __LINE__, strerror(errno));
+ my->oldSigAction1 = NULL;
}
- if (0 > changePriority(priority)) {
- msglog(LOG_WARNING,
- "changeing priority: %s\n", strerror(errno));
+
+ if (my->oldSigAction0 == NULL || my->oldSigAction1 == NULL) {
+ removeSigHandlers(my);
+ retVal = -1;
+ } else {
+ retVal = 0;
}
+
+ return retVal;
+}
+
+Worker *Worker_initBegin(const char *name, void (*sigHandler) (int), int priority, int isStandalone)
+{
+ Worker *retVal;
+ Worker *my;
+
+ my = allocMem(sizeof(Worker));
+
+ strcpy(my->name, name);
+ my->pid = getpid();
my->isStandalone = isStandalone;
- if (my->isStandalone) {
- my->statistics = allocMem(32 * sizeof(Statistic));
+ if (-1 == installSigHandlers(my, SIGINT, SIGTERM, sigHandler)) {
+ msglog(LOG_DEBUG, "%s:%d: %s\n", __FILE__, __LINE__, strerror(errno));
+ Worker_fini(my);
+ retVal = NULL;
+ } else if (-1 == createStatShm(my)) {
+ msglog(LOG_DEBUG, "%s:%d: %s\n", __FILE__, __LINE__, strerror(errno));
+ Worker_fini(my);
+ retVal = NULL;
} else {
- strcpy(ipcName, my->name);
- strcat(ipcName, ".shm");
+ unsigned long *pidP;
- if (NULL == (my->shm = PsxShm_open(ipcName, O_RDWR, 0, 32 * sizeof(Statistic)))) {
- msglog(LOG_DEBUG,
- "%s, line %d: %s\n", __FILE__, __LINE__, strerror(errno));
- goto bailOut3;
- }
- my->statistics = my->shm->addr;
+ pidP = Worker_addStatistic(my, "pid");
+ *pidP = my->pid;
- }
- strcpy(my->statistics[0].name, "");
- return my;
+ if (0 > changePriority(priority)) {
+ msglog(LOG_WARNING, "changeing priority: %s\n", strerror(errno));
+ }
- if (my->isStandalone) {
- freeMem(my->statistics);
- } else {
- PsxShm_close(my->shm);
+ retVal = my;
}
- bailOut3:
- sigaction(SIGINT, ourOldSigAction, NULL);
- bailOut2:
- sigaction(SIGTERM, ourOldSigAction, NULL);
- bailOut1:
- freeMem(my);
- return NULL;
+ return retVal;
}
void Worker_initEnd(Worker *my)
if (!my->isStandalone) {
if (0 > kill(getppid(), SIGUSR1)) {
msglog(LOG_DEBUG,
- "%s, line %d: %s\n", __FILE__, __LINE__, strerror(errno));
+ "%s:%d: %s\n", __FILE__, __LINE__, strerror(errno));
}
}
}
void Worker_fini(Worker *my)
{
- if (my->isStandalone) {
- freeMem(my->statistics);
- } else {
- PsxShm_close(my->shm);
- }
- sigaction(SIGINT, ourOldSigAction, NULL);
- sigaction(SIGTERM, ourOldSigAction, NULL);
+ removeStatShm(my);
+ removeSigHandlers(my);
+
freeMem(my);
}
-Worker *Worker_start(const char *name, char *argv[])
+int Worker_start(const char *path, char *const argv[])
{
- Worker *my;
- char ipcName[_POSIX_PATH_MAX];
- struct sigaction actS, *act = &actS;
- struct sigaction oAlrmActS, *oAlrmAct = &oAlrmActS;
- struct sigaction oChldActS, *oChldAct = &oChldActS;
- sigset_t sigMaskS, *sigMask = &sigMaskS;
+ int retVal;
+ Worker myS, *my = &myS;
- my = allocMem(sizeof(Worker));
+ strcpy(my->name, argv[0]);
- strcpy(my->name, name);
+ installSigHandlers(my, SIGCHLD, SIGUSR1, noopHandler);
- strcpy(ipcName, my->name);
- strcat(ipcName, ".shm");
- if (-1 == PsxShm_unlink(ipcName)) {
- switch (errno) {
- case ENOENT:
- break;
- default:
- msglog(LOG_DEBUG,
- "%s, line %d: %s\n", __FILE__, __LINE__, strerror(errno));
- goto bailOut1;
- break;
- }
- }
- if (NULL == (my->shm = PsxShm_open(ipcName, O_CREAT | O_RDWR, S_IRWXU, 32 * sizeof(Statistic)))) {
- msglog(LOG_DEBUG,
- "%s, line %d: %s\n", __FILE__, __LINE__, strerror(errno));
- goto bailOut1;
- }
- my->statistics = my->shm->addr;
-
- act->sa_handler = noopHandler;
- sigfillset(&(act->sa_mask));
- act->sa_flags = 0;
- if (0 > sigaction(SIGCHLD, act, oChldAct)) {
- msglog(LOG_DEBUG,
- "%s, line %d: %s\n", __FILE__, __LINE__, strerror(errno));
- goto bailOut2;
- }
- if (0 > sigaction(SIGUSR1, act, oAlrmAct)) {
- msglog(LOG_DEBUG,
- "%s, line %d: %s\n", __FILE__, __LINE__, strerror(errno));
- goto bailOut3;
- }
- if (0 > (my->pid = fork())) {
- msglog(LOG_DEBUG,
- "%s, line %d: %s\n", __FILE__, __LINE__, strerror(errno));
- goto bailOut4;
- }
- if (my->pid == 0) { /* This is the child, we can not get out of
- this block */
- if (0 > execvp(name, argv)) {
- msglog(LOG_DEBUG,
- "%s, line %d: %s\n", __FILE__, __LINE__, strerror(errno));
- msglog(LOG_EMERG, "Starting %s: %s\n", name, strerror(errno));
- abort();
- }
+ my->pid = fork();
+ if (0 > my->pid) {
+ msglog(LOG_DEBUG, "%s:%d: %s\n", __FILE__, __LINE__, strerror(errno));
+ retVal = -1;
} else {
- /* BUGBUG there should be a timeout here */
- sigemptyset(sigMask); /* This is the parent, so wait for the child */
- sigsuspend(sigMask); /* to initialize */
-
- if (sigReceived == SIGCHLD) {
- msglog(LOG_DEBUG,
- "%s, line %d: %s\n", __FILE__, __LINE__, strerror(errno));
- goto bailOut4;
+ if (my->pid == 0) { /* This is the child, we can not get out of */
+ /* this block */
+ if (0 > execvp(path, argv)) {
+ msglog(LOG_DEBUG,
+ "%s:%d: %s\n", __FILE__, __LINE__, strerror(errno));
+ msglog(LOG_EMERG, "Starting %s: %s\n", path, strerror(errno));
+ abort();
+ }
+ } else {
+ sigset_t sigMaskS, *sigMask = &sigMaskS;
+
+ /* BUGBUG there should be a timeout here */
+ sigemptyset(sigMask); /* This is the parent, so wait for the */
+ sigsuspend(sigMask); /* child to initialize */
+
+ if (sigReceived == SIGCHLD) {
+ wait(NULL);
+ msglog(LOG_DEBUG,
+ "%s:%d: %s\n", __FILE__, __LINE__, strerror(errno));
+ retVal = -1;
+ } else {
+ retVal = 0;
+ }
}
}
- sigaction(SIGUSR1, oAlrmAct, NULL);
- sigaction(SIGCHLD, oChldAct, NULL);
+ removeSigHandlers(my);
- return my;
-
- bailOut5:
- if (0 == kill(my->pid, SIGTERM)) {
- wait(NULL);
- }
- bailOut4:
- sigaction(SIGUSR1, oAlrmAct, NULL);
- bailOut3:
- sigaction(SIGCHLD, oChldAct, NULL);
- bailOut2:
- PsxShm_close(my->shm);
- strcpy(ipcName, my->name);
- strcat(ipcName, ".shm");
- PsxShm_unlink(ipcName);
- bailOut1:
- freeMem(my);
-
- return NULL;
+ return retVal;
}
-char *Worker_status(Worker *my)
+char *Worker_status(const char *name)
{
+ char *retVal;
+ Worker myS, *my = &myS;
static char buf[32 * 80];
char *p;
int i;
- strcpy(buf, "{}");
- for (
- i = 0, p = buf;
- i < 32 && strcmp(my->statistics[i].name, "") != 0;
- i++) {
- p += sprintf(p,
- "{ %s %lu } ", my->statistics[i].name, my->statistics[i].value);
+ strcpy(my->name, name);
+
+ if (-1 == openStatShm(my)) {
+ msglog(LOG_DEBUG, "%s:%d: %s\n", __FILE__, __LINE__, strerror(errno));
+ retVal = NULL;
+ } else {
+ strcpy(buf, "{}");
+ for (
+ i = 0, p = buf;
+ i < 32 && strcmp(my->statistics[i].name, "") != 0;
+ i++) {
+ p += sprintf(p,
+ "{ %s %lu } ", my->statistics[i].name, my->statistics[i].value);
+ }
+ closeStatShm(my);
+ retVal = buf;
}
- return buf;
+
+ return retVal;
}
-void Worker_stop(Worker *my, int timeout)
+void Worker_stop(const char *name, int timeout)
{
- char ipcName[_POSIX_PATH_MAX];
+ Worker myS, *my = &myS;
+
+ strcpy(my->name, name);
- if (0 == kill(my->pid, SIGTERM)) {
- wait(NULL);
+ if (0 == openStatShm(my)) {
+ my->pid = my->statistics[0].value;
+ if (my->pid > 0) {
+ if (0 == kill(my->pid, SIGTERM)) {
+ wait(NULL);
+ }
+ }
}
- PsxShm_close(my->shm);
- strcpy(ipcName, my->name);
- strcat(ipcName, ".shm");
- PsxShm_unlink(ipcName);
- freeMem(my);
}
unsigned long *Worker_addStatistic(Worker *my, const char *name)
{
+ unsigned long *retVal;
int i;
for (i = 0; i < 32 && strcmp(my->statistics[i].name, "") != 0; i++) {
}
if (i == 32) {
- errno = 0;
+ errno = ENOSPC;
msglog(LOG_DEBUG,
- "%s, line %d: %s\n", __FILE__, __LINE__, "Too many statistics");
- goto bailOut0;
- }
- strcpy(my->statistics[i].name, name);
- my->statistics[i].value = 0;
- strcpy(my->statistics[i + 1].name, "");
-
- return &(my->statistics[i].value);
+ "%s:%d: %s\n", __FILE__, __LINE__, "Too many statistics");
+ retVal = NULL;
+ } else {
+ strcpy(my->statistics[i].name, name);
+ my->statistics[i].value = 0;
+ strcpy(my->statistics[i + 1].name, "");
- bailOut0:
- return NULL;
+ retVal = &(my->statistics[i].value);
+ }
+ return retVal;
}
void Worker_dump(Worker *my, time_t interval)
curTime = time(NULL);
if (curTime >= lastTime + interval) {
- msglog(LOG_INFO, "%s\n", Worker_status(my));
+ msglog(LOG_INFO, "%s\n", Worker_status(my->name));
lastTime = curTime;
}
}
#define WORKER_H
#include <limits.h>
+#include <signal.h>
#include "psxshm.h"
typedef struct StatisticS {
- char name[256];
- unsigned long value;
+ char name[256];
+ unsigned long value;
} Statistic;
typedef struct WorkerS {
- char name[_POSIX_PATH_MAX];
- PsxShm *shm;
- Statistic *statistics;
- pid_t pid;
- int isStandalone;
+ char name[_POSIX_PATH_MAX];
+ struct sigaction oldSigAction0S;
+ struct sigaction *oldSigAction0;
+ struct sigaction oldSigAction1S;
+ struct sigaction *oldSigAction1;
+ PsxShm *shm;
+ Statistic *statistics;
+ pid_t pid;
+ int isStandalone;
} Worker;
-Worker *Worker_start(const char *name, char *argv[]);
-char *Worker_status(Worker * my);
-void Worker_stop(Worker * my, int timeout);
+int Worker_start(const char *path, char *const argv[]);
+char *Worker_status(const char *name);
+void Worker_stop(const char *name, int timeout);
Worker *Worker_initBegin(const char *name, void (*sigHandler) (int), int priority, int isStandalone);
-void Worker_initEnd(Worker * my);
-void Worker_fini(Worker * my);
-unsigned long *Worker_addStatistic(Worker * my, const char *name);
-void Worker_dump(Worker * my, time_t interval);
+void Worker_initEnd(Worker *my);
+void Worker_fini(Worker *my);
+unsigned long *Worker_addStatistic(Worker *my, const char *name);
+void Worker_dump(Worker *my, time_t interval);
#endif