source: trunk/FACT++/src/EventBuilder.c@ 12408

Last change on this file since 12408 was 12408, checked in by lyard, 14 years ago
removed debug messaged
File size: 83.8 KB
Line 
1
2// // // #define EVTDEBUG
3
4#define NUMSOCK 1 //set to 7 for old configuration
5#define MAXREAD 65536 //64kB wiznet buffer
6
7#include <stdlib.h>
8#include <stdint.h>
9#include <unistd.h>
10#include <stdio.h>
11#include <sys/time.h>
12#include <arpa/inet.h>
13#include <string.h>
14#include <math.h>
15#include <error.h>
16#include <errno.h>
17#include <unistd.h>
18#include <sys/types.h>
19#include <sys/socket.h>
20#include <netinet/in.h>
21#include <netinet/tcp.h>
22#include <pthread.h>
23#include <sched.h>
24
25#include "EventBuilder.h"
26
27enum Severity
28{
29 kMessage = 10, ///< Just a message, usually obsolete
30 kInfo = 20, ///< An info telling something which can be interesting to know
31 kWarn = 30, ///< A warning, things that somehow might result in unexpected or unwanted bahaviour
32 kError = 40, ///< Error, something unexpected happened, but can still be handled by the program
33 kFatal = 50, ///< An error which cannot be handled at all happend, the only solution is program termination
34 kDebug = 99, ///< A message used for debugging only
35};
36
37#define MIN_LEN 32 // min #bytes needed to interpret FADheader
38#define MAX_LEN 256*1024 // size of read-buffer per socket
39
40//#define nanosleep(x,y)
41
42extern FileHandle_t runOpen (uint32_t irun, RUN_HEAD * runhd, size_t len);
43extern int runWrite (FileHandle_t fileHd, EVENT * event, size_t len);
44extern int runClose (FileHandle_t fileHd, RUN_TAIL * runth, size_t len);
45//extern int runFinish (uint32_t runnr);
46
47extern void factOut (int severity, int err, char *message);
48
49extern void gotNewRun (int runnr, PEVNT_HEADER * headers);
50
51
52extern void factStat (GUI_STAT gj);
53
54extern void factStatNew (EVT_STAT gi);
55
56extern int eventCheck (uint32_t runNr, PEVNT_HEADER * fadhd, EVENT * event);
57
58extern int subProcEvt (int threadID, PEVNT_HEADER * fadhd, EVENT * event,
59 int8_t * buffer);
60
61extern void debugHead (int i, int j, void *buf);
62
63extern void debugRead (int isock, int ibyte, int32_t event, int32_t ftmevt,
64 int32_t runnr, int state, uint32_t tsec,
65 uint32_t tusec);
66extern void debugStream (int isock, void *buf, int len);
67
68int CloseRunFile (uint32_t runId, uint32_t closeTime, uint32_t maxEvt);
69
70
71
72
73
74int g_maxProc;
75int g_maxSize;
76int gi_maxSize;
77int gi_maxProc;
78
79uint g_actTime;
80uint g_actUsec;
81int g_runStat;
82int g_reset;
83int g_useFTM;
84
85int gi_reset, gi_resetR, gi_resetS, gi_resetW, gi_resetX;
86size_t g_maxMem; //maximum memory allowed for buffer
87
88//no longer needed ...
89int g_maxBoards; //maximum number of boards to be initialized
90int g_actBoards;
91//
92
93FACT_SOCK g_port[NBOARDS]; // .addr=string of IP-addr in dotted-decimal "ddd.ddd.ddd.ddd"
94
95
96int gi_runStat;
97int gp_runStat;
98int gw_runStat;
99
100int gi_memStat = +1;
101
102uint32_t gi_myRun = 0;
103uint32_t actrun = 0;
104
105
106uint gi_NumConnect[NBOARDS]; //4 crates * 10 boards
107
108//uint gi_EvtStart= 0 ;
109//uint gi_EvtRead = 0 ;
110//uint gi_EvtBad = 0 ;
111//uint gi_EvtTot = 0 ;
112//size_t gi_usedMem = 0 ;
113
114//uint gw_EvtTot = 0 ;
115//uint gp_EvtTot = 0 ;
116
117PIX_MAP g_pixMap[NPIX];
118
119EVT_STAT gi;
120GUI_STAT gj;
121
122EVT_CTRL evtCtrl; //control of events during processing
123int evtIdx[MAX_EVT * MAX_RUN]; //index from mBuffer to evtCtrl
124
125WRK_DATA mBuffer[MAX_EVT * MAX_RUN]; //local working space
126
127#define MXSTR 1000
128char str[MXSTR];
129
130//ETIENNE
131#define MAX_SLOTS_PER_CHUNK 100
132
133typedef struct {
134 int32_t eventNumber;
135 int32_t chunk;
136 int32_t slot;
137} CHUNK_MAPPING;
138
139CHUNK_MAPPING mBufferMapping[MAX_EVT * MAX_RUN];
140
141#define MAX_EVT_MEM (sizeof(EVENT) + NPIX*1024*2 + NTMARK*1024*2)
142#define MAX_HEAD_MEM (NBOARDS * sizeof(PEVNT_HEADER))
143#define MAX_SLOT_SIZE (MAX_EVT_MEM + MAX_HEAD_MEM)
144#define MAX_CHUNK_SIZE (MAX_SLOT_SIZE*MAX_SLOTS_PER_CHUNK)
145
146typedef struct {
147 void * pointers[MAX_SLOTS_PER_CHUNK];
148 int32_t events[MAX_SLOTS_PER_CHUNK];
149 int32_t nFreeSlots;
150 int32_t nSlots;
151} ETI_CHUNK;
152
153int32_t numAllocatedChunks = 0;
154
155#define MAX_CHUNKS 8096
156ETI_CHUNK EtiMemoryChunks[MAX_CHUNKS];
157
158void* ETI_Malloc(int evtId, int evtIndex)
159{
160 int i,j;
161 for (i=0;i<numAllocatedChunks;i++) {
162 if (EtiMemoryChunks[i].nFreeSlots > 0) {
163 for (j=0;j<EtiMemoryChunks[i].nSlots;j++)
164 {
165 if (EtiMemoryChunks[i].events[j] == -1)
166 {
167 EtiMemoryChunks[i].events[j] = evtId;
168 EtiMemoryChunks[i].nFreeSlots--;
169 mBufferMapping[evtIndex].eventNumber = evtId;
170 mBufferMapping[evtIndex].chunk = i;
171 mBufferMapping[evtIndex].slot = j;
172 return EtiMemoryChunks[i].pointers[j];
173 }
174 }
175 //If I reach this point then we have a problem because it should have found
176 //a free spot just above.
177 }
178 }
179 //If we reach this point this means that we should allocate more memory
180 int32_t numNewSlots = 0;
181 if ((numAllocatedChunks + 1)*MAX_CHUNK_SIZE < g_maxMem)
182 numNewSlots = MAX_SLOTS_PER_CHUNK;
183 else
184 numNewSlots = (g_maxMem - numAllocatedChunks*MAX_CHUNK_SIZE)/MAX_SLOT_SIZE;
185
186 if (numNewSlots == 0)//cannot allocate more without exceeding the max mem limit
187 {
188 return NULL;
189 }
190
191 EtiMemoryChunks[numAllocatedChunks].pointers[0] = malloc(MAX_SLOT_SIZE*numNewSlots);
192 if (EtiMemoryChunks[numAllocatedChunks].pointers[0] == NULL)
193 {
194 snprintf (str, MXSTR, "could not allocate %lu bytes. %d chunks are currently allocated (max allowed %lu bytes)", MAX_CHUNK_SIZE, numAllocatedChunks, g_maxMem);
195 factOut (kError, 000, str);
196 return NULL;
197 }
198
199 EtiMemoryChunks[numAllocatedChunks].nSlots = numNewSlots;
200 EtiMemoryChunks[numAllocatedChunks].events[0] = evtId;
201 EtiMemoryChunks[numAllocatedChunks].nFreeSlots = numNewSlots-1;
202 mBufferMapping[evtIndex].eventNumber = evtId;
203 mBufferMapping[evtIndex].chunk = numAllocatedChunks;
204 mBufferMapping[evtIndex].slot = 0;
205
206 for (i=1;i<numNewSlots;i++)
207 {
208 EtiMemoryChunks[numAllocatedChunks].pointers[i] = &(((char*)(EtiMemoryChunks[numAllocatedChunks].pointers[i-1]))[MAX_SLOT_SIZE]);
209 EtiMemoryChunks[numAllocatedChunks].events[i] = -1;
210 }
211 numAllocatedChunks++;
212
213 return EtiMemoryChunks[numAllocatedChunks-1].pointers[0];
214}
215
216void ETI_Free(int evtId, int evtIndex)
217{
218 ETI_CHUNK* currentChunk = &EtiMemoryChunks[mBufferMapping[evtIndex].chunk];
219 if (currentChunk->events[mBufferMapping[evtIndex].slot] != evtId)
220 {
221 snprintf (str, MXSTR, "Mismatch in chunk mapping table. expected evtId %d. Got %d. No memory was freed.", evtId, currentChunk->events[mBufferMapping[evtIndex].slot]);
222 factOut (kError, 000, str);
223 return;
224 }
225 currentChunk->events[mBufferMapping[evtIndex].slot] = -1;
226 currentChunk->nFreeSlots++;
227
228 int chunkIndex = mBufferMapping[evtIndex].chunk;
229 if (chunkIndex != numAllocatedChunks-1)
230 return;
231
232 while (EtiMemoryChunks[chunkIndex].nFreeSlots == EtiMemoryChunks[chunkIndex].nSlots)
233 {//free this chunk
234 free(EtiMemoryChunks[chunkIndex].pointers[0]);
235 numAllocatedChunks--;
236 chunkIndex--;
237 if (numAllocatedChunks == 0)
238 break;
239 }
240}
241//END ETIENNE
242
243
244
245RUN_HEAD actRun;
246
247RUN_CTRL runCtrl[MAX_RUN];
248
249RUN_TAIL runTail[MAX_RUN];
250
251
252/*
253*** Definition of rdBuffer to read in IP packets; keep it global !!!!
254 */
255
256
257typedef union
258{
259 int8_t B[MAX_LEN];
260 int16_t S[MAX_LEN / 2];
261 int32_t I[MAX_LEN / 4];
262 int64_t L[MAX_LEN / 8];
263} CNV_FACT;
264
265typedef struct
266{
267 int bufTyp; //what are we reading at the moment: 0=header 1=data -1=skip ...
268 int32_t bufPos; //next byte to read to the buffer next
269 int32_t bufLen; //number of bytes left to read
270// size_t bufLen; //number of bytes left to read size_t might be better
271 int32_t skip; //number of bytes skipped before start of event
272
273 int errCnt; //how often connect failed since last successful
274 int sockStat; //-1 if socket not yet connected , 99 if not exist
275 int socket; //contains the sockets
276 struct sockaddr_in SockAddr; //IP for each socket
277
278 int evtID; // event ID of event currently read
279 int runID; // run "
280 int ftmID; // event ID from FTM
281 uint fadLen; // FADlength of event currently read
282 int fadVers; // Version of FAD
283 int ftmTyp; // trigger type
284 int board; // boardID (softwareID: 0..40 )
285 int Port;
286
287 CNV_FACT *rBuf;
288
289#ifdef EVTDEBUG
290 CNV_FACT *xBuf; //a copy of rBuf (temporary for debuging)
291#endif
292
293} READ_STRUCT;
294
295
296typedef union
297{
298 int8_t B[2];
299 int16_t S;
300} SHORT_BYTE;
301
302
303
304
305
306SHORT_BYTE start, stop;
307
308READ_STRUCT rd[MAX_SOCK]; //buffer to read IP and afterwards store in mBuffer
309
310
311
312/*-----------------------------------------------------------------*/
313
314
315/*-----------------------------------------------------------------*/
316
317int
318runFinish1 (uint32_t runnr)
319{
320 snprintf (str, MXSTR, "Should finish run %d (but not yet possible)",
321 runnr);
322 factOut (kInfo, 173, str); //but continue anyhow
323 return 0;
324}
325int
326runFinish (uint32_t runnr)
327{
328 snprintf (str, MXSTR, "Should finish run %d (but not yet possible)",
329 runnr);
330 factOut (kInfo, 173, str); //but continue anyhow
331 return 0;
332}
333
334int
335GenSock (int flag, int sid, int port, struct sockaddr_in *sockAddr,
336 READ_STRUCT * rd)
337{
338/*
339*** generate Address, create sockets and allocates readbuffer for it
340***
341*** if flag==0 generate socket and buffer
342*** <0 destroy socket and buffer
343*** >0 close and redo socket
344***
345*** sid : board*7 + port id
346 */
347
348 int j;
349 int optval = 1; //activate keepalive
350 socklen_t optlen = sizeof (optval);
351
352
353 if (sid % 7 >= NUMSOCK) {
354 //this is a not used socket, so do nothing ...
355 rd->sockStat = 77;
356 rd->rBuf = NULL ;
357 return 0;
358 }
359
360 if (rd->sockStat == 0) { //close socket if open
361 j = close (rd->socket);
362 if (j > 0) {
363 snprintf (str, MXSTR, "Error closing socket %d | %m", sid);
364 factOut (kFatal, 771, str);
365 } else {
366 snprintf (str, MXSTR, "Succesfully closed socket %d", sid);
367 factOut (kInfo, 771, str);
368 }
369 }
370
371 rd->sockStat = 99;
372
373 if (flag < 0) {
374 free (rd->rBuf); //and never open again
375#ifdef EVTDEBUG
376 free (rd->xBuf); //and never open again
377#endif
378 rd->rBuf = NULL;
379 return 0;
380 }
381
382
383 if (flag == 0) { //generate address and buffer ...
384 rd->Port = port;
385 rd->SockAddr.sin_family = sockAddr->sin_family;
386 rd->SockAddr.sin_port = htons (port);
387 rd->SockAddr.sin_addr = sockAddr->sin_addr;
388
389#ifdef EVTDEBUG
390 rd->xBuf = malloc (sizeof (CNV_FACT));
391#endif
392 rd->rBuf = malloc (sizeof (CNV_FACT));
393 if (rd->rBuf == NULL) {
394 snprintf (str, MXSTR, "Could not create local buffer %d", sid);
395 factOut (kFatal, 774, str);
396 rd->sockStat = 77;
397 return -3;
398 }
399 }
400
401
402 if ((rd->socket = socket (PF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0)) <= 0) {
403 snprintf (str, MXSTR, "Could not generate socket %d | %m", sid);
404 factOut (kFatal, 773, str);
405 rd->sockStat = 88;
406 return -2;
407 }
408 optval = 1;
409 if (setsockopt (rd->socket, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0) {
410 snprintf (str, MXSTR, "Could not set keepalive %d | %m", sid);
411 factOut (kInfo, 173, str); //but continue anyhow
412 }
413 optval = 10; //start after 10 seconds
414 if (setsockopt (rd->socket, SOL_TCP, TCP_KEEPIDLE, &optval, optlen) < 0) {
415 snprintf (str, MXSTR, "Could not set keepidle %d | %m", sid);
416 factOut (kInfo, 173, str); //but continue anyhow
417 }
418 optval = 10; //do every 10 seconds
419 if (setsockopt (rd->socket, SOL_TCP, TCP_KEEPINTVL, &optval, optlen) < 0) {
420 snprintf (str, MXSTR, "Could not set keepintvl %d | %m", sid);
421 factOut (kInfo, 173, str); //but continue anyhow
422 }
423 optval = 2; //close after 2 unsuccessful tries
424 if (setsockopt (rd->socket, SOL_TCP, TCP_KEEPCNT, &optval, optlen) < 0) {
425 snprintf (str, MXSTR, "Could not set keepalive probes %d | %m", sid);
426 factOut (kInfo, 173, str); //but continue anyhow
427 }
428
429
430 snprintf (str, MXSTR, "Successfully generated socket %d ", sid);
431 factOut (kInfo, 773, str);
432 rd->sockStat = -1; //try to (re)open socket
433 rd->errCnt = 0;
434 return 0;
435
436} /*-----------------------------------------------------------------*/
437
438 /*-----------------------------------------------------------------*/
439
440
441
442
443int
444mBufInit ()
445{
446// initialize mBuffer (mark all entries as unused\empty)
447
448 int i;
449 uint32_t actime;
450
451 actime = g_actTime + 50000000;
452
453 for (i = 0; i < MAX_EVT * MAX_RUN; i++) {
454 mBuffer[i].evNum = mBuffer[i].nRoi = -1;
455 mBuffer[i].runNum = 0;
456
457 evtCtrl.evtBuf[i] = -1;
458 evtCtrl.evtStat[i] = -1;
459 evtCtrl.pcTime[i] = actime; //initiate to far future
460
461 //ETIENNE
462 mBufferMapping[i].chunk = -1;
463 mBufferMapping[i].eventNumber = -1;
464 mBufferMapping[i].slot = -1;
465 //END ETIENNE
466 }
467
468 actRun.FADhead = malloc (NBOARDS * sizeof (PEVNT_HEADER));
469
470 evtCtrl.frstPtr = 0;
471 evtCtrl.lastPtr = 0;
472
473 return 0;
474
475} /*-----------------------------------------------------------------*/
476
477
478
479
480int
481mBufEvt (int evID, uint runID, int nRoi[], int sk,
482 int fadlen, int trgTyp, int trgNum, int fadNum)
483{
484// generate a new Event into mBuffer:
485// make sure only complete Event are possible, so 'free' will always work
486// returns index into mBuffer[], or negative value in case of error
487// error: <-9000 if roi screwed up (not consistent with run)
488// <-8000 (not consistent with event)
489// <-7000 (not consistent with board)
490// < 0 if no space left
491
492 struct timeval *tv, atv;
493 tv = &atv;
494 uint32_t tsec, tusec;
495 uint oldest;
496 int jold;
497
498 int i, k, jr, b, evFree;
499 int headmem = 0;
500 size_t needmem = 0;
501
502
503 b = sk / 7;
504
505 if (nRoi[0] < 0 || nRoi[0] > 1024) {
506 snprintf (str, MXSTR, "illegal nRoi[0]: %d", nRoi[0]);
507 factOut (kError, 999, str);
508 gj.badRoiR++;
509 gj.badRoi[b]++;
510 return -9999;
511 }
512
513 for (jr = 1; jr < 8; jr++) {
514 if (nRoi[jr] != nRoi[0]) {
515 snprintf (str, MXSTR, "wrong nRoi[%d]: %d %d", jr, nRoi[jr],
516 nRoi[0]);
517 factOut (kError, 711, str);
518 gj.badRoiB++;
519 gj.badRoi[b]++;
520 return -7101;
521 }
522 }
523 if (nRoi[8] < nRoi[0]) {
524 snprintf (str, MXSTR, "wrong nRoi_TM: %d %d", nRoi[8], nRoi[0]);
525 factOut (kError, 712, str);
526 gj.badRoiB++;
527 gj.badRoi[b]++;
528 return -7102;
529 }
530
531
532 i = evID % MAX_EVT;
533 evFree = -1;
534
535 for (k = 0; k < MAX_RUN; k++) {
536 if (mBuffer[i].evNum == evID && mBuffer[i].runNum == runID) { //event is already registered;
537 // is it ok ????
538 if (mBuffer[i].nRoi != nRoi[0]
539 || mBuffer[i].nRoiTM != nRoi[8]) {
540 snprintf (str, MXSTR, "illegal evt_roi %d %d ; %d %d",
541 nRoi[0], nRoi[8], mBuffer[i].nRoi, mBuffer[i].nRoiTM);
542 factOut (kError, 821, str);
543 gj.badRoiE++;
544 gj.badRoi[b]++;
545 return -8201;
546 }
547// count for inconsistencies
548
549 if (mBuffer[i].trgNum != trgNum)
550 mBuffer[i].Errors[0]++;
551 if (mBuffer[i].fadNum != fadNum)
552 mBuffer[i].Errors[1]++;
553 if (mBuffer[i].trgTyp != trgTyp)
554 mBuffer[i].Errors[2]++;
555
556 //everything seems fine so far ==> use this slot ....
557 return i;
558 }
559 if (evFree < 0 && mBuffer[i].evNum < 0)
560 evFree = i;
561 i += MAX_EVT;
562 }
563
564
565 //event does not yet exist; create it
566 if (evFree < 0) { //no space available in ctrl
567 snprintf (str, MXSTR, "no control slot to keep event %d", evID);
568 factOut (kError, 881, str);
569 return -1;
570 }
571 i = evFree; //found free entry; use it ...
572
573 gettimeofday (tv, NULL);
574 tsec = atv.tv_sec;
575 tusec = atv.tv_usec;
576
577 //check if runId already registered in runCtrl
578 evFree = -1;
579 oldest = g_actTime + 1000;
580 jold = -1;
581 for (k = 0; k < MAX_RUN; k++) {
582 if (runCtrl[k].runId == runID) {
583// if (runCtrl[k].procId > 0) { //run is closed -> reject
584// snprintf (str, MXSTR, "skip event since run %d finished", runID);
585// factOut (kInfo, 931, str);
586// return -21;
587// }
588
589 if (runCtrl[k].roi0 != nRoi[0]
590 || runCtrl[k].roi8 != nRoi[8]) {
591 snprintf (str, MXSTR, "illegal run_roi %d %d ; %d %d",
592 nRoi[0], nRoi[8], runCtrl[k].roi0, runCtrl[k].roi8);
593 factOut (kError, 931, str);
594 gj.badRoiR++;
595 gj.badRoi[b]++;
596 return -9301;
597 }
598 goto RUNFOUND;
599 } else if (evFree < 0 && runCtrl[k].fileId < 0) { //not yet used
600 evFree = k;
601 } else if (evFree < 0 && runCtrl[k].fileId > 0) { //already closed
602 if (runCtrl[k].closeTime < oldest) {
603 oldest = runCtrl[k].closeTime;
604 jold = k;
605 }
606 }
607 }
608
609 if (evFree < 0 && jold < 0) {
610 snprintf (str, MXSTR, "not able to register the new run %d", runID);
611 factOut (kFatal, 883, str);
612 return -1001;
613 } else {
614 if (evFree < 0)
615 evFree = jold;
616 snprintf (str, MXSTR, "register new run %d(%d) roi: %d %d", runID,
617 evFree, nRoi[0], nRoi[8]);
618 factOut (kInfo, 503, str);
619 runCtrl[evFree].runId = runID;
620 runCtrl[evFree].roi0 = nRoi[0];
621 runCtrl[evFree].roi8 = nRoi[8];
622 runCtrl[evFree].fileId = -2;
623 runCtrl[evFree].procId = -2;
624 runCtrl[evFree].lastEvt = -1;
625 runCtrl[evFree].nextEvt = 0;
626 runCtrl[evFree].actEvt = 0;
627 runCtrl[evFree].procEvt = 0;
628 runCtrl[evFree].maxEvt = 999999999; //max number events allowed
629 runCtrl[evFree].firstUsec = tusec;
630 runCtrl[evFree].firstTime = runCtrl[evFree].lastTime = tsec;
631 runCtrl[evFree].closeTime = tsec + 3600 * 24; //max time allowed
632// runCtrl[evFree].lastTime = 0;
633
634 runTail[evFree].nEventsOk =
635 runTail[evFree].nEventsRej =
636 runTail[evFree].nEventsBad =
637 runTail[evFree].PCtime0 = runTail[evFree].PCtimeX = 0;
638 }
639
640 RUNFOUND:
641 //ETIENNE
642/* needmem = sizeof (EVENT) + NPIX * nRoi[0] * 2 + NTMARK * nRoi[0] * 2; //
643
644 headmem = NBOARDS * sizeof (PEVNT_HEADER);
645
646 if (gj.usdMem + needmem + headmem + gi_maxSize > g_maxMem) {
647 gj.maxMem = gj.usdMem + needmem + headmem + gi_maxSize;
648 if (gi_memStat > 0) {
649 gi_memStat = -99;
650 snprintf (str, MXSTR, "no memory left to keep event %6d sock %3d",
651 evID, sk);
652 factOut (kError, 882, str);
653 } else {
654 snprintf (str, MXSTR, "no memory left to keep event %6d sock %3d",
655 evID, sk);
656 factOut (kDebug, 882, str);
657 }
658 return -11;
659 }
660*/
661 mBuffer[i].FADhead = ETI_Malloc(evID, i);
662 mBuffer[i].buffer = NULL;
663 if (mBuffer[i].FADhead != NULL)
664 mBuffer[i].fEvent = (EVENT*)&(((char*)(mBuffer[i].FADhead))[MAX_HEAD_MEM]);
665 else
666 {
667 mBuffer[i].fEvent = NULL;
668 gj.usdMem = 0;
669 for (k=0;k<numAllocatedChunks;k++)
670 gj.usdMem += EtiMemoryChunks[k].nSlots * MAX_SLOT_SIZE;
671 if (gj.usdMem > gj.maxMem)
672 gj.maxMem = gj.usdMem;
673 if (gi_memStat > 0) {
674 gi_memStat = -99;
675 snprintf (str, MXSTR, "no memory left to keep event %6d sock %3d",
676 evID, sk);
677 factOut (kError, 882, str);
678 } else {
679 snprintf (str, MXSTR, "no memory left to keep event %6d sock %3d",
680 evID, sk);
681 factOut (kDebug, 882, str);
682 }
683 return -11;
684 }
685 /*
686 mBuffer[i].FADhead = malloc (headmem);
687 if (mBuffer[i].FADhead == NULL) {
688 snprintf (str, MXSTR, "malloc header failed for event %d", evID);
689 factOut (kError, 882, str);
690 return -12;
691 }
692
693 mBuffer[i].fEvent = malloc (needmem);
694 if (mBuffer[i].fEvent == NULL) {
695 snprintf (str, MXSTR, "malloc data failed for event %d", evID);
696 factOut (kError, 882, str);
697 free (mBuffer[i].FADhead);
698 mBuffer[i].FADhead = NULL;
699 return -22;
700 }
701
702 mBuffer[i].buffer = malloc (gi_maxSize);
703 if (mBuffer[i].buffer == NULL) {
704 snprintf (str, MXSTR, "malloc buffer failed for event %d", evID);
705 factOut (kError, 882, str);
706 free (mBuffer[i].FADhead);
707 mBuffer[i].FADhead = NULL;
708 free (mBuffer[i].fEvent);
709 mBuffer[i].fEvent = NULL;
710 return -32;
711 }*/
712 //END ETIENNE
713 //flag all boards as unused
714 mBuffer[i].nBoard = 0;
715 for (k = 0; k < NBOARDS; k++) {
716 mBuffer[i].board[k] = -1;
717 }
718 //flag all pixels as unused
719 for (k = 0; k < NPIX; k++) {
720 mBuffer[i].fEvent->StartPix[k] = -1;
721 }
722 //flag all TMark as unused
723 for (k = 0; k < NTMARK; k++) {
724 mBuffer[i].fEvent->StartTM[k] = -1;
725 }
726
727 mBuffer[i].fEvent->NumBoards = 0;
728 mBuffer[i].fEvent->PCUsec = tusec;
729 mBuffer[i].fEvent->PCTime = mBuffer[i].pcTime = tsec;
730 mBuffer[i].nRoi = nRoi[0];
731 mBuffer[i].nRoiTM = nRoi[8];
732 mBuffer[i].evNum = evID;
733 mBuffer[i].runNum = runID;
734 mBuffer[i].fadNum = fadNum;
735 mBuffer[i].trgNum = trgNum;
736 mBuffer[i].trgTyp = trgTyp;
737 mBuffer[i].evtLen = needmem;
738 mBuffer[i].Errors[0] =
739 mBuffer[i].Errors[1] = mBuffer[i].Errors[2] = mBuffer[i].Errors[3] = 0;
740//ETIENNE
741 //gj.usdMem += needmem + headmem + gi_maxSize;
742 gj.usdMem = 0;
743 for (k=0;k<numAllocatedChunks;k++)
744 {
745 gj.usdMem += EtiMemoryChunks[k].nSlots * MAX_SLOT_SIZE;
746 }
747//END ETIENNE
748 if (gj.usdMem > gj.maxMem)
749 gj.maxMem = gj.usdMem;
750
751 gj.bufTot++;
752 if (gj.bufTot > gj.maxEvt)
753 gj.maxEvt = gj.bufTot;
754
755 gj.rateNew++;
756
757 //register event in 'active list (reading)'
758
759 evtCtrl.evtBuf[evtCtrl.lastPtr] = i;
760 evtCtrl.evtStat[evtCtrl.lastPtr] = 0;
761 evtCtrl.pcTime[evtCtrl.lastPtr] = g_actTime;
762 evtIdx[i] = evtCtrl.lastPtr;
763
764
765 snprintf (str, MXSTR,
766 "%5d %8d start new evt %8d %8d sock %3d len %5d t %10d", evID,
767 runID, i, evtCtrl.lastPtr, sk, fadlen, mBuffer[i].pcTime);
768 factOut (kDebug, -11, str);
769 evtCtrl.lastPtr++;
770 if (evtCtrl.lastPtr == MAX_EVT * MAX_RUN)
771 evtCtrl.lastPtr = 0;
772
773 gi.evtGet++;
774
775 return i;
776
777} /*-----------------------------------------------------------------*/
778
779
780
781
782int
783mBufFree (int i)
784{
785//delete entry [i] from mBuffer:
786//(and make sure multiple calls do no harm ....)
787
788 int headmem = 0;
789 int evid;
790 size_t freemem = 0;
791
792 evid = mBuffer[i].evNum;
793 freemem = mBuffer[i].evtLen;
794 //ETIENNE
795 ETI_Free(evid, i);
796// free (mBuffer[i].fEvent);
797 mBuffer[i].fEvent = NULL;
798
799// free (mBuffer[i].FADhead);
800 mBuffer[i].FADhead = NULL;
801
802// free (mBuffer[i].buffer);
803 mBuffer[i].buffer = NULL;
804//END ETIENNE
805 headmem = NBOARDS * sizeof (PEVNT_HEADER);
806 mBuffer[i].evNum = mBuffer[i].nRoi = -1;
807 mBuffer[i].runNum = 0;
808//ETIENNE
809// gj.usdMem = gj.usdMem - freemem - headmem - gi_maxSize;
810 gj.usdMem = 0;
811 int k;
812 for (k=0;k<numAllocatedChunks;k++)
813 {
814 gj.usdMem += EtiMemoryChunks[k].nSlots * MAX_SLOT_SIZE;
815 }
816//END ETIENNE
817 gj.bufTot--;
818
819 if (gi_memStat < 0) {
820 if (gj.usdMem <= 0.75 * gj.maxMem)
821 gi_memStat = +1;
822 }
823
824
825 return 0;
826
827} /*-----------------------------------------------------------------*/
828
829
830void
831resetEvtStat ()
832{
833 int i;
834
835 for (i = 0; i < MAX_SOCK; i++)
836 gi.numRead[i] = 0;
837
838 for (i = 0; i < NBOARDS; i++) {
839 gi.gotByte[i] = 0;
840 gi.gotErr[i] = 0;
841
842 }
843
844 gi.evtGet = 0; //#new Start of Events read
845 gi.evtTot = 0; //#complete Events read
846 gi.evtErr = 0; //#Events with Errors
847 gi.evtSkp = 0; //#Events incomplete (timeout)
848
849 gi.procTot = 0; //#Events processed
850 gi.procErr = 0; //#Events showed problem in processing
851 gi.procTrg = 0; //#Events accepted by SW trigger
852 gi.procSkp = 0; //#Events rejected by SW trigger
853
854 gi.feedTot = 0; //#Events used for feedBack system
855 gi.feedErr = 0; //#Events rejected by feedBack
856
857 gi.wrtTot = 0; //#Events written to disk
858 gi.wrtErr = 0; //#Events with write-error
859
860 gi.runOpen = 0; //#Runs opened
861 gi.runClose = 0; //#Runs closed
862 gi.runErr = 0; //#Runs with open/close errors
863
864 return;
865} /*-----------------------------------------------------------------*/
866
867
868
869void
870initReadFAD ()
871{
872 return;
873} /*-----------------------------------------------------------------*/
874
875
876
877void *
878readFAD (void *ptr)
879{
880/* *** main loop reading FAD data and sorting them to complete events */
881 int head_len, frst_len, numok, numok2, numokx, dest, evID, i, k;
882 int actBoards = 0, minLen;
883 int32_t jrd;
884 uint gi_SecTime; //time in seconds
885 int boardId, roi[9], drs, px, src, pixS, pixH, pixC, pixR, tmS;
886
887 int goodhed = 0;
888
889 int sockDef[NBOARDS]; //internal state of sockets
890 int jrdx;
891
892
893 struct timespec xwait;
894
895
896 struct timeval *tv, atv;
897 tv = &atv;
898 uint32_t tsec, tusec;
899
900
901 snprintf (str, MXSTR, "start initializing");
902 factOut (kInfo, -1, str);
903
904 int cpu = 7; //read thread
905 cpu_set_t mask;
906
907/* CPU_ZERO initializes all the bits in the mask to zero. */
908// CPU_ZERO (&mask);
909/* CPU_SET sets only the bit corresponding to cpu. */
910 cpu = 7;
911// CPU_SET (cpu, &mask);
912
913/* sched_setaffinity returns 0 in success */
914// if (sched_setaffinity (0, sizeof (mask), &mask) == -1) {
915// snprintf (str, MXSTR, "W ---> can not create affinity to %d", cpu);
916// factOut (kWarn, -1, str);
917// }
918
919
920 head_len = sizeof (PEVNT_HEADER);
921 frst_len = head_len; //max #bytes to read first: fad_header only, so each event must be longer, even for roi=0
922 minLen = head_len; //min #bytes needed to check header: full header for debug
923
924 start.S = 0xFB01;
925 stop.S = 0x04FE;
926
927/* initialize run control logics */
928 for (i = 0; i < MAX_RUN; i++) {
929 runCtrl[i].runId = 0;
930 runCtrl[i].fileId = -2;
931 runCtrl[i].procId = -2;
932 }
933 gi_resetS = gi_resetR = 9;
934 for (i = 0; i < NBOARDS; i++)
935 sockDef[i] = 0;
936
937 START:
938 gettimeofday (tv, NULL);
939 g_actTime = tsec = atv.tv_sec;
940 g_actUsec = tusec = atv.tv_usec;
941 gi_myRun = g_actTime;
942 evtCtrl.frstPtr = 0;
943 evtCtrl.lastPtr = 0;
944
945 gi_SecTime = g_actTime;
946 gi_runStat = g_runStat;
947 gj.readStat = g_runStat;
948 numok = numok2 = 0;
949
950 int cntsock = 8 - NUMSOCK ;
951
952 if (gi_resetS > 0) {
953 //make sure all sockets are preallocated as 'not exist'
954 for (i = 0; i < MAX_SOCK; i++) {
955 rd[i].socket = -1;
956 rd[i].sockStat = 99;
957 }
958
959 for (k = 0; k < NBOARDS; k++) {
960 gi_NumConnect[k] = 0;
961 gi.numConn[k] = 0;
962 gj.numConn[k] = 0;
963 gj.errConn[k] = 0;
964 gj.rateBytes[k] = 0;
965 gj.totBytes[k] = 0;
966 }
967
968 }
969
970
971 if (gi_resetR > 0) {
972 resetEvtStat ();
973 gj.bufTot = gj.maxEvt = gj.xxxEvt = 0;
974 gj.usdMem = gj.maxMem = gj.xxxMem = 0;
975 gj.totMem = g_maxMem;
976 gj.bufNew = gj.bufEvt = 0;
977 gj.badRoiE = gj.badRoiR = gj.badRoiB =
978 gj.evtSkip = gj.evtWrite = gj.evtErr = 0;
979
980 int b,p;
981 for (b = 0; b < NBOARDS; b++)
982 gj.badRoi[b] = 0;
983
984 mBufInit (); //initialize buffers
985
986 snprintf (str, MXSTR, "end initializing");
987 factOut (kInfo, -1, str);
988 }
989
990
991 gi_reset = gi_resetR = gi_resetS = gi_resetW = 0;
992
993 while (g_runStat >= 0 && g_reset == 0) { //loop until global variable g_runStat claims stop
994
995 gi_runStat = g_runStat;
996 gj.readStat = g_runStat;
997 gettimeofday (tv, NULL);
998 g_actTime = tsec = atv.tv_sec;
999 g_actUsec = tusec = atv.tv_usec;
1000
1001
1002 int b, p, p0, s0, nch;
1003 nch = 0;
1004 for (b = 0; b < NBOARDS; b++) {
1005 k = b * 7;
1006 if (g_port[b].sockDef != sockDef[b]) { //something has changed ...
1007 nch++;
1008 gi_NumConnect[b] = 0; //must close all connections
1009 gi.numConn[b] = 0;
1010 gj.numConn[b] = 0;
1011 if (sockDef[b] == 0)
1012 s0 = 0; //sockets to be defined and opened
1013 else if (g_port[b].sockDef == 0)
1014 s0 = -1; //sockets to be destroyed
1015 else
1016 s0 = +1; //sockets to be closed and reopened
1017
1018 if (s0 == 0)
1019 p0 = ntohs (g_port[b].sockAddr.sin_port);
1020 else
1021 p0 = 0;
1022
1023 for (p = p0 + 1; p < p0 + 8; p++) {
1024 GenSock (s0, k, p, &g_port[b].sockAddr, &rd[k]); //generate address and socket
1025 k++;
1026 }
1027 sockDef[b] = g_port[b].sockDef;
1028 }
1029 }
1030
1031 if (nch > 0) {
1032 actBoards = 0;
1033 for (b = 0; b < NBOARDS; b++) {
1034 if (sockDef[b] > 0)
1035 actBoards++;
1036 }
1037 }
1038
1039
1040 jrdx = 0;
1041 numokx = 0;
1042 numok = 0; //count number of succesfull actions
1043
1044 for (i = 0; i < MAX_SOCK; i++) { //check all sockets if something to read
1045 b = i / 7 ;
1046 p = i % 7 ;
1047
1048if ( p >= NUMSOCK) { ; }
1049else {
1050 if (sockDef[b] > 0)
1051 s0 = +1;
1052 else
1053 s0 = -1;
1054
1055 if (rd[i].sockStat < 0) { //try to connect if not yet done
1056 if (rd[i].sockStat == -1) {
1057 rd[i].sockStat = connect (rd[i].socket,
1058 (struct sockaddr *) &rd[i].SockAddr,
1059 sizeof (rd[i].SockAddr));
1060 if (rd[i].sockStat == -1) {
1061 rd[i].errCnt++ ;
1062// if (rd[i].errCnt < 100) rd[i].sockStat = rd[i].errCnt ;
1063// else if (rd[i].errCnt < 1000) rd[i].sockStat = 1000 ;
1064// else rd[i].sockStat = 10000 ;
1065 }
1066//printf("try to connect %d -> %d\n",i,rd[i].sockStat);
1067
1068 }
1069 if (rd[i].sockStat < -1 ) {
1070 rd[i].sockStat++ ;
1071 }
1072 if (rd[i].sockStat == 0) { //successfull ==>
1073 if (sockDef[b] > 0) {
1074 rd[i].bufTyp = 0; // expect a header
1075 rd[i].bufLen = frst_len; // max size to read at begining
1076 } else {
1077 rd[i].bufTyp = -1; // full data to be skipped
1078 rd[i].bufLen = MAX_LEN; //huge for skipping
1079 }
1080 rd[i].bufPos = 0; // no byte read so far
1081 rd[i].skip = 0; // start empty
1082// gi_NumConnect[b]++;
1083 gi_NumConnect[b] += cntsock ;
1084
1085 gi.numConn[b]++;
1086 gj.numConn[b]++;
1087 snprintf (str, MXSTR, "+++connect %d %d", b, gi.numConn[b]);
1088 factOut (kInfo, -1, str);
1089 }
1090 }
1091
1092 if (rd[i].sockStat == 0) { //we have a connection ==> try to read
1093 if (rd[i].bufLen > 0) { //might be nothing to read [buffer full]
1094 numok++;
1095 size_t maxread = rd[i].bufLen ;
1096 if (maxread > MAXREAD ) maxread=MAXREAD ;
1097
1098 jrd =
1099 recv (rd[i].socket, &rd[i].rBuf->B[rd[i].bufPos],
1100 maxread, MSG_DONTWAIT);
1101// rd[i].bufLen, MSG_DONTWAIT);
1102
1103 if (jrd > 0) {
1104 debugStream (i, &rd[i].rBuf->B[rd[i].bufPos], jrd);
1105#ifdef EVTDEBUG
1106 memcpy (&rd[i].xBuf->B[rd[i].bufPos],
1107 &rd[i].rBuf->B[rd[i].bufPos], jrd);
1108 snprintf (str, MXSTR,
1109 "read sock %3d bytes %5d len %5d first %d %d", i,
1110 jrd, rd[i].bufLen, rd[i].rBuf->B[rd[i].bufPos],
1111 rd[i].rBuf->B[rd[i].bufPos + 1]);
1112 factOut (kDebug, 301, str);
1113#endif
1114 }
1115
1116 if (jrd == 0) { //connection has closed ...
1117 snprintf (str, MXSTR, "Socket %d closed by FAD", i);
1118 factOut (kInfo, 441, str);
1119 GenSock (s0, i, 0, NULL, &rd[i]);
1120 gi.gotErr[b]++;
1121// gi_NumConnect[b]--;
1122 gi_NumConnect[b]-= cntsock ;
1123 gi.numConn[b]--;
1124 gj.numConn[b]--;
1125
1126 } else if (jrd < 0) { //did not read anything
1127 if (errno != EAGAIN && errno != EWOULDBLOCK) {
1128 snprintf (str, MXSTR, "Error Reading from %d | %m", i);
1129 factOut (kError, 442, str);
1130 gi.gotErr[b]++;
1131 } else
1132 numok--; //else nothing waiting to be read
1133 jrd = 0;
1134 }
1135 } else {
1136 jrd = 0; //did read nothing as requested
1137 snprintf (str, MXSTR, "do not read from socket %d %d", i,
1138 rd[i].bufLen);
1139 factOut (kDebug, 301, str);
1140 }
1141
1142 gi.gotByte[b] += jrd;
1143 gj.rateBytes[b] += jrd;
1144
1145 if (jrd > 0) {
1146 numokx++;
1147 jrdx += jrd;
1148 }
1149
1150
1151 if (rd[i].bufTyp < 0) { // we are skipping this board ...
1152// just do nothing
1153#ifdef EVTDEBUG
1154 snprintf (str, MXSTR, "skipping %d bytes on socket %d", jrd,
1155 i);
1156 factOut (kInfo, 301, str);
1157#endif
1158
1159 } else if (rd[i].bufTyp > 0) { // we are reading data ...
1160 if (jrd < rd[i].bufLen) { //not yet all read
1161 rd[i].bufPos += jrd; //==> prepare for continuation
1162 rd[i].bufLen -= jrd;
1163 debugRead (i, jrd, rd[i].evtID, rd[i].ftmID, rd[i].runID, 0, tsec, tusec); // i=socket; jrd=#bytes; ievt=eventid; 0=reading data
1164 } else { //full dataset read
1165 rd[i].bufLen = 0;
1166 rd[i].bufPos = rd[i].fadLen;
1167 if (rd[i].rBuf->B[rd[i].bufPos - 1] != stop.B[0]
1168 || rd[i].rBuf->B[rd[i].bufPos - 2] != stop.B[1]) {
1169 gi.evtErr++;
1170 snprintf (str, MXSTR,
1171 "wrong end of buffer found sock %3d ev %4d len %5d %3d %3d - %3d %3d ",
1172 i, rd[i].fadLen, rd[i].evtID, rd[i].rBuf->B[0],
1173 rd[i].rBuf->B[1],
1174 rd[i].rBuf->B[rd[i].bufPos - 2],
1175 rd[i].rBuf->B[rd[i].bufPos - 1]);
1176 factOut (kError, 301, str);
1177 goto EndBuf;
1178
1179#ifdef EVTDEBUG
1180 } else {
1181 snprintf (str, MXSTR,
1182 "good end of buffer found sock %3d len %5d %d %d : %d %d - %d %d : %d %d",
1183 i, rd[i].fadLen, rd[i].rBuf->B[0],
1184 rd[i].rBuf->B[1], start.B[1], start.B[0],
1185 rd[i].rBuf->B[rd[i].bufPos - 2],
1186 rd[i].rBuf->B[rd[i].bufPos - 1], stop.B[1],
1187 stop.B[0]);
1188 factOut (kDebug, 301, str);
1189#endif
1190 }
1191
1192 if (jrd > 0)
1193 debugRead (i, jrd, rd[i].evtID, rd[i].ftmID, rd[i].runID, 1, tsec, tusec); // i=socket; jrd=#bytes; ievt=eventid; 1=finished event
1194
1195 //we have a complete buffer, copy to WORK area
1196 int jr;
1197 roi[0] = ntohs (rd[i].rBuf->S[head_len / 2 + 2]);
1198 for (jr = 0; jr < 9; jr++) {
1199 roi[jr] =
1200 ntohs (rd[i].
1201 rBuf->S[head_len / 2 + 2 + jr * (roi[0] + 4)]);
1202 }
1203 //get index into mBuffer for this event (create if needed)
1204
1205 int actid;
1206 if (g_useFTM > 0)
1207 actid = rd[i].evtID;
1208 else
1209 actid = rd[i].ftmID;
1210
1211 evID = mBufEvt (rd[i].evtID, rd[i].runID, roi, i,
1212 rd[i].fadLen, rd[i].ftmTyp, rd[i].ftmID,
1213 rd[i].evtID);
1214
1215 if (evID < -1000) {
1216 goto EndBuf; //not usable board/event/run --> skip it
1217 }
1218 if (evID < 0) { //no space left, retry later
1219#ifdef EVTDEBUG
1220 if (rd[i].bufLen != 0) {
1221 snprintf (str, MXSTR, "something screwed up");
1222 factOut (kFatal, 1, str);
1223 }
1224#endif
1225 xwait.tv_sec = 0;
1226 xwait.tv_nsec = 10000000; // sleep for ~10 msec
1227 nanosleep (&xwait, NULL);
1228 goto EndBuf1; //hope there is free space next round
1229 }
1230 //we have a valid entry in mBuffer[]; fill it
1231
1232#ifdef EVTDEBUG
1233 int xchk = memcmp (&rd[i].xBuf->B[0], &rd[i].rBuf->B[0],
1234 rd[i].fadLen);
1235 if (xchk != 0) {
1236 snprintf (str, MXSTR, "ERROR OVERWRITE %d %d on port %d",
1237 xchk, rd[i].fadLen, i);
1238 factOut (kFatal, 1, str);
1239
1240 uint iq;
1241 for (iq = 0; iq < rd[i].fadLen; iq++) {
1242 if (rd[i].rBuf->B[iq] != rd[i].xBuf->B[iq]) {
1243 snprintf (str, MXSTR, "ERROR %4d %4d %x %x", i, iq,
1244 rd[i].rBuf->B[iq], rd[i].xBuf->B[iq]);
1245 factOut (kFatal, 1, str);
1246 }
1247 }
1248 }
1249#endif
1250 int qncpy = 0;
1251 boardId = b;
1252 int fadBoard = ntohs (rd[i].rBuf->S[12]);
1253 int fadCrate = fadBoard / 256;
1254 if (boardId != (fadCrate * 10 + fadBoard % 256)) {
1255 snprintf (str, MXSTR, "wrong Board ID %d %d %d",
1256 fadCrate, fadBoard % 256, boardId);
1257 factOut (kWarn, 301, str);
1258 }
1259 if (mBuffer[evID].board[boardId] != -1) {
1260 snprintf (str, MXSTR,
1261 "double board: ev %5d, b %3d, %3d; len %5d %3d %3d - %3d %3d ",
1262 evID, boardId, i, rd[i].fadLen,
1263 rd[i].rBuf->B[0], rd[i].rBuf->B[1],
1264 rd[i].rBuf->B[rd[i].bufPos - 2],
1265 rd[i].rBuf->B[rd[i].bufPos - 1]);
1266 factOut (kWarn, 501, str);
1267 goto EndBuf; //--> skip Board
1268 }
1269
1270 int iDx = evtIdx[evID]; //index into evtCtrl
1271
1272 memcpy (&mBuffer[evID].FADhead[boardId].start_package_flag,
1273 &rd[i].rBuf->S[0], head_len);
1274 qncpy += head_len;
1275
1276 src = head_len / 2;
1277 for (px = 0; px < 9; px++) { //different sort in FAD board.....
1278 for (drs = 0; drs < 4; drs++) {
1279 pixH = ntohs (rd[i].rBuf->S[src++]); // ID
1280 pixC = ntohs (rd[i].rBuf->S[src++]); // start-cell
1281 pixR = ntohs (rd[i].rBuf->S[src++]); // roi
1282//here we should check if pixH is correct ....
1283
1284 pixS = boardId * 36 + drs * 9 + px;
1285 src++;
1286
1287
1288 mBuffer[evID].fEvent->StartPix[pixS] = pixC;
1289 dest = pixS * roi[0];
1290 memcpy (&mBuffer[evID].fEvent->Adc_Data[dest],
1291 &rd[i].rBuf->S[src], roi[0] * 2);
1292 qncpy += roi[0] * 2;
1293 src += pixR;
1294
1295 if (px == 8) {
1296 tmS = boardId * 4 + drs;
1297 if (pixR > roi[0]) { //and we have additional TM info
1298 dest = tmS * roi[0] + NPIX * roi[0];
1299 int srcT = src - roi[0];
1300 mBuffer[evID].fEvent->StartTM[tmS] =
1301 (pixC + pixR - roi[0]) % 1024;
1302 memcpy (&mBuffer[evID].fEvent->Adc_Data[dest],
1303 &rd[i].rBuf->S[srcT], roi[0] * 2);
1304 qncpy += roi[0] * 2;
1305 } else {
1306 mBuffer[evID].fEvent->StartTM[tmS] = -1;
1307 }
1308 }
1309 }
1310 } // now we have stored a new board contents into Event structure
1311
1312 mBuffer[evID].fEvent->NumBoards++;
1313 mBuffer[evID].board[boardId] = boardId;
1314 evtCtrl.evtStat[iDx]++;
1315 evtCtrl.pcTime[iDx] = g_actTime;
1316
1317 if (++mBuffer[evID].nBoard >= actBoards) {
1318 int qnrun = 0;
1319 if (mBuffer[evID].runNum != actrun) { // have we already reported first event of this run ???
1320 actrun = mBuffer[evID].runNum;
1321 int ir;
1322 for (ir = 0; ir < MAX_RUN; ir++) {
1323 qnrun++;
1324 if (runCtrl[ir].runId == actrun) {
1325 if (++runCtrl[ir].lastEvt == 0) {
1326 gotNewRun (actrun, mBuffer[evID].FADhead);
1327 snprintf (str, MXSTR, "gotNewRun %d (ev %d)",
1328 mBuffer[evID].runNum,
1329 mBuffer[evID].evNum);
1330 factOut (kInfo, 1, str);
1331 break;
1332 }
1333 }
1334 }
1335 }
1336 snprintf (str, MXSTR,
1337 "%5d complete event roi %4d roiTM %d cpy %8d %5d",
1338 mBuffer[evID].evNum, roi[0], roi[8] - roi[0],
1339 qncpy, qnrun);
1340 factOut (kDebug, -1, str);
1341
1342 //complete event read ---> flag for next processing
1343 evtCtrl.evtStat[iDx] = 99;
1344 gi.evtTot++;
1345 }
1346
1347 EndBuf:
1348 rd[i].bufTyp = 0; //ready to read next header
1349 rd[i].bufLen = frst_len;
1350 rd[i].bufPos = 0;
1351 EndBuf1:
1352 ;
1353 }
1354
1355 } else { //we are reading event header
1356 rd[i].bufPos += jrd;
1357 rd[i].bufLen -= jrd;
1358 if (rd[i].bufPos >= minLen) { //sufficient data to take action
1359 //check if startflag correct; else shift block ....
1360 for (k = 0; k < rd[i].bufPos - 1; k++) {
1361 if (rd[i].rBuf->B[k] == start.B[1]
1362 && rd[i].rBuf->B[k + 1] == start.B[0])
1363 break;
1364 }
1365 rd[i].skip += k;
1366
1367 if (k >= rd[i].bufPos - 1) { //no start of header found
1368 rd[i].bufPos = 0;
1369 rd[i].bufLen = head_len;
1370 } else if (k > 0) {
1371 rd[i].bufPos -= k;
1372 rd[i].bufLen += k;
1373 memcpy (&rd[i].rBuf->B[0], &rd[i].rBuf->B[k],
1374 rd[i].bufPos);
1375#ifdef EVTDEBUG
1376 memcpy (&rd[i].xBuf->B[0], &rd[i].xBuf->B[k],
1377 rd[i].bufPos);
1378#endif
1379 }
1380 if (rd[i].bufPos >= minLen) {
1381 if (rd[i].skip > 0) {
1382 snprintf (str, MXSTR, "skipped %d bytes on port%d",
1383 rd[i].skip, i);
1384 factOut (kInfo, 666, str);
1385 rd[i].skip = 0;
1386 }
1387 goodhed++;
1388 rd[i].fadLen = ntohs (rd[i].rBuf->S[1]) * 2;
1389 rd[i].fadVers = ntohs (rd[i].rBuf->S[2]);
1390 rd[i].ftmTyp = ntohs (rd[i].rBuf->S[5]);
1391 rd[i].ftmID = ntohl (rd[i].rBuf->I[3]); //(FTMevt)
1392 rd[i].evtID = ntohl (rd[i].rBuf->I[4]); //(FADevt)
1393 rd[i].runID = ntohl (rd[i].rBuf->I[11]);
1394 rd[i].bufTyp = 1; //ready to read full record
1395 rd[i].bufLen = rd[i].fadLen - rd[i].bufPos;
1396
1397 int fadboard = ntohs (rd[i].rBuf->S[12]);
1398 int fadcrate = fadboard / 256;
1399 fadboard = (fadcrate * 10 + fadboard % 256);
1400#ifdef EVTDEBUG
1401 snprintf (str, MXSTR,
1402 "sk %3d head: %5d %5d %5d %10d %4d %6d", i,
1403 rd[i].fadLen, rd[i].evtID, rd[i].ftmID,
1404 rd[i].runID, fadboard, jrd);
1405 factOut (kDebug, 1, str);
1406#endif
1407
1408 if (rd[i].runID == 0)
1409 rd[i].runID = gi_myRun;
1410
1411 if (rd[i].bufLen <= head_len || rd[i].bufLen > MAX_LEN) {
1412 snprintf (str, MXSTR,
1413 "illegal event-length on port %d", i);
1414 factOut (kFatal, 881, str);
1415 rd[i].bufLen = 100000; //?
1416 }
1417 int fadBoard = ntohs (rd[i].rBuf->S[12]);
1418 debugHead (i, fadBoard, rd[i].rBuf);
1419 debugRead (i, jrd, rd[i].evtID, rd[i].ftmID, rd[i].runID, -1, tsec, tusec); // i=socket; jrd=#bytes; ievt=eventid;-1=start event
1420 } else {
1421 debugRead (i, jrd, 0, 0, 0, -2, tsec, tusec); // i=socket; jrd=#bytes; ievt=eventid; -2=start event, unknown id yet
1422 }
1423 } else {
1424 debugRead (i, jrd, 0, 0, 0, -2, tsec, tusec); // i=socket; jrd=#bytes; ievt=eventid; -2=start event, unknown id yet
1425 }
1426
1427 } //end interpreting last read
1428}
1429 } //end of successful read anything
1430 } //finished trying to read all sockets
1431
1432#ifdef EVTDEBUG
1433 snprintf (str, MXSTR, "Loop ---- %3d --- %8d", numokx, jrdx);
1434 factOut (kDebug, -1, str);
1435#endif
1436
1437 gi.numRead[numok]++;
1438
1439 g_actTime = time (NULL);
1440 if (g_actTime > gi_SecTime) {
1441 gi_SecTime = g_actTime;
1442
1443
1444 //loop over all active events and flag those older than read-timeout
1445 //delete those that are written to disk ....
1446
1447 int kd = evtCtrl.lastPtr - evtCtrl.frstPtr;
1448 if (kd < 0)
1449 kd += (MAX_EVT * MAX_RUN);
1450
1451 gj.bufNew = gj.bufEvt = 0;
1452 int k1 = evtCtrl.frstPtr;
1453 for (k = k1; k < (k1 + kd); k++) {
1454 int k0 = k % (MAX_EVT * MAX_RUN);
1455//would be better to use bitmaps for evtStat (allow '&' instead of multi-if)
1456
1457 if (evtCtrl.evtStat[k0] > 0 && evtCtrl.evtStat[k0] < 92) {
1458 gj.bufNew++; //incomplete event in Buffer
1459 if (evtCtrl.evtStat[k0] < 90
1460 && evtCtrl.pcTime[k0] < g_actTime - 10) {
1461 int id = evtCtrl.evtBuf[k0];
1462 snprintf (str, MXSTR, "%5d skip short evt %8d %8d %2d",
1463 mBuffer[id].evNum, evtCtrl.evtBuf[k0], k0,
1464 evtCtrl.evtStat[k0]);
1465 factOut (kWarn, 601, str);
1466
1467 int ik,ib,jb;
1468 ik=0;
1469 for (ib=0; ib<NBOARDS; ib++) {
1470 if (ib%10==0) {
1471 snprintf (&str[ik], MXSTR, "'");
1472 ik++;
1473 }
1474 jb = mBuffer[id].board[ib];
1475 if ( jb<0 ) {
1476 if (gi_NumConnect[b] >0 ) {
1477 snprintf (&str[ik], MXSTR, ".");
1478 } else {
1479 snprintf (&str[ik], MXSTR, "x");
1480 }
1481 } else {
1482 snprintf (&str[ik], MXSTR, "%d",jb%10);
1483 }
1484 ik++;
1485 }
1486 snprintf (&str[ik], MXSTR, "'");
1487 factOut (kWarn, 601, str);
1488
1489 evtCtrl.evtStat[k0] = 91; //timeout for incomplete events
1490 gi.evtSkp++;
1491 gi.evtTot++;
1492 gj.evtSkip++;
1493 }
1494 } else if (evtCtrl.evtStat[k0] >= 9000 //'delete'
1495 || evtCtrl.evtStat[k0] == 0) { //'useless'
1496
1497 int id = evtCtrl.evtBuf[k0];
1498 snprintf (str, MXSTR, "%5d free event buffer, nb=%3d",
1499 mBuffer[id].evNum, mBuffer[id].nBoard);
1500 factOut (kDebug, -1, str);
1501 mBufFree (id); //event written--> free memory
1502 evtCtrl.evtStat[k0] = -1;
1503 gj.evtWrite++;
1504 gj.rateWrite++;
1505 } else if (evtCtrl.evtStat[k0] >= 95) {
1506 gj.bufEvt++; //complete event in Buffer
1507 }
1508
1509 if (k0 == evtCtrl.frstPtr && evtCtrl.evtStat[k0] < 0) {
1510 evtCtrl.frstPtr = (evtCtrl.frstPtr + 1) % (MAX_EVT * MAX_RUN);
1511 }
1512 }
1513
1514
1515 gj.deltaT = 1000; //temporary, must be improved
1516
1517 int b;
1518 for (b = 0; b < NBOARDS; b++)
1519 gj.totBytes[b] += gj.rateBytes[b];
1520 gj.totMem = g_maxMem;
1521 if (gj.maxMem > gj.xxxMem)
1522 gj.xxxMem = gj.maxMem;
1523 if (gj.maxEvt > gj.xxxEvt)
1524 gj.xxxEvt = gj.maxEvt;
1525
1526 factStat (gj);
1527 factStatNew (gi);
1528 gj.rateNew = gj.rateWrite = 0;
1529 gj.maxMem = gj.usdMem;
1530 gj.maxEvt = gj.bufTot;
1531 for (b = 0; b < NBOARDS; b++)
1532 gj.rateBytes[b] = 0;
1533 }
1534
1535 if (numok > 0)
1536 numok2 = 0;
1537 else if (numok2++ > 3) {
1538 if (g_runStat == 1) {
1539 xwait.tv_sec = 1;
1540 xwait.tv_nsec = 0; // hibernate for 1 sec
1541 } else {
1542 xwait.tv_sec = 0;
1543 xwait.tv_nsec = 2000000; // sleep for ~2 msec
1544 }
1545 nanosleep (&xwait, NULL);
1546 }
1547
1548 } //and do next loop over all sockets ...
1549
1550
1551 snprintf (str, MXSTR, "stop reading ... RESET=%d", g_reset);
1552 factOut (kInfo, -1, str);
1553
1554 if (g_reset > 0) {
1555 gi_reset = g_reset;
1556 gi_resetR = gi_reset % 10; //shall we stop reading ?
1557 gi_resetS = (gi_reset / 10) % 10; //shall we close sockets ?
1558 gi_resetW = (gi_reset / 100) % 10; //shall we close files ?
1559 gi_resetX = gi_reset / 1000; //shall we simply wait resetX seconds ?
1560 g_reset = 0;
1561 } else {
1562 gi_reset = 0;
1563 if (g_runStat == -1)
1564 gi_resetR = 1;
1565 else
1566 gi_resetR = 7;
1567 gi_resetS = 7; //close all sockets
1568 gi_resetW = 7; //close all files
1569 gi_resetX = 0;
1570
1571 //inform others we have to quit ....
1572 gi_runStat = -11; //inform all that no update to happen any more
1573 gj.readStat = -11; //inform all that no update to happen any more
1574 }
1575
1576 if (gi_resetS > 0) {
1577 //must close all open sockets ...
1578 snprintf (str, MXSTR, "close all sockets ...");
1579 factOut (kInfo, -1, str);
1580 for (i = 0; i < MAX_SOCK; i++) {
1581 if (rd[i].sockStat == 0) {
1582 GenSock (-1, i, 0, NULL, &rd[i]); //close and destroy open socket
1583 if (i % 7 == 0) {
1584// gi_NumConnect[i / 7]--;
1585 gi_NumConnect[i / 7]-= cntsock ;
1586 gi.numConn[i / 7]--;
1587 gj.numConn[i / 7]--;
1588 sockDef[i / 7] = 0; //flag ro recreate the sockets ...
1589 rd[i / 7].sockStat = -1; //and try to open asap
1590 }
1591 }
1592 }
1593 }
1594
1595
1596 if (gi_resetR > 0) {
1597 //flag all events as 'read finished'
1598 int kd = evtCtrl.lastPtr - evtCtrl.frstPtr;
1599 if (kd < 0)
1600 kd += (MAX_EVT * MAX_RUN);
1601
1602 int k1 = evtCtrl.frstPtr;
1603 for (k = k1; k < (k1 + kd); k++) {
1604 int k0 = k % (MAX_EVT * MAX_RUN);
1605 if (evtCtrl.evtStat[k0] > 0 && evtCtrl.evtStat[k0] < 90) {
1606 evtCtrl.evtStat[k0] = 91;
1607 gi.evtSkp++;
1608 gi.evtTot++;
1609 }
1610 }
1611
1612 xwait.tv_sec = 0;
1613 xwait.tv_nsec = 2000000; // sleep for ~2 msec
1614 nanosleep (&xwait, NULL);
1615
1616 //and clear all buffers (might have to wait until all others are done)
1617 int minclear;
1618 if (gi_resetR == 1) {
1619 minclear = 900;
1620 snprintf (str, MXSTR, "drain all buffers ...");
1621 } else {
1622 minclear = 0;
1623 snprintf (str, MXSTR, "flush all buffers ...");
1624 }
1625 factOut (kInfo, -1, str);
1626
1627 int numclear = 1;
1628 while (numclear > 0) {
1629 numclear = 0;
1630 int kd = evtCtrl.lastPtr - evtCtrl.frstPtr;
1631 if (kd < 0)
1632 kd += (MAX_EVT * MAX_RUN);
1633
1634 int k1 = evtCtrl.frstPtr;
1635 for (k = k1; k < (k1 + kd); k++) {
1636 int k0 = k % (MAX_EVT * MAX_RUN);
1637 if (evtCtrl.evtStat[k0] > minclear) {
1638 int id = evtCtrl.evtBuf[k0];
1639 snprintf (str, MXSTR, "ev %5d free event buffer, nb=%3d",
1640 mBuffer[id].evNum, mBuffer[id].nBoard);
1641 factOut (kDebug, -1, str);
1642 mBufFree (id); //event written--> free memory
1643 evtCtrl.evtStat[k0] = -1;
1644 } else if (evtCtrl.evtStat[k0] > 0)
1645 numclear++; //writing is still ongoing...
1646
1647 if (k0 == evtCtrl.frstPtr && evtCtrl.evtStat[k0] < 0)
1648 evtCtrl.frstPtr = (evtCtrl.frstPtr + 1) % (MAX_EVT * MAX_RUN);
1649 }
1650
1651 xwait.tv_sec = 0;
1652 xwait.tv_nsec = 2000000; // sleep for ~2 msec
1653 nanosleep (&xwait, NULL);
1654 }
1655 }
1656
1657 if (gi_reset > 0) {
1658 if (gi_resetW > 0) {
1659 CloseRunFile (0, 0, 0); //ask all Runs to be closed
1660 }
1661 if (gi_resetX > 0) {
1662 xwait.tv_sec = gi_resetX;
1663 xwait.tv_nsec = 0;
1664 nanosleep (&xwait, NULL);
1665 }
1666
1667 snprintf (str, MXSTR, "Continue read Process ...");
1668 factOut (kInfo, -1, str);
1669 gi_reset = 0;
1670 goto START;
1671 }
1672
1673
1674
1675 snprintf (str, MXSTR, "Exit read Process ...");
1676 factOut (kInfo, -1, str);
1677 gi_runStat = -99;
1678 gj.readStat = -99;
1679 factStat (gj);
1680 factStatNew (gi);
1681 return 0;
1682
1683} /*-----------------------------------------------------------------*/
1684
1685
1686void *
1687subProc (void *thrid)
1688{
1689 int threadID, status, numWait, numProc, kd, k1, k0, k, jret;
1690 struct timespec xwait;
1691
1692 int32_t cntr ;
1693
1694 threadID = (int) thrid;
1695
1696 snprintf (str, MXSTR, "Starting sub-process-thread %d", threadID);
1697 factOut (kInfo, -1, str);
1698
1699 while (g_runStat > -2) { //in case of 'exit' we still must process pending events
1700 numWait = numProc = 0;
1701 int kd = evtCtrl.lastPtr - evtCtrl.frstPtr;
1702 if (kd < 0)
1703 kd += (MAX_EVT * MAX_RUN);
1704
1705 int k1 = evtCtrl.frstPtr;
1706 for (k = k1; k < (k1 + kd); k++) {
1707 int k0 = k % (MAX_EVT * MAX_RUN);
1708
1709 if (evtCtrl.evtStat[k0] == 1000 + threadID) {
1710 if (gi_resetR > 1) { //we are asked to flush buffers asap
1711 jret = 9100; //flag to be deleted
1712 } else {
1713 int id = evtCtrl.evtBuf[k0];
1714
1715
1716 jret =
1717 subProcEvt (threadID, mBuffer[id].FADhead,
1718 mBuffer[id].fEvent, mBuffer[id].buffer);
1719
1720
1721 if (jret <= threadID) {
1722 snprintf (str, MXSTR,
1723 "process %d wants to send to process %d",
1724 threadID, jret);
1725 factOut (kError, -1, str);
1726 jret = 5300;
1727 } else if (jret <= 0)
1728 jret = 9200 + threadID; //flag as 'to be deleted'
1729 else if (jret >= gi_maxProc)
1730 jret = 5200 + threadID; //flag as 'to be written'
1731 else
1732 jret = 1000 + jret; //flag for next proces
1733 }
1734 evtCtrl.evtStat[k0] = jret;
1735 numProc++;
1736 } else if (evtCtrl.evtStat[k0] < 1000 + threadID)
1737 numWait++;
1738 }
1739
1740 if (gj.readStat < -10 && numWait == 0) { //nothing left to do
1741 snprintf (str, MXSTR, "Exit subProcessing Process %d", threadID);
1742 factOut (kInfo, -1, str);
1743 return 0;
1744 }
1745 if (numProc == 0) {
1746 //seems we have nothing to do, so sleep a little
1747 xwait.tv_sec = 0;
1748 xwait.tv_nsec = 2000000; // sleep for ~2 msec
1749 nanosleep (&xwait, NULL);
1750 }
1751 }
1752
1753 snprintf (str, MXSTR, "Ending sub-process-thread %d", threadID);
1754 factOut (kInfo, -1, str);
1755 return;
1756} /*-----------------------------------------------------------------*/
1757
1758
1759void *
1760procEvt (void *ptr)
1761{
1762/* *** main loop processing file, including SW-trigger */
1763 int numProc, numWait;
1764 int k, status, j;
1765 struct timespec xwait;
1766 char str[MXSTR];
1767
1768
1769
1770 int lastRun = 0; //usually run from last event still valid
1771
1772 cpu_set_t mask;
1773 int cpu = 1; //process thread (will be several in final version)
1774
1775 snprintf (str, MXSTR, "Starting process-thread with %d subprocess",
1776 gi_maxProc);
1777 factOut (kInfo, -1, str);
1778
1779/* CPU_ZERO initializes all the bits in the mask to zero. */
1780// CPU_ZERO (&mask);
1781/* CPU_SET sets only the bit corresponding to cpu. */
1782// CPU_SET( 0 , &mask ); leave for system
1783// CPU_SET( 1 , &mask ); used by write process
1784// CPU_SET (2, &mask);
1785// CPU_SET (3, &mask);
1786// CPU_SET (4, &mask);
1787// CPU_SET (5, &mask);
1788// CPU_SET (6, &mask);
1789// CPU_SET( 7 , &mask ); used by read process
1790/* sched_setaffinity returns 0 in success */
1791// if (sched_setaffinity (0, sizeof (mask), &mask) == -1) {
1792// snprintf (str, MXSTR, "P ---> can not create affinity to %d", cpu);
1793// factOut (kWarn, -1, str);
1794// }
1795
1796
1797 pthread_t thread[100];
1798 int th_ret[100];
1799
1800 for (k = 0; k < gi_maxProc; k++) {
1801 th_ret[k] = pthread_create (&thread[k], NULL, subProc, (void *) k);
1802 }
1803
1804 while (g_runStat > -2) { //in case of 'exit' we still must process pending events
1805
1806 numWait = numProc = 0;
1807 int kd = evtCtrl.lastPtr - evtCtrl.frstPtr;
1808 if (kd < 0)
1809 kd += (MAX_EVT * MAX_RUN);
1810
1811 int k1 = evtCtrl.frstPtr;
1812 for (k = k1; k < (k1 + kd); k++) {
1813 int k0 = k % (MAX_EVT * MAX_RUN);
1814//would be better to use bitmaps for evtStat (allow '&' instead of multi-if)
1815 if (evtCtrl.evtStat[k0] > 90 && evtCtrl.evtStat[k0] < 1000) {
1816
1817 if (gi_resetR > 1) { //we are asked to flush buffers asap
1818 evtCtrl.evtStat[k0] = 9991;
1819 } else {
1820
1821//-------- it is better to open the run already here, so call can be used to initialize
1822//-------- buffers etc. needed to interprete run (e.g. DRS calibration)
1823 int id = evtCtrl.evtBuf[k0];
1824 uint32_t irun = mBuffer[id].runNum;
1825 int32_t ievt = mBuffer[id].evNum;
1826 if (runCtrl[lastRun].runId == irun) {
1827 j = lastRun;
1828 } else {
1829 //check which fileID to use (or open if needed)
1830 for (j = 0; j < MAX_RUN; j++) {
1831 if (runCtrl[j].runId == irun)
1832 break;
1833 }
1834 if (j >= MAX_RUN) {
1835 snprintf (str, MXSTR,
1836 "P error: can not find run %d for event %d in %d",
1837 irun, ievt, id);
1838 factOut (kFatal, 901, str);
1839 }
1840 lastRun = j;
1841 }
1842
1843 if (runCtrl[j].fileId < 0) {
1844//---- we need to open a new run ==> make sure all older runs are
1845//---- finished and marked to be closed ....
1846 int j1;
1847 for (j1 = 0; j1 < MAX_RUN; j1++) {
1848 if (runCtrl[j1].fileId == 0) {
1849 runCtrl[j1].procId = 2; //--> do no longer accept events for processing
1850//---- problem: processing still going on ==> must wait for closing ....
1851 snprintf (str, MXSTR,
1852 "P finish run since new one opened %d",
1853 runCtrl[j1].runId);
1854 runFinish1 (runCtrl[j1].runId);
1855 }
1856
1857 }
1858
1859 actRun.Version = 1;
1860 actRun.RunType = -1; //to be adapted
1861
1862 actRun.Nroi = runCtrl[j].roi0;
1863 actRun.NroiTM = runCtrl[j].roi8;
1864 if (actRun.Nroi == actRun.NroiTM)
1865 actRun.NroiTM = 0;
1866 actRun.RunTime = runCtrl[j].firstTime;
1867 actRun.RunUsec = runCtrl[j].firstTime;
1868 actRun.NBoard = NBOARDS;
1869 actRun.NPix = NPIX;
1870 actRun.NTm = NTMARK;
1871 actRun.Nroi = mBuffer[id].nRoi;
1872 memcpy (actRun.FADhead, mBuffer[id].FADhead,
1873 NBOARDS * sizeof (PEVNT_HEADER));
1874
1875 runCtrl[j].fileHd =
1876 runOpen (irun, &actRun, sizeof (actRun));
1877 if (runCtrl[j].fileHd == NULL) {
1878 snprintf (str, MXSTR,
1879 "P could not open a file for run %d", irun);
1880 factOut (kError, 502, str);
1881 runCtrl[j].fileId = 91;
1882 runCtrl[j].procId = 91;
1883 } else {
1884 snprintf (str, MXSTR, "P opened new run_file %d evt %d",
1885 irun, ievt);
1886 factOut (kInfo, -1, str);
1887 runCtrl[j].fileId = 0;
1888 runCtrl[j].procId = 0;
1889 }
1890
1891 }
1892//-------- also check if run shall be closed (==> skip event, but do not close the file !!! )
1893 if (runCtrl[j].procId == 0) {
1894 if (runCtrl[j].closeTime < g_actTime
1895 || runCtrl[j].lastTime < g_actTime - 300
1896 || runCtrl[j].maxEvt <= runCtrl[j].procEvt) {
1897 snprintf (str, MXSTR,
1898 "P reached end of run condition for run %d",
1899 irun);
1900 factOut (kInfo, 502, str);
1901 runFinish1 (runCtrl[j].runId);
1902 runCtrl[j].procId = 1;
1903 }
1904 }
1905 if (runCtrl[j].procId != 0) {
1906 snprintf (str, MXSTR,
1907 "P skip event %d because no active run %d", ievt,
1908 irun);
1909 factOut (kDebug, 502, str);
1910 evtCtrl.evtStat[k0] = 9091;
1911 } else {
1912//--------
1913//--------
1914 id = evtCtrl.evtBuf[k0];
1915 int itevt = mBuffer[id].trgNum;
1916 int itrg = mBuffer[id].trgTyp;
1917 int roi = mBuffer[id].nRoi;
1918 int roiTM = mBuffer[id].nRoiTM;
1919
1920//make sure unused pixels/tmarks are cleared to zero
1921 if (roiTM == roi)
1922 roiTM = 0;
1923 int ip, it, dest, ib;
1924 for (ip = 0; ip < NPIX; ip++) {
1925 if (mBuffer[id].fEvent->StartPix[ip] == -1) {
1926 dest = ip * roi;
1927 bzero (&mBuffer[id].fEvent->Adc_Data[dest], roi * 2);
1928 }
1929 }
1930 for (it = 0; it < NTMARK; it++) {
1931 if (mBuffer[id].fEvent->StartTM[it] == -1) {
1932 dest = it * roi + NPIX * roi;
1933 bzero (&mBuffer[id].fEvent->Adc_Data[dest], roi * 2);
1934 }
1935 }
1936
1937
1938//and set correct event header ; also check for consistency in event (not yet)
1939 mBuffer[id].fEvent->Roi = roi;
1940 mBuffer[id].fEvent->RoiTM = roiTM;
1941 mBuffer[id].fEvent->EventNum = ievt;
1942 mBuffer[id].fEvent->TriggerNum = itevt;
1943 mBuffer[id].fEvent->TriggerType = itrg;
1944 mBuffer[id].fEvent->Errors[0] = mBuffer[id].Errors[0];
1945 mBuffer[id].fEvent->Errors[1] = mBuffer[id].Errors[1];
1946 mBuffer[id].fEvent->Errors[2] = mBuffer[id].Errors[2];
1947 mBuffer[id].fEvent->Errors[3] = mBuffer[id].Errors[3];
1948 mBuffer[id].fEvent->SoftTrig = 0;
1949
1950
1951 for (ib = 0; ib < NBOARDS; ib++) {
1952 if (mBuffer[id].board[ib] == -1) { //board is not read
1953 mBuffer[id].FADhead[ib].start_package_flag = 0;
1954 mBuffer[id].fEvent->BoardTime[ib] = 0;
1955 } else {
1956 mBuffer[id].fEvent->BoardTime[ib] =
1957 ntohl (mBuffer[id].FADhead[ib].time);
1958 }
1959 }
1960
1961 int i = eventCheck (mBuffer[id].runNum, mBuffer[id].FADhead,
1962 mBuffer[id].fEvent);
1963 gi.procTot++;
1964 numProc++;
1965
1966 if (i < 0) {
1967 evtCtrl.evtStat[k0] = 9999; //flag event to be skipped
1968 gi.procErr++;
1969 } else {
1970 evtCtrl.evtStat[k0] = 1000;
1971 runCtrl[j].procEvt++;
1972 }
1973 }
1974 }
1975 } else if (evtCtrl.evtStat[k0] >= 0 && evtCtrl.evtStat[k0] < 90) {
1976 numWait++;
1977 }
1978 }
1979
1980 if (gj.readStat < -10 && numWait == 0) { //nothing left to do
1981 snprintf (str, MXSTR, "Exit Processing Process ...");
1982 factOut (kInfo, -1, str);
1983 gp_runStat = -22; //==> we should exit
1984 gj.procStat = -22; //==> we should exit
1985 return 0;
1986 }
1987
1988 if (numProc == 0) {
1989 //seems we have nothing to do, so sleep a little
1990 xwait.tv_sec = 0;
1991 xwait.tv_nsec = 2000000; // sleep for ~2 msec
1992 nanosleep (&xwait, NULL);
1993 }
1994 gp_runStat = gi_runStat;
1995 gj.procStat = gj.readStat;
1996
1997 }
1998
1999 //we are asked to abort asap ==> must flag all remaining events
2000 // when gi_runStat claims that all events are in the buffer...
2001
2002 snprintf (str, MXSTR, "Abort Processing Process ...");
2003 factOut (kInfo, -1, str);
2004 int kd = evtCtrl.lastPtr - evtCtrl.frstPtr;
2005 if (kd < 0)
2006 kd += (MAX_EVT * MAX_RUN);
2007
2008 for (k = 0; k < gi_maxProc; k++) {
2009 pthread_join (thread[k], (void **) &status);
2010 }
2011
2012 int k1 = evtCtrl.frstPtr;
2013 for (k = k1; k < (k1 + kd); k++) {
2014 int k0 = k % (MAX_EVT * MAX_RUN);
2015 if (evtCtrl.evtStat[k0] >= 0 && evtCtrl.evtStat[k0] < 1000) {
2016 evtCtrl.evtStat[k0] = 9800; //flag event as 'processed'
2017 }
2018 }
2019
2020 gp_runStat = -99;
2021 gj.procStat = -99;
2022
2023 return 0;
2024
2025} /*-----------------------------------------------------------------*/
2026
2027int
2028CloseRunFile (uint32_t runId, uint32_t closeTime, uint32_t maxEvt)
2029{
2030/* close run runId (all all runs if runId=0) */
2031/* return: 0=close scheduled / >0 already closed / <0 does not exist */
2032 int j;
2033
2034
2035 if (runId == 0) {
2036 for (j = 0; j < MAX_RUN; j++) {
2037 if (runCtrl[j].fileId == 0) { //run is open
2038 runCtrl[j].closeTime = closeTime;
2039 runCtrl[j].maxEvt = maxEvt;
2040 }
2041 }
2042 return 0;
2043 }
2044
2045 for (j = 0; j < MAX_RUN; j++) {
2046 if (runCtrl[j].runId == runId) {
2047 if (runCtrl[j].fileId == 0) { //run is open
2048 runCtrl[j].closeTime = closeTime;
2049 runCtrl[j].maxEvt = maxEvt;
2050 return 0;
2051 } else if (runCtrl[j].fileId < 0) { //run not yet opened
2052 runCtrl[j].closeTime = closeTime;
2053 runCtrl[j].maxEvt = maxEvt;
2054 return +1;
2055 } else { // run already closed
2056 return +2;
2057 }
2058 }
2059 } //we only reach here if the run was never created
2060 return -1;
2061
2062} /*-----------------------------------------------------------------*/
2063
2064
2065void *
2066writeEvt (void *ptr)
2067{
2068/* *** main loop writing event (including opening and closing run-files */
2069
2070 int numWrite, numWait;
2071 int k, j ;
2072 struct timespec xwait;
2073 char str[MXSTR];
2074
2075 cpu_set_t mask;
2076 int cpu = 1; //write thread
2077
2078 snprintf (str, MXSTR, "Starting write-thread");
2079 factOut (kInfo, -1, str);
2080
2081/* CPU_ZERO initializes all the bits in the mask to zero. */
2082// CPU_ZERO (&mask);
2083/* CPU_SET sets only the bit corresponding to cpu. */
2084// CPU_SET (cpu, &mask);
2085/* sched_setaffinity returns 0 in success */
2086// if (sched_setaffinity (0, sizeof (mask), &mask) == -1) {
2087// snprintf (str, MXSTR, "W ---> can not create affinity to %d", cpu);
2088// }
2089
2090 int lastRun = 0; //usually run from last event still valid
2091
2092 while (g_runStat > -2) {
2093
2094 numWait = numWrite = 0;
2095 int kd = evtCtrl.lastPtr - evtCtrl.frstPtr;
2096 if (kd < 0)
2097 kd += (MAX_EVT * MAX_RUN);
2098
2099 int k1 = evtCtrl.frstPtr;
2100 for (k = k1; k < (k1 + kd); k++) {
2101 int k0 = k % (MAX_EVT * MAX_RUN);
2102//would be better to use bitmaps for evtStat (allow '&' instead of multi-if)
2103 if (evtCtrl.evtStat[k0] > 5000 && evtCtrl.evtStat[k0] < 9000) {
2104
2105 if (gi_resetR > 1) { //we must drain the buffer asap
2106 evtCtrl.evtStat[k0] = 9904;
2107 } else {
2108
2109
2110 int id = evtCtrl.evtBuf[k0];
2111 uint32_t irun = mBuffer[id].runNum;
2112 int32_t ievt = mBuffer[id].evNum;
2113
2114 gi.wrtTot++;
2115 if (runCtrl[lastRun].runId == irun) {
2116 j = lastRun;
2117 } else {
2118 //check which fileID to use (or open if needed)
2119 for (j = 0; j < MAX_RUN; j++) {
2120 if (runCtrl[j].runId == irun)
2121 break;
2122 }
2123 if (j >= MAX_RUN) {
2124 snprintf (str, MXSTR,
2125 "W error: can not find run %d for event %d in %d",
2126 irun, ievt, id);
2127 factOut (kFatal, 901, str);
2128 gi.wrtErr++;
2129 }
2130 lastRun = j;
2131 }
2132
2133 if (runCtrl[j].fileId < 0) {
2134 actRun.Version = 1;
2135 actRun.RunType = -1; //to be adapted
2136
2137 actRun.Nroi = runCtrl[j].roi0;
2138 actRun.NroiTM = runCtrl[j].roi8;
2139 if (actRun.Nroi == actRun.NroiTM)
2140 actRun.NroiTM = 0;
2141 actRun.RunTime = runCtrl[j].firstTime;
2142 actRun.RunUsec = runCtrl[j].firstTime;
2143 actRun.NBoard = NBOARDS;
2144 actRun.NPix = NPIX;
2145 actRun.NTm = NTMARK;
2146 actRun.Nroi = mBuffer[id].nRoi;
2147 memcpy (actRun.FADhead, mBuffer[id].FADhead,
2148 NBOARDS * sizeof (PEVNT_HEADER));
2149
2150 runCtrl[j].fileHd =
2151 runOpen (irun, &actRun, sizeof (actRun));
2152 if (runCtrl[j].fileHd == NULL) {
2153 snprintf (str, MXSTR,
2154 "W could not open a file for run %d", irun);
2155 factOut (kError, 502, str);
2156 runCtrl[j].fileId = 91;
2157 } else {
2158 snprintf (str, MXSTR, "W opened new run_file %d evt %d",
2159 irun, ievt);
2160 factOut (kInfo, -1, str);
2161 runCtrl[j].fileId = 0;
2162 }
2163
2164 }
2165
2166 if (runCtrl[j].fileId != 0) {
2167 if (runCtrl[j].fileId < 0) {
2168 snprintf (str, MXSTR,
2169 "W never opened file for this run %d", irun);
2170 factOut (kError, 123, str);
2171 } else if (runCtrl[j].fileId < 100) {
2172 snprintf (str, MXSTR, "W.file for this run is closed %d",
2173 irun);
2174 factOut (kWarn, 123, str);
2175 runCtrl[j].fileId += 100;
2176 } else {
2177 snprintf (str, MXSTR, "W:file for this run is closed %d",
2178 irun);
2179 factOut (kDebug, 123, str);
2180 }
2181 evtCtrl.evtStat[k0] = 9903;
2182 gi.wrtErr++;
2183 } else {
2184// snprintf (str, MXSTR,"write event %d size %d",ievt,sizeof (mBuffer[id]));
2185// factOut (kInfo, 504, str);
2186 int i = runWrite (runCtrl[j].fileHd, mBuffer[id].fEvent,
2187 sizeof (mBuffer[id]));
2188 if (i >= 0) {
2189 runCtrl[j].lastTime = g_actTime;
2190 runCtrl[j].actEvt++;
2191 evtCtrl.evtStat[k0] = 9901;
2192 snprintf (str, MXSTR,
2193 "%5d successfully wrote for run %d id %5d",
2194 ievt, irun, k0);
2195 factOut (kDebug, 504, str);
2196// gj.writEvt++ ;
2197 } else {
2198 snprintf (str, MXSTR, "W error writing event for run %d",
2199 irun);
2200 factOut (kError, 503, str);
2201 evtCtrl.evtStat[k0] = 9902;
2202 gi.wrtErr++;
2203 }
2204
2205 if (i < 0
2206 || runCtrl[j].lastTime < g_actTime - 300
2207 || runCtrl[j].closeTime < g_actTime
2208 || runCtrl[j].maxEvt < runCtrl[j].actEvt) {
2209 int ii = 0;
2210 if (i < 0)
2211 ii = 1;
2212 else if (runCtrl[j].closeTime < g_actTime)
2213 ii = 2;
2214 else if (runCtrl[j].lastTime < g_actTime - 300)
2215 ii = 3;
2216 else if (runCtrl[j].maxEvt <= runCtrl[j].actEvt)
2217 ii = 4;
2218
2219
2220
2221 //close run for whatever reason
2222 if (runCtrl[j].runId == gi_myRun)
2223 gi_myRun = g_actTime;
2224
2225 if (runCtrl[j].procId == 0) {
2226 runFinish1 (runCtrl[j].runId);
2227 runCtrl[j].procId = 92;
2228 }
2229
2230 runCtrl[j].closeTime = g_actTime - 1;
2231 i = runClose (runCtrl[j].fileHd, &runTail[j],
2232 sizeof (runTail[j]));
2233 if (i < 0) {
2234 snprintf (str, MXSTR, "error closing run %d %d AAA",
2235 runCtrl[j].runId, i);
2236 factOut (kError, 503, str);
2237 runCtrl[j].fileId = 92;
2238 } else {
2239 snprintf (str, MXSTR, "W closed run %d AAA %d", irun,
2240 ii);
2241 factOut (kInfo, 503, str);
2242 runCtrl[j].fileId = 93;
2243 }
2244 }
2245 }
2246 }
2247 } else if (evtCtrl.evtStat[k0] > 0 && evtCtrl.evtStat[k0] < 9000)
2248 numWait++;
2249 }
2250
2251 //check if we should close a run (mainly when no event pending)
2252 for (j = 0; j < MAX_RUN; j++) {
2253 if (runCtrl[j].fileId == 0
2254 && (runCtrl[j].closeTime < g_actTime
2255 || runCtrl[j].lastTime < g_actTime - 300
2256 || runCtrl[j].maxEvt <= runCtrl[j].actEvt)) {
2257 if (runCtrl[j].runId == gi_myRun)
2258 gi_myRun = g_actTime;
2259 int ii = 0;
2260 if (runCtrl[j].closeTime < g_actTime)
2261 ii = 2;
2262 else if (runCtrl[j].lastTime < g_actTime - 300)
2263 ii = 3;
2264 else if (runCtrl[j].maxEvt <= runCtrl[j].actEvt)
2265 ii = 4;
2266
2267 if (runCtrl[j].procId == 0) {
2268 runFinish1 (runCtrl[j].runId);
2269 runCtrl[j].procId = 92;
2270 }
2271
2272 runCtrl[j].closeTime = g_actTime - 1;
2273 int i = runClose (runCtrl[j].fileHd, &runTail[j],
2274 sizeof (runTail[j]));
2275 if (i < 0) {
2276 snprintf (str, MXSTR, "error closing run %d %d BBB",
2277 runCtrl[j].runId, i);
2278 factOut (kError, 506, str);
2279 runCtrl[j].fileId = 94;
2280 } else {
2281 snprintf (str, MXSTR, "W closed run %d BBB %d",
2282 runCtrl[j].runId, ii);
2283 factOut (kInfo, 507, str);
2284 runCtrl[j].fileId = 95;
2285 }
2286 }
2287 }
2288
2289 if (numWrite == 0) {
2290 //seems we have nothing to do, so sleep a little
2291 xwait.tv_sec = 0;
2292 xwait.tv_nsec = 2000000; // sleep for ~2 msec
2293 nanosleep (&xwait, NULL);
2294 }
2295
2296 if (gj.readStat < -10 && numWait == 0) { //nothing left to do
2297 snprintf (str, MXSTR, "Finish Write Process ...");
2298 factOut (kInfo, -1, str);
2299 gw_runStat = -22; //==> we should exit
2300 gj.writStat = -22; //==> we should exit
2301 goto closerun;
2302 }
2303 gw_runStat = gi_runStat;
2304 gj.writStat = gj.readStat;
2305
2306 }
2307
2308 //must close all open files ....
2309 snprintf (str, MXSTR, "Abort Writing Process ...");
2310 factOut (kInfo, -1, str);
2311
2312 closerun:
2313 snprintf (str, MXSTR, "Close all open files ...");
2314 factOut (kInfo, -1, str);
2315 for (j = 0; j < MAX_RUN; j++)
2316 if (runCtrl[j].fileId == 0) {
2317 if (runCtrl[j].runId == gi_myRun)
2318 gi_myRun = g_actTime;
2319
2320 if (runCtrl[j].procId == 0) {
2321 runFinish1 (runCtrl[j].runId);
2322 runCtrl[j].procId = 92;
2323 }
2324
2325 runCtrl[j].closeTime = g_actTime - 1;
2326 int i = runClose (runCtrl[j].fileHd, &runTail[j], sizeof (runTail[j]));
2327 int ii = 0;
2328 if (runCtrl[j].closeTime < g_actTime)
2329 ii = 2;
2330 else if (runCtrl[j].lastTime < g_actTime - 300)
2331 ii = 3;
2332 else if (runCtrl[j].maxEvt <= runCtrl[j].actEvt)
2333 ii = 4;
2334 if (i < 0) {
2335 snprintf (str, MXSTR, "error closing run %d %d CCC",
2336 runCtrl[j].runId, i);
2337 factOut (kError, 506, str);
2338 runCtrl[j].fileId = 96;
2339 } else {
2340 snprintf (str, MXSTR, "W closed run %d CCC %d", runCtrl[j].runId,
2341 ii);
2342 factOut (kInfo, 507, str);
2343 runCtrl[j].fileId = 97;
2344 }
2345 }
2346
2347 gw_runStat = -99;
2348 gj.writStat = -99;
2349 snprintf (str, MXSTR, "Exit Writing Process ...");
2350 factOut (kInfo, -1, str);
2351 return 0;
2352
2353
2354
2355
2356} /*-----------------------------------------------------------------*/
2357
2358
2359
2360
2361void
2362StartEvtBuild ()
2363{
2364
2365 int i, j, imax, status, th_ret[50];
2366 pthread_t thread[50];
2367 struct timespec xwait;
2368
2369 gi_runStat = gp_runStat = gw_runStat = 0;
2370 gj.readStat = gj.procStat = gj.writStat = 0;
2371
2372 snprintf (str, MXSTR, "Starting EventBuilder V15.07 A");
2373 factOut (kInfo, -1, str);
2374
2375//initialize run control logics
2376 for (i = 0; i < MAX_RUN; i++) {
2377 runCtrl[i].runId = 0;
2378 runCtrl[i].fileId = -2;
2379 }
2380
2381//prepare for subProcesses
2382 gi_maxSize = g_maxSize;
2383 if (gi_maxSize <= 0)
2384 gi_maxSize = 1;
2385
2386 gi_maxProc = g_maxProc;
2387 if (gi_maxProc <= 0 || gi_maxProc > 90) {
2388 snprintf (str, MXSTR, "illegal number of processes %d", gi_maxProc);
2389 factOut (kFatal, 301, str);
2390 gi_maxProc = 1;
2391 }
2392//partially initialize event control logics
2393 evtCtrl.frstPtr = 0;
2394 evtCtrl.lastPtr = 0;
2395
2396//start all threads (more to come) when we are allowed to ....
2397 while (g_runStat == 0) {
2398 xwait.tv_sec = 0;
2399 xwait.tv_nsec = 10000000; // sleep for ~10 msec
2400 nanosleep (&xwait, NULL);
2401 }
2402
2403 i = 0;
2404 th_ret[i] = pthread_create (&thread[i], NULL, readFAD, NULL);
2405 i++;
2406 th_ret[i] = pthread_create (&thread[i], NULL, procEvt, NULL);
2407 i++;
2408 th_ret[i] = pthread_create (&thread[i], NULL, writeEvt, NULL);
2409 i++;
2410 imax = i;
2411
2412
2413#ifdef BILAND
2414 xwait.tv_sec = 30;;
2415 xwait.tv_nsec = 0; // sleep for ~20sec
2416 nanosleep (&xwait, NULL);
2417
2418 printf ("close all runs in 2 seconds\n");
2419
2420 CloseRunFile (0, time (NULL) + 2, 0);
2421
2422 xwait.tv_sec = 1;;
2423 xwait.tv_nsec = 0; // sleep for ~20sec
2424 nanosleep (&xwait, NULL);
2425
2426 printf ("setting g_runstat to -1\n");
2427
2428 g_runStat = -1;
2429#endif
2430
2431
2432//wait for all threads to finish
2433 for (i = 0; i < imax; i++) {
2434 j = pthread_join (thread[i], (void **) &status);
2435 }
2436
2437} /*-----------------------------------------------------------------*/
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453 /*-----------------------------------------------------------------*/
2454 /*-----------------------------------------------------------------*/
2455 /*-----------------------------------------------------------------*/
2456 /*-----------------------------------------------------------------*/
2457 /*-----------------------------------------------------------------*/
2458
2459#ifdef BILAND
2460
2461int
2462subProcEvt (int threadID, PEVNT_HEADER * fadhd, EVENT * event,
2463 int8_t * buffer)
2464{
2465 printf ("called subproc %d\n", threadID);
2466 return threadID + 1;
2467}
2468
2469
2470
2471
2472 /*-----------------------------------------------------------------*/
2473 /*-----------------------------------------------------------------*/
2474 /*-----------------------------------------------------------------*/
2475 /*-----------------------------------------------------------------*/
2476 /*-----------------------------------------------------------------*/
2477
2478
2479
2480
2481FileHandle_t
2482runOpen (uint32_t irun, RUN_HEAD * runhd, size_t len)
2483{
2484 return 1;
2485};
2486
2487int
2488runWrite (FileHandle_t fileHd, EVENT * event, size_t len)
2489{
2490 return 1;
2491 usleep (10000);
2492 return 1;
2493}
2494
2495
2496//{ return 1; } ;
2497
2498int
2499runClose (FileHandle_t fileHd, RUN_TAIL * runth, size_t len)
2500{
2501 return 1;
2502};
2503
2504
2505
2506
2507int
2508eventCheck (uint32_t runNr, PEVNT_HEADER * fadhd, EVENT * event)
2509{
2510 int i = 0;
2511
2512// printf("------------%d\n",ntohl(fadhd[7].fad_evt_counter) );
2513// for (i=0; i<NBOARDS; i++) {
2514// printf("b=%2d,=%5d\n",i,fadhd[i].board_id);
2515// }
2516 return 0;
2517}
2518
2519
2520void
2521factStatNew (EVT_STAT gi)
2522{
2523 int i;
2524
2525//for (i=0;i<MAX_SOCK;i++) {
2526// printf("%4d",gi.numRead[i]);
2527// if (i%20 == 0 ) printf("\n");
2528//}
2529}
2530
2531void
2532gotNewRun (int runnr, PEVNT_HEADER * headers)
2533{
2534 printf ("got new run %d\n", runnr);
2535 return;
2536}
2537
2538void
2539factStat (GUI_STAT gj)
2540{
2541// printf("stat: bfr%5lu skp%4lu free%4lu (tot%7lu) mem%12lu rd%12lu %3lu\n",
2542// array[0],array[1],array[2],array[3],array[4],array[5],array[6]);
2543}
2544
2545
2546void
2547debugRead (int isock, int ibyte, int32_t event, int32_t ftmevt, int32_t runnr,
2548 int state, uint32_t tsec, uint32_t tusec)
2549{
2550// printf("%3d %5d %9d %3d %12d\n",isock, ibyte, event, state, tusec) ;
2551}
2552
2553
2554
2555void
2556debugStream (int isock, void *buf, int len)
2557{
2558}
2559
2560void
2561debugHead (int i, int j, void *buf)
2562{
2563}
2564
2565
2566void
2567factOut (int severity, int err, char *message)
2568{
2569 static FILE *fd;
2570 static int file = 0;
2571
2572 if (file == 0) {
2573 printf ("open file\n");
2574 fd = fopen ("x.out", "w+");
2575 file = 999;
2576 }
2577
2578 fprintf (fd, "%3d %3d | %s \n", severity, err, message);
2579
2580 if (severity != kDebug)
2581 printf ("%3d %3d | %s\n", severity, err, message);
2582}
2583
2584
2585
2586int
2587main ()
2588{
2589 int i, b, c, p;
2590 char ipStr[100];
2591 struct in_addr IPaddr;
2592
2593 g_maxMem = 1024 * 1024; //MBytes
2594//g_maxMem = g_maxMem * 1024 *10 ; //10GBytes
2595 g_maxMem = g_maxMem * 200; //100MBytes
2596
2597 g_maxProc = 20;
2598 g_maxSize = 30000;
2599
2600 g_runStat = 40;
2601
2602 i = 0;
2603
2604// version for standard crates
2605//for (c=0; c<4,c++) {
2606// for (b=0; b<10; b++) {
2607// sprintf(ipStr,"10.0.%d.%d",128+c,128+b)
2608//
2609// inet_pton(PF_INET, ipStr, &IPaddr) ;
2610//
2611// g_port[i].sockAddr.sin_family = PF_INET;
2612// g_port[i].sockAddr.sin_port = htons(5000) ;
2613// g_port[i].sockAddr.sin_addr = IPaddr ;
2614// g_port[i].sockDef = 1 ;
2615// i++ ;
2616// }
2617//}
2618//
2619//version for PC-test *
2620 for (c = 0; c < 4; c++) {
2621 for (b = 0; b < 10; b++) {
2622 sprintf (ipStr, "10.0.%d.11", 128 + c);
2623 if (c < 2)
2624 sprintf (ipStr, "10.0.%d.11", 128);
2625 else
2626 sprintf (ipStr, "10.0.%d.11", 131);
2627// if (c==0) sprintf(ipStr,"10.0.100.11") ;
2628
2629 inet_pton (PF_INET, ipStr, &IPaddr);
2630 p = 31919 + 100 * c + 10 * b;
2631
2632
2633 g_port[i].sockAddr.sin_family = PF_INET;
2634 g_port[i].sockAddr.sin_port = htons (p);
2635 g_port[i].sockAddr.sin_addr = IPaddr;
2636 g_port[i].sockDef = 1;
2637
2638 i++;
2639 }
2640 }
2641
2642
2643//g_port[17].sockDef =-1 ;
2644//g_actBoards-- ;
2645
2646 StartEvtBuild ();
2647
2648 return 0;
2649
2650}
2651#endif
Note: See TracBrowser for help on using the repository browser.