Belle II Software  release-08-01-10
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
23 using namespace std;
24 using namespace Belle2;
25 
26 //----------------------------------------------------------------
27 // Implementation
28 //----------------------------------------------------------------
29 
30 DesSer::DesSer()
31 {
32 
33  m_num_connections = 1;
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 
51 DesSer::~DesSer()
52 {
53 
54 }
55 
56 
57 int* DesSer::getPreAllocBuf()
58 {
59  int* tempbuf = 0;
60  if (m_num_usedbuf < NUM_PREALLOC_BUF) {
61  tempbuf = m_bufary[ m_num_usedbuf ];
62  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 
77 int* 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 
101 void 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 {
128  m_status.open(m_nodename, m_nodeid);
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;
144  m_compressionLevel = 0;
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)
171 void 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)
227 int 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 
328 int 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 
364 void 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 
478 double DesSer::getTimeSec()
479 {
480  struct timeval t;
481  gettimeofday(&t, NULL);
482  return (t.tv_sec + t.tv_usec * 1.e-6);
483 }
484 
485 
486 void 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 
495 unsigned 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 
505 void 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
519 void 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 
532 int 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 
545 int 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 
558 void 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 
572 void 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 
585 void 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 
607 int 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 
679 void 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 
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 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
Abstract base class for different kinds of events.