From d747903b229727fe5d78e3af400c01f6b0ff5ee3 Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 18 Jul 2000 14:24:35 +0000 Subject: [PATCH] Merge with new-worker branch, cont correctness in daq_lib --- hadaq/Makefile | 5 + hadaq/agent.c | 18 ++- hadaq/daq_lib.c | 72 +++++++++ hadaq/daq_lib.h | 12 ++ hadaq/daqctrl.c | 70 +++++++++ hadaq/hwdtu.c | 4 +- hadaq/hwmdc.c | 4 +- hadaq/hwrace.c | 4 +- hadaq/hwrich.c | 4 +- hadaq/hwsam.c | 2 +- hadaq/hwship.c | 2 +- hadaq/hwshow.c | 4 +- hadaq/hwsis3801.c | 4 +- hadaq/hwsoft.c | 4 +- hadaq/hwtbus.c | 4 +- hadaq/hwtip.c | 2 +- hadaq/hwtof.c | 4 +- hadaq/hwtrig.c | 4 +- hadaq/hwv488.c | 14 +- hadaq/hwv775.c | 12 +- hadaq/hwv878.c | 14 +- hadaq/param.c | 75 +++++----- hadaq/param.h | 12 +- hadaq/param.tcl | 5 + hadaq/worker.c | 369 +++++++++++++++++++++++++--------------------- hadaq/worker.h | 33 +++-- 26 files changed, 471 insertions(+), 286 deletions(-) create mode 100644 hadaq/daq_lib.c create mode 100644 hadaq/daq_lib.h create mode 100644 hadaq/daqctrl.c diff --git a/hadaq/Makefile b/hadaq/Makefile index fc0d518..dcb31c0 100644 --- a/hadaq/Makefile +++ b/hadaq/Makefile @@ -14,6 +14,8 @@ 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 \ @@ -60,6 +62,9 @@ xmanage: daq_xmanage anal 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 diff --git a/hadaq/agent.c b/hadaq/agent.c index 780565a..2f099c3 100644 --- a/hadaq/agent.c +++ b/hadaq/agent.c @@ -3,27 +3,28 @@ #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) @@ -43,11 +44,11 @@ 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; } @@ -74,6 +75,7 @@ int *rpcworker_stop_1(int *id, CLIENT * cl) static int retVal; Worker_stop(getWorker(*id), 15); + removeWorker(*id); retVal = 0; diff --git a/hadaq/daq_lib.c b/hadaq/daq_lib.c new file mode 100644 index 0000000..0b422a8 --- /dev/null +++ b/hadaq/daq_lib.c @@ -0,0 +1,72 @@ +static char rcsId[] = "$Id: daq_lib.c,v 6.1 2000-07-18 14:24:36 hades Exp $"; + +#include +#include +#include +#include +#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; +} diff --git a/hadaq/daq_lib.h b/hadaq/daq_lib.h new file mode 100644 index 0000000..dace452 --- /dev/null +++ b/hadaq/daq_lib.h @@ -0,0 +1,12 @@ +#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 diff --git a/hadaq/daqctrl.c b/hadaq/daqctrl.c new file mode 100644 index 0000000..a944fcc --- /dev/null +++ b/hadaq/daqctrl.c @@ -0,0 +1,70 @@ +static char rcsId[] = "$Id: daqctrl.c,v 6.1 2000-07-18 14:24:36 hades Exp $"; + +#include +#include +#include +#include +#include +#include + +#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); +} diff --git a/hadaq/hwdtu.c b/hadaq/hwdtu.c index a6c9969..0f370a7 100644 --- a/hadaq/hwdtu.c +++ b/hadaq/hwdtu.c @@ -1,4 +1,4 @@ -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 @@ -26,7 +26,7 @@ int conHwDtu(HwDtu *my, const char *name, const Param *param) 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)) { diff --git a/hadaq/hwmdc.c b/hadaq/hwmdc.c index 0bbdbcf..4219151 100644 --- a/hadaq/hwmdc.c +++ b/hadaq/hwmdc.c @@ -1,4 +1,4 @@ -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 @@ -42,7 +42,7 @@ Hardware *newHardware(void) 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; } diff --git a/hadaq/hwrace.c b/hadaq/hwrace.c index 2a47309..9acc891 100644 --- a/hadaq/hwrace.c +++ b/hadaq/hwrace.c @@ -1,4 +1,4 @@ -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 @@ -46,7 +46,7 @@ int conHwRace(HwRace *my, const char *name, const Param *param) 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)) { diff --git a/hadaq/hwrich.c b/hadaq/hwrich.c index f06a45f..a271782 100644 --- a/hadaq/hwrich.c +++ b/hadaq/hwrich.c @@ -1,4 +1,4 @@ -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 @@ -57,7 +57,7 @@ Hardware *newHardware(void) 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; } diff --git a/hadaq/hwsam.c b/hadaq/hwsam.c index 75eee01..9d512b7 100644 --- a/hadaq/hwsam.c +++ b/hadaq/hwsam.c @@ -48,7 +48,7 @@ int conHwSam(HwSam * my, const char *name, const Param *param) 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); diff --git a/hadaq/hwship.c b/hadaq/hwship.c index 2ff41f5..b93779c 100644 --- a/hadaq/hwship.c +++ b/hadaq/hwship.c @@ -96,7 +96,7 @@ int conHwShip(HwShip * my, const char *name, const Param *param) 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); diff --git a/hadaq/hwshow.c b/hadaq/hwshow.c index 6e3b388..4a5cda8 100644 --- a/hadaq/hwshow.c +++ b/hadaq/hwshow.c @@ -1,4 +1,4 @@ -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 @@ -39,7 +39,7 @@ Hardware *newHardware(void) 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; } diff --git a/hadaq/hwsis3801.c b/hadaq/hwsis3801.c index e8e1a37..b99100b 100644 --- a/hadaq/hwsis3801.c +++ b/hadaq/hwsis3801.c @@ -1,4 +1,4 @@ -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 @@ -26,7 +26,7 @@ int conHwSis3801(HwSis3801 *my, const char *name, const Param *param) 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)) { diff --git a/hadaq/hwsoft.c b/hadaq/hwsoft.c index b001d4e..3abe546 100644 --- a/hadaq/hwsoft.c +++ b/hadaq/hwsoft.c @@ -34,8 +34,8 @@ Hardware *newHardware(void) 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; } diff --git a/hadaq/hwtbus.c b/hadaq/hwtbus.c index e12f0a7..c09a5b7 100644 --- a/hadaq/hwtbus.c +++ b/hadaq/hwtbus.c @@ -1,4 +1,4 @@ -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 @@ -33,7 +33,7 @@ Hardware *newHardware(void) 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; } diff --git a/hadaq/hwtip.c b/hadaq/hwtip.c index ada253d..1769b54 100644 --- a/hadaq/hwtip.c +++ b/hadaq/hwtip.c @@ -110,7 +110,7 @@ int conHwTip(HwTip * my, const char *name, const Param *param) 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); diff --git a/hadaq/hwtof.c b/hadaq/hwtof.c index faa61d1..04160f5 100644 --- a/hadaq/hwtof.c +++ b/hadaq/hwtof.c @@ -1,4 +1,4 @@ -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 @@ -39,7 +39,7 @@ Hardware *newHardware(void) 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; } diff --git a/hadaq/hwtrig.c b/hadaq/hwtrig.c index 8b7929f..f5477e5 100644 --- a/hadaq/hwtrig.c +++ b/hadaq/hwtrig.c @@ -48,8 +48,8 @@ Hardware *newHardware(void) 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)); diff --git a/hadaq/hwv488.c b/hadaq/hwv488.c index 29787da..eec6dc3 100644 --- a/hadaq/hwv488.c +++ b/hadaq/hwv488.c @@ -1,4 +1,4 @@ -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 @@ -26,7 +26,7 @@ int conHwV488(HwV488 * my, const char *name, const Param *param) 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)) { @@ -35,11 +35,11 @@ int conHwV488(HwV488 * my, const char *name, const Param *param) } 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; } diff --git a/hadaq/hwv775.c b/hadaq/hwv775.c index c956bcb..3ea8a94 100644 --- a/hadaq/hwv775.c +++ b/hadaq/hwv775.c @@ -1,4 +1,4 @@ -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 @@ -25,7 +25,7 @@ int conHwV775(HwV775 *my, const char *name, const Param *param) 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)) { @@ -40,15 +40,15 @@ int conHwV775(HwV775 *my, const char *name, const Param *param) 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; } diff --git a/hadaq/hwv878.c b/hadaq/hwv878.c index 100d3ea..aa0e930 100644 --- a/hadaq/hwv878.c +++ b/hadaq/hwv878.c @@ -1,4 +1,4 @@ -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 @@ -25,7 +25,7 @@ int conHwV878(HwV878 *my, const char *name, const Param *param) 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)) { @@ -42,16 +42,16 @@ int conHwV878(HwV878 *my, const char *name, const Param *param) 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; } diff --git a/hadaq/param.c b/hadaq/param.c index 78d3f41..eca5028 100644 --- a/hadaq/param.c +++ b/hadaq/param.c @@ -1,4 +1,4 @@ -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 @@ -6,63 +6,54 @@ static char rcsId[] = "$Id: param.c,v 6.2 1999-08-31 10:45:16 muench Stab $"; #include #include #include - -#include +#include #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); +} diff --git a/hadaq/param.h b/hadaq/param.h index bf78cf6..fced49a 100644 --- a/hadaq/param.h +++ b/hadaq/param.h @@ -1,17 +1,15 @@ #ifndef PARAM_H #define PARAM_H -#define PARAM_MAXNVALS 1024 -#define PARAM_MAXNAMELEN 32 +#include 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 diff --git a/hadaq/param.tcl b/hadaq/param.tcl index 4fac04b..bb8db5a 100644 --- a/hadaq/param.tcl +++ b/hadaq/param.tcl @@ -1,3 +1,8 @@ +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 diff --git a/hadaq/worker.c b/hadaq/worker.c index a57db93..6909118 100644 --- a/hadaq/worker.c +++ b/hadaq/worker.c @@ -1,4 +1,4 @@ -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 @@ -23,8 +23,6 @@ static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/had #include "worker.h" -static struct sigaction ourOldSigActionS, *ourOldSigAction = &ourOldSigActionS; - static sigReceived = 0; static void noopHandler(int sig) @@ -47,75 +45,142 @@ static int changePriority(int p) 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) @@ -123,169 +188,129 @@ 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) @@ -296,7 +321,7 @@ 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; } } diff --git a/hadaq/worker.h b/hadaq/worker.h index 910a7d2..3b799ec 100644 --- a/hadaq/worker.h +++ b/hadaq/worker.h @@ -2,29 +2,34 @@ #define WORKER_H #include +#include #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 -- 2.43.0