Belle II Software development
DesSer.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8#include <daq/rawdata/DesSer.h>
9
10#include <netdb.h>
11#include <netinet/tcp.h>
12
13#include <sys/mman.h>
14#include <sys/socket.h>
15#include <sys/uio.h>
16#include <unistd.h>
17
18#include <csignal>
19
20#include <csignal>
21
22//#define DEBUG
23using namespace std;
24using namespace Belle2;
25
26//----------------------------------------------------------------
27// Implementation
28//----------------------------------------------------------------
29
31{
32
34
35 m_exprunsubrun_no = 0; // will obtain info from data
36
37 m_prev_exprunsubrun_no = 0xFFFFFFFF;
38
39#ifdef NONSTOP
40 m_run_pause = 0;
41
42 m_run_error = 0;
43#endif
44
45 // B2INFO("DeSerializerPrePC: Constructor done.");
46 printf("[DEBUG] DesSer: Constructor done.\n"); fflush(stdout);
47}
48
49
50
51DesSer::~DesSer()
52{
53
54}
55
56
58{
59 int* tempbuf = 0;
60 if (m_num_usedbuf < NUM_PREALLOC_BUF) {
61 tempbuf = m_bufary[ m_num_usedbuf ];
63 } else {
64 char err_buf[500];
65 sprintf(err_buf,
66 "No pre-allocated buffers are left. %d > %d. Not enough buffers are allocated or "
67 "memory leak or forget to call ClearNumUsedBuf every event loop. Exting...",
68 m_num_usedbuf, NUM_PREALLOC_BUF);
69 print_err.PrintError(err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
70 sleep(1234567);
71 exit(1);
72 }
73 return tempbuf;
74}
75
76
77int* DesSer::getNewBuffer(int nwords, int* delete_flag)
78{
79
80 int* temp_buf = NULL;
81 // Prepare buffer
82 if (nwords > BUF_SIZE_WORD) {
83 *delete_flag = 1;
84 temp_buf = new int[ nwords ];
85 } else {
86 if ((temp_buf = getPreAllocBuf()) == 0x0) {
87 char err_buf[500];
88 sprintf(err_buf, "Null pointer from GetPreALlocBuf(). Exting...\n");
89 print_err.PrintError(err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
90 sleep(1234567);
91 exit(1);
92 } else {
93 *delete_flag = 0;
94 }
95 }
96
97 return temp_buf;
98
99}
100
101void DesSer::initialize(bool close_listen)
102{
103 printf("[DEBUG] DesSer: initialize() started.\n"); fflush(stdout);
104 signal(SIGPIPE, SIG_IGN);
105
106 //
107 // initialize Rx part from DeSerializer**.cc
108 //
109
110 // allocate buffer
111 for (int i = 0 ; i < NUM_PREALLOC_BUF; i++) {
112 m_bufary[i] = new int[ BUF_SIZE_WORD ];
113 }
114 m_buffer = new int[ BUF_SIZE_WORD ];
115
116 // initialize buffer
117 for (int i = 0 ; i < NUM_PREALLOC_BUF; i++) {
118 memset(m_bufary[i], 0, BUF_SIZE_WORD * sizeof(int));
119 }
120
121 // Open message handler
122 clearNumUsedBuf();
123 // Shared memory
124 if (m_shmflag > 0) {
125 if (m_nodename.size() == 0 || m_nodeid < 0) {
126 m_shmflag = 0;
127 } else {
129 m_status.reportReady();
130 }
131 }
132
133 event_diff = 0;
134
135 m_prev_copper_ctr = 0xFFFFFFFF;
136 m_prev_evenum = 0xFFFFFFFF;
137
138
139 //
140 // initialize Rx part from DeSerializer**.cc
141 //
142 m_start_flag = 0;
143 n_basf2evt = -1;
145
146#ifdef DUMMY
147 m_buffer = new int[ BUF_SIZE_WORD ];
148#endif
149 Accept(close_listen);
150#ifdef NONSTOP
151 openRunPauseNshm();
152#endif
153
154
155 // For monitor
156 if (m_status.isAvailable()) {
157 m_status.setOutputNBytes(0);
158 m_status.setOutputCount(0);
159 }
160 // B2INFO("DesSer: initialize() was done.");
161 printf("[DEBUG] DesSer: initialize() was done.\n"); fflush(stdout);
162
163}
164
165
167// From Serializer.cc
169
170//void DesSer::fillSendHeaderTrailer(SendHeader* hdr, SendTrailer* trl, RawDataBlock* rawdblk)
171void DesSer::fillSendHeaderTrailer(SendHeader* hdr, SendTrailer* trl, RawDataBlockFormat* rawdblk)
172{
173
174 int total_send_nwords =
175 hdr->GetHdrNwords() +
176 rawdblk->TotalBufNwords() +
177 // rawhdr.GetNwords() +
178 trl->GetTrlNwords();
179
180 hdr->SetNwords(total_send_nwords);
181 hdr->SetNumEventsinPacket(rawdblk->GetNumEvents());
182 hdr->SetNumNodesinPacket(rawdblk->GetNumNodes());
183
184 //
185 // For bug check
186 //
187 if (rawdblk->GetNumEntries() == 1) {
188 if (total_send_nwords != (rawdblk->GetBuffer(0))[ 0 ] + 8) {
189 char err_buf[500];
190 sprintf(err_buf, "Length error. total length %d rawdblk length %d. Exting...\n",
191 total_send_nwords, (rawdblk->GetBuffer(0))[ 0 ]);
192 printData(rawdblk->GetBuffer(0), rawdblk->TotalBufNwords());
193 print_err.PrintError(err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
194 sleep(1234567);
195 exit(-1);
196 }
197 }
198
199
200 for (int i = 0; i < rawdblk->GetNumEntries(); i++) {
201
202 //copy event # from a tonp COPPER block
203 if (!(rawdblk->CheckFTSWID(i)) && !(rawdblk->CheckTLUID(i))) {
204 tmp_header.SetBuffer(rawdblk->GetBuffer(i));
205 hdr->SetEventNumber(tmp_header.GetEveNo());
206 hdr->SetNodeID(tmp_header.GetNodeID());
207 hdr->SetExpRunWord(tmp_header.GetExpRunSubrun());
208 break;
209 }
210
211 //Error if you cannot find any COPPER block
212 if (i == (rawdblk->GetNumEntries() - 1)) {
213 printf("[DEBUG] i= %d : num entries %d : Tot words %d\n", i, rawdblk->GetNumEntries(), rawdblk->TotalBufNwords());
214 printData(rawdblk->GetBuffer(0), rawdblk->TotalBufNwords());
215
216 char err_buf[500] = "[FATAL] CORRUPTED DATA: No COPPER blocks in RawDataBlock. Exiting...";
217 print_err.PrintError(err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
218 sleep(1234567);
219 exit(-1);
220 }
221 }
222 return;
223}
224
225
226//int DesSer::sendByWriteV(RawDataBlock* rawdblk)
227int DesSer::sendByWriteV(RawDataBlockFormat* rawdblk)
228{
229 SendHeader send_header;
230 SendTrailer send_trailer;
231 fillSendHeaderTrailer(&send_header, &send_trailer, rawdblk);
232
233 enum {
234 NUM_BUFFER = 3
235 };
236 struct iovec iov[ NUM_BUFFER ];
237
238 // check Body data size
239 int rawcopper_nwords = rawdblk->TotalBufNwords();
240
241 //Fill iov info.
242 iov[0].iov_base = (char*)send_header.GetBuffer();
243 iov[0].iov_len = sizeof(int) * send_header.GetHdrNwords();
244
245 iov[1].iov_base = (char*)rawdblk->GetWholeBuffer();
246 iov[1].iov_len = sizeof(int) * rawcopper_nwords;
247
248 iov[2].iov_base = (char*)send_trailer.GetBuffer();
249 iov[2].iov_len = sizeof(int) * send_trailer.GetTrlNwords();
250
251 // Send Multiple buffers
252 int n = 0;
253 while (true) {
254 if ((n = writev(m_socket_send, iov, NUM_BUFFER)) < 0) {
255 if (errno == EINTR) {
256 continue;
257 } else if (errno == EAGAIN || errno == EWOULDBLOCK) {
258#ifdef NONSTOP
259 string err_str;
260 callCheckRunPause(err_str);
261#endif
262 continue;
263 } else {
264 char err_buf[500];
265 sprintf(err_buf, "[WARNING] WRITEV error.(%s) : sent %d bytes, header %lu bytes body %lu trailer %lu\n",
266 strerror(errno), n, iov[0].iov_len, iov[1].iov_len, iov[2].iov_len);
267#ifdef NONSTOP
268 m_run_error = 1;
269 // B2ERROR(err_buf);
270 printf("%s\n", err_buf); fflush(stdout);
271 string err_str = "RUN_ERROR";
272 throw (err_str); // To exit this module, go to DeSerializer** and wait for run-resume.
273#else
274 print_err.PrintError(err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
275 exit(1);
276#endif
277 }
278 }
279 break;
280 }
281
282#ifdef DEBUG
283 printf("[DEBUG] *******BODY**********\n");
284 printf("[DEBUG] \n%.8d : ", 0);
285 printData((int*)(iov[1].iov_base), iov[1].iov_len);
286#endif
287
288
289 int total_send_bytes = sizeof(int) * send_header.GetTotalNwords();
290
291
292 //
293 // Retry sending
294 //
295 if (n != total_send_bytes) {
296 // B2WARNING("Serializer: Sent byte(" << n << "bytes) is not same as the event size (" << total_send_bytes << "bytes). Retrying...");
297 printf("[WARNING] Serializer: Sent byte( %d bytes) is not same as the event size ( %d bytes). Retrying...\n", n,
298 total_send_bytes); // back to WARNING due to request from Konno-san on 2018/7/3
299 fflush(stdout);
300
301 double retry_start = getTimeSec();
302 // Send Header
303 if (n < (int)(iov[ 0 ].iov_len)) {
304 n += Send(m_socket_send, (char*)iov[ 0 ].iov_base + n, iov[ 0 ].iov_len - n);
305 }
306
307 if (n < (int)(iov[ 0 ].iov_len + iov[ 1 ].iov_len)) {
308 n += Send(m_socket_send, (char*)iov[ 1 ].iov_base + (n - iov[ 0 ].iov_len), iov[ 1 ].iov_len - (n - iov[ 0 ].iov_len));
309 }
310
311 if (n < (int)(iov[ 0 ].iov_len + iov[ 1 ].iov_len + iov[ 2 ].iov_len)) {
312 n += Send(m_socket_send, (char*)iov[ 2 ].iov_base + (n - iov[ 0 ].iov_len - iov[ 1 ].iov_len),
313 iov[ 2 ].iov_len - (n - iov[ 0 ].iov_len - iov[ 1 ].iov_len));
314 }
315 double retry_end = getTimeSec();
316 // B2WARNING("Resending ends. It takes " << retry_end - retry_start << "(s)");
317 printf("[WARNING] Resending ends. It takes %lf (s)\n", retry_end - retry_start);
318 fflush(stdout); // back to WARNING due to request from Konno-san on 2018/7/3
319 }
320 // printf( "[DEBUG] n %d total %d\n", n, total_send_bytes);
321 // delete temp_buf;
322
323 return total_send_bytes;
324
325}
326
327
328int DesSer::Send(int socket, char* buf, int size_bytes)
329{
330 int sent_bytes = 0;
331 while (true) {
332 int ret = 0;
333 if ((ret = send(socket,
334 buf + sent_bytes, size_bytes - sent_bytes, MSG_NOSIGNAL)) < 0) {
335 if (errno == EINTR) {
336 continue;
337 } else if (errno == EAGAIN || errno == EWOULDBLOCK) {
338#ifdef NONSTOP
339 string err_str;
340 callCheckRunPause(err_str);
341#endif
342 continue;
343 } else {
344 char err_buf[500];
345 sprintf(err_buf, "[WARNING] SEND ERROR.(%s)", strerror(errno));
346#ifdef NONSTOP
347 m_run_error = 1;
348 // B2ERROR(err_buf);
349 printf("%s\n", err_buf); fflush(stdout);
350 string err_str = "RUN_ERROR";
351 throw (err_str); // To exit this module, go to DeSerializer** and wait for run-resume.
352#else
353 print_err.PrintError(err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
354 exit(1);
355#endif
356 }
357 }
358 sent_bytes += ret;
359 if (sent_bytes == size_bytes) break;
360 }
361 return sent_bytes;
362}
363
364void DesSer::Accept(bool close_listen)
365{
366 //
367 // Connect to cprtb01
368 //
369 struct hostent* host;
370 host = gethostbyname(m_hostname_local.c_str());
371 if (host == NULL) {
372 char temp_buf[500];
373 sprintf(temp_buf, "[FATAL] hostname(%s) cannot be resolved(%s). Check /etc/hosts. Exiting...\n",
374 m_hostname_local.c_str(), strerror(errno));
375 print_err.PrintError(temp_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
376 exit(1);
377 }
378
379 //
380 // Bind and listen
381 //
382 int fd_listen;
383 struct sockaddr_in sock_listen;
384 sock_listen.sin_family = AF_INET;
385 sock_listen.sin_addr.s_addr = *(unsigned int*)host->h_addr_list[0];
386
387 socklen_t addrlen = sizeof(sock_listen);
388 sock_listen.sin_port = htons(m_port_to);
389 fd_listen = socket(PF_INET, SOCK_STREAM, 0);
390
391 int flags = 1;
392 int ret = setsockopt(fd_listen, SOL_SOCKET, SO_REUSEADDR, &flags, (socklen_t)sizeof(flags));
393 if (ret < 0) {
394 perror("Failed to set REUSEADDR");
395 }
396
397 if (bind(fd_listen, (struct sockaddr*)&sock_listen, sizeof(struct sockaddr)) < 0) {
398 printf("[FATAL] Failed to bind. Maybe other programs have already occupied this port(%d). Exiting...\n",
399 m_port_to); fflush(stdout);
400 // Check the process occupying the port 30000.
401 FILE* fp;
402 char buf[256];
403 char cmdline[500];
404 sprintf(cmdline, "/usr/sbin/ss -ap | grep %d", m_port_to);
405 if ((fp = popen(cmdline, "r")) == NULL) {
406 printf("[WARNING] Failed to run %s\n", cmdline);
407 }
408 while (fgets(buf, 256, fp) != NULL) {
409 printf("[ERROR] Failed to bind. output of ss(port %d) : %s\n", m_port_to, buf); fflush(stdout);
410 }
411 // Error message
412 fclose(fp);
413 char temp_char[500];
414 sprintf(temp_char, "[FATAL] Failed to bind.(%s) Maybe other programs have already occupied this port(%d). Exiting...",
415 strerror(errno), m_port_to);
416 print_err.PrintError(temp_char, __FILE__, __PRETTY_FUNCTION__, __LINE__);
417 exit(1);
418 }
419
420 int val1 = 0;
421 setsockopt(fd_listen, IPPROTO_TCP, TCP_NODELAY, &val1, (socklen_t)sizeof(val1));
422 int backlog = 1;
423 if (listen(fd_listen, backlog) < 0) {
424 char err_buf[500];
425 sprintf(err_buf, "Failed in listen(%s). Exting...", strerror(errno));
426 print_err.PrintError(err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
427 exit(-1);
428 }
429
430 //
431 // Accept
432 //
433 int fd_accept;
434 struct sockaddr_in sock_accept;
435 printf("[DEBUG] Accepting... : port %d server %s\n", m_port_to, m_hostname_local.c_str());
436 fflush(stdout);
437
438 if ((fd_accept = accept(fd_listen, (struct sockaddr*) & (sock_accept), &addrlen)) == 0) {
439 char err_buf[500];
440 sprintf(err_buf, "[FATAL] Failed to accept(%s). Exiting...", strerror(errno));
441 print_err.PrintError(err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
442 exit(-1);
443 } else {
444 // B2INFO("Done.");
445 printf("[DEBUG] Done.\n"); fflush(stdout);
446
447 // set timepout option
448 struct timeval timeout;
449 timeout.tv_sec = 1;
450 timeout.tv_usec = 0;
451 ret = setsockopt(fd_accept, SOL_SOCKET, SO_SNDTIMEO, &timeout, (socklen_t)sizeof(timeout));
452 if (ret < 0) {
453 char temp_char[100] = "[FATAL] Failed to set TIMEOUT. Exiting...";
454 print_err.PrintError(temp_char, __FILE__, __PRETTY_FUNCTION__, __LINE__);
455 exit(-1);
456 }
457 }
458
459 if (close_listen) {
460 close(fd_listen);
461 }
462
463 // int flag = 1;
464 // ret = setsockopt(fd_accept, IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(flag) );
465 m_socket_send = fd_accept;
466
467 if (m_status.isAvailable()) {
468 m_status.setOutputPort(ntohs(sock_listen.sin_port));
469 m_status.setOutputAddress(sock_listen.sin_addr.s_addr);
470 // B2INFO("Accepted " << (int)ntohs(sock_listen.sin_port) << " " << (int)sock_listen.sin_addr.s_addr);
471 printf("Accepted. port %d address %d\n", (int)ntohs(sock_listen.sin_port), (int)sock_listen.sin_addr.s_addr); fflush(stdout);
472 }
473
474 return;
475
476}
477
479{
480 struct timeval t;
481 gettimeofday(&t, NULL);
482 return (t.tv_sec + t.tv_usec * 1.e-6);
483}
484
485
486void DesSer::recordTime(int event, double* array)
487{
488 if (event >= 50000 && event < 50500) {
489 array[ event - 50000 ] = getTimeSec() - m_start_time;
490 }
491 return;
492}
493
494
495unsigned int DesSer::calcXORChecksum(int* buf, int nwords)
496{
497 unsigned int checksum = 0;
498 for (int i = 0; i < nwords; i++) {
499 checksum = checksum ^ buf[ i ];
500 }
501 return checksum;
502}
503
504
505void DesSer::printData(int* buf, int nwords)
506{
507 printf("[DEBUG]");
508 for (int i = 0; i < nwords; i++) {
509 printf("%.8x ", buf[ i ]);
510 if (i % 10 == 9) printf("\n[DEBUG]");
511 }
512 printf("\n[DEBUG]");
513 printf("\n");
514 return;
515}
516
517
518#ifdef NONSTOP
519void DesSer::openRunPauseNshm()
520{
521 char path_shm[100] = "/cpr_pause_resume";
522 int fd = shm_open(path_shm, O_RDONLY, 0666);
523 if (fd < 0) {
524 printf("[DEBUG] %s\n", path_shm);
525 perror("[ERROR] shm_open2");
526 exit(1);
527 }
528 m_ptr = (int*)mmap(NULL, sizeof(int), PROT_READ, MAP_SHARED, fd, 0);
529 return;
530}
531
532int DesSer::checkRunPause()
533{
534#ifdef NONSTOP_SLC
535 if (m_status.getState() == m_status.PAUSING) {
536#else
537 if (*m_ptr) {
538#endif
539 return 1;
540 } else {
541 return 0;
542 }
543}
544
545int DesSer::checkRunRecovery()
546{
547#ifdef NONSTOP_SLC
548 if (m_status.getState() == m_status.RESUMING) {
549#else
550 if (*m_ptr) {
551#endif
552 return 0;
553 } else {
554 return 1;
555 }
556}
557
558void DesSer::resumeRun()
559{
560#ifdef NONSTOP_DEBUG
561 printf("\033[34m");
562 printf("###########(Ser) the 1st event sicne the resume ###############\n");
563 fflush(stdout);
564 printf("\033[0m");
565#endif
566 m_run_error = 0;
567 m_run_pause = 0;
568 return;
569}
570
571
572void DesSer::pauseRun()
573{
574 m_run_pause = 1;
575#ifdef NONSTOP_DEBUG
576 printf("###########(Ser) Pause the run ###############\n");
577 fflush(stdout);
578#endif
579 return;
580}
581
582
583
584
585void DesSer::callCheckRunPause(const string& err_str)
586{
587#ifdef NONSTOP_DEBUG
588 printf("\033[34m");
589 printf("###########(DesSer) TIMEOUT. ###############\n");
590 fflush(stdout);
591 printf("\033[0m");
592#endif
593 if (checkRunPause()) {
594#ifdef NONSTOP_DEBUG
595 printf("\033[31m");
596 printf("###########(DesSer) Pause is detected. ###############\n");
597 fflush(stdout);
598 printf("\033[0m");
599#endif
600 m_run_pause = 1;
601 throw (err_str);
602 }
603 return;
604}
605
606
607int DesSer::CheckConnection(int socket)
608{
609 // Modify Yamagata-san's eb/iseof.cc
610
611
612 int ret;
613 char buffer[100000];
614 int eagain_cnt = 0;
615 int tot_ret = 0;
616 printf("CC1\n"); fflush(stdout);
617 ret = send(socket, buffer, 0, MSG_DONTWAIT);
618 printf("CC2\n"); fflush(stdout);
619 switch (ret) {
620 case 0:
621 break;
622 case -1:
623 if (errno == EAGAIN) {
624 printf("EAGAIN %d cnt %d recvd %d\n", socket, eagain_cnt, tot_ret); fflush(stdout);
625 /* not EOF, no data in queue */
626 if (eagain_cnt > 100) {
627 return 0;
628 }
629 usleep(10000);
630 eagain_cnt++;
631 } else {
632 printf("ERROR %d errno %d err %s\n", socket, errno, strerror(errno)); fflush(stdout);
633 close(socket);
634 return -1;
635 }
636 default:
637 printf("Return value %d of send is strange. Exting...\n", ret);
638 fflush(stdout);
639 exit(1);
640 }
641
642 while (true) {
643
644 //
645 // Extract data in the socket buffer of a peer
646 //
647 // ret = recv( socket, buffer, sizeof(buffer), MSG_PEEK|MSG_DONTWAIT );
648 ret = recv(socket, buffer, sizeof(buffer), MSG_DONTWAIT);
649 switch (ret) {
650 case 0: /* EOF */
651 printf("EOF %d\n", socket); fflush(stdout);
652 close(socket);
653 return -1;
654 case -1:
655 if (errno == EAGAIN) {
656 printf("EAGAIN %d cnt %d recvd %d\n", socket, eagain_cnt, tot_ret); fflush(stdout);
657 /* not EOF, no data in queue */
658 if (eagain_cnt > 100) {
659 return 0;
660 }
661 usleep(10000);
662 eagain_cnt++;
663 } else {
664 printf("ERROR %d errno %d err %s\n", socket, errno, strerror(errno)); fflush(stdout);
665 close(socket);
666 return -1;
667 }
668 break;
669 default:
670 tot_ret += ret;
671 printf("Flushing data in socket buffer : sockid = %d %d bytes tot %d bytes\n", socket, ret, tot_ret); fflush(stdout);
672 }
673 }
674}
675
676
677#endif
678
679void DesSer::shmOpen(char*, char*)
680//(char* path_cfg, char* path_sta)
681{
682 errno = 0;
683 /*m_shmfd_cfg = shm_open( "/cpr_config2", O_CREAT | O_EXCL | O_RDWR, 0666);
684 if (m_shmfd_cfg < 0) {
685 if (errno != EEXIST) {
686 perror("shm_open1");
687 exit(1);
688 }
689 m_shmfd_cfg = shm_open(path_cfg, O_RDWR, 0666);
690 if (m_shmfd_cfg < 0) {
691 printf( "[DEBUG] %s\n", path_cfg);
692 perror("[ERROR] shm_open2");
693 exit(1);
694 }
695 */
696 //}
697 /*
698 m_shmfd_sta = shm_open( "/cpr_status2", O_CREAT | O_EXCL | O_RDWR, 0666);
699 if (m_shmfd_sta < 0) {
700 if (errno != EEXIST) {
701 perror("shm_open1");
702 exit(1);
703 }
704 m_shmfd_sta = shm_open(path_sta , O_RDWR, 0666);
705 if (m_shmfd_sta < 0) {
706 printf( "[DEBUG] %s\n", path_sta);
707 perror("[ERROR] shm_open2");
708 exit(1);
709 }
710 //}
711 int size = 4 * sizeof(int);
712 ftruncate(m_shmfd_cfg, size);
713 ftruncate(m_shmfd_sta, size);
714 */
715}
716
717
718
void shmOpen(char *path_cfg, char *path_sta)
open shared memory
Definition: DesSer.cc:679
int m_port_to
Destination port.
Definition: DesSer.h:278
RunInfoBuffer m_status
Run info buffer.
Definition: DesSer.h:141
std::string m_hostname_local
Destination Host.
Definition: DesSer.h:275
unsigned int m_prev_exprunsubrun_no
run no.
Definition: DesSer.h:147
unsigned int calcXORChecksum(int *buf, int nwords)
calculate checksum
Definition: DesSer.cc:495
std::string m_nodename
Node Name for SLC.
Definition: DesSer.h:135
int * getPreAllocBuf()
Getbuffer.
Definition: DesSer.cc:57
int m_start_flag
start flag
Definition: DesSer.h:181
RawHeader_v2 tmp_header
which format is used
Definition: DesSer.h:323
int * m_buffer
buffer
Definition: DesSer.h:82
DesSer()
Constructor / Destructor.
Definition: DesSer.cc:30
int n_basf2evt
No. of sent events.
Definition: DesSer.h:70
int m_socket_send
Reciever Socket.
Definition: DesSer.h:267
CprErrorMessage print_err
wrapper for B2LOG system
Definition: DesSer.h:184
int m_run_pause
flag to show that run-controller pauses a run
Definition: DesSer.h:227
void printData(int *buf, int nwords)
dump error data
Definition: DesSer.cc:505
int m_run_error
flag to show that there is some errors with which DAQ cannot continue.
Definition: DesSer.h:230
int * getNewBuffer(int nwords, int *delete_flag)
Getbuffer.
Definition: DesSer.cc:77
int m_shmflag
Use shared memory.
Definition: DesSer.h:159
void recordTime(int event, double *array)
store time info.
Definition: DesSer.cc:486
int m_num_usedbuf
Definition: DesSer.h:132
int m_num_connections
check data contents
Definition: DesSer.h:237
int m_compressionLevel
Compression Level.
Definition: DesSer.h:67
int * m_bufary[NUM_PREALLOC_BUF]
buffer
Definition: DesSer.h:85
unsigned int m_exprunsubrun_no
run no.
Definition: DesSer.h:144
int m_nodeid
Node ID for SLC.
Definition: DesSer.h:138
int Send(int socket, char *buf, int size_bytes)
send buffer
Definition: DesSer.cc:328
double getTimeSec()
store time info.
Definition: DesSer.cc:478
The RawDataBlockFormat class Format information for rawdata handling.
virtual int CheckFTSWID(int n)
get FTSW ID to check whether this data block is FTSW data or not
virtual int * GetWholeBuffer()
get pointer to buffer(m_buffer)
virtual int GetNumEntries()
get # of data blocks = (# of nodes)*(# of events)
virtual int TotalBufNwords()
Get total length of m_buffer.
virtual int GetNumNodes()
get # of data sources(e.g. # of COPPER boards) in m_buffer
virtual int * GetBuffer(int n)
get nth buffer pointer
virtual int GetNumEvents()
get # of events in m_buffer
virtual int CheckTLUID(int n)
get FTSW ID to check whether this data block is FTSW data or not
void SetBuffer(int *bufin)
set buffer
Definition: RawHeader_v2.h:47
void SetNumEventsinPacket(int num_events)
set contents of Header
Definition: SendHeader.cc:61
int GetHdrNwords()
get contents of Header
Definition: SendHeader.cc:124
void SetNwords(int total_data_nwords)
initialize Header
Definition: SendHeader.cc:51
int * GetBuffer(void)
Get Header contents.
Definition: SendHeader.cc:32
unsigned int GetEveNo()
get restart #(8bit)
Definition: RawHeader_v2.h:396
unsigned int GetNodeID()
get contents of header
Definition: RawHeader_v2.h:402
unsigned int GetExpRunSubrun()
get contents of header
Definition: RawHeader_v2.h:389
Abstract base class for different kinds of events.
STL namespace.