From cbeb474b8371bc248ae3f41b9480a184ed21c2d8 Mon Sep 17 00:00:00 2001 From: hadaq Date: Thu, 23 May 2002 16:51:37 +0000 Subject: [PATCH] optimized code (omits empty subevents), minimize communication overhead, needs new hwship.c hwship.h --- hadaq/hwshow.c | 46 ++++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/hadaq/hwshow.c b/hadaq/hwshow.c index 0d7498c..bebf105 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.20 2001-11-18 13:10:35 hadaq Exp $"; +static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/Attic/hwshow.c,v 6.21 2002-05-23 16:51:37 hadaq Exp $"; #define _POSIX_C_SOURCE 199309L @@ -50,7 +50,7 @@ Hardware *newHardware(void) my->maxSubEvtSize = SubEvt_hdrSize() + (NSHIPS * 1600 * sizeof(uint32_t)); for (i = 0; i < NSHIPS; i++) { - char buf[16]; + char buf[12]; my->ship[i] = malloc(sizeof(HwShip)); sprintf(buf, "ipc%d", i); @@ -80,36 +80,48 @@ void deleteHardware(Hardware *my) void Hardware_waitForTrigger(Hardware *my, void *subEvt) { int i; + int nRequests = 0; for (i = 0; i < NSHIPS; i++) { if (HwShip_isEmpty(my->ship[i])) { HwShip_requestBuffer(my->ship[i]); + ++nRequests; } } - for (i = 0; i < NSHIPS; i++) { - while (HwShip_isBusy(my->ship[i])) { -#if 1 + do { + for (i = 0; i < NSHIPS; i++) { + if (HwShip_isBufRequested(my->ship[i])) { + if (!HwShip_isBusy(my->ship[i])) { + HwShip_getEndOfData(my->ship[i]); + --nRequests; + } + } + } +#if 0 /* * This sleep prevents a tight loop which stops work on real * time systems if the priority of readout is not lowered. * When not using the sleep use option -p -2 for daq_readout. */ - struct timespec tS, *t = &tS; - t->tv_sec = 0; - t->tv_nsec = 020000000; - nanosleep(t, NULL); + if (nRequests == NSHIPS) { + struct timespec tS, *t = &tS; + t->tv_sec = 0; + t->tv_nsec = 020000000; + nanosleep(t, NULL); + } #endif - } - } + } while(nRequests); + } void Hardware_readout(Hardware *my, void *partEvt) { int i; + int firstShip = -1; void *subEvt = SubEvt_data(partEvt); static uint32_t trigNr = 0; - uint32_t trigTag; + uint32_t trigTag = 0; /* init partial event, necessary for SubEvt_next() */ SubEvt_setDecoding(partEvt, SubEvtDecoding_SubEvts); @@ -117,18 +129,20 @@ void Hardware_readout(Hardware *my, void *partEvt) /* read all ships, check for common trigger tag */ for (i = 0; i < NSHIPS; i++) { - HwShip_readSubEvt(my->ship[i], subEvt); - if (i == 0) { + if( HwShip_readSubEvt(my->ship[i], subEvt) == 0) { + if (firstShip < 0) { trigTag = SubEvt_trigNr(subEvt) & 0xff; + firstShip = i; } else { if (trigTag != (SubEvt_trigNr(subEvt) & 0xff)) { SubEvt_setId(subEvt, SubEvt_id(subEvt) | 0x80000000UL); SubEvt_setId(partEvt, SubEvt_id(partEvt) | 0x80000000UL); - syslog(LOG_ERR, "(%s)Trigger tag mismatch: 0x%08x != 0x%08x", - my->ship[i]->name,trigTag, SubEvt_trigNr(subEvt)); + syslog(LOG_ERR, "(%s)Trigger tag mismatch: 0x%08x (%d) != 0x%08x", + my->ship[i]->name,trigTag,firstShip,SubEvt_trigNr(subEvt)); } } subEvt = SubEvt_next(partEvt, subEvt); + } } SubEvt_setTrigNr(partEvt, trigNr << 8 | trigTag); -- 2.43.0