Belle II Software  release-05-01-25
rb2mrb.cc
1 //+
2 // File : rb2mrb.cc
3 // Description : deliver events in a RingBuffer to multiple RingBuffers
4 //
5 // Author : Ryosuke Itoh, IPNS, KEK
6 // Date : 29 - Apr - 2012
7 //-
8 
9 #include <vector>
10 
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <unistd.h>
14 
15 #include "framework/pcore/RingBuffer.h"
16 #include "framework/pcore/EvtMessage.h"
17 
18 #define RBUFSIZE 10000000
19 #define MAXEVTSIZE 400000000
20 
21 using namespace Belle2;
22 using namespace std;
23 
24 int main(int argc, char** argv)
25 {
26  if (argc < 3) {
27  printf("file2rb : inrbufname outrbufname1 outbufname2 .....\n");
28  exit(-1);
29  }
30 
31  printf("rb2mrb : allocating %s with size=%d (KBytes)\n", argv[1], RBUFSIZE * 4 / 1000);
32  RingBuffer* rbufin = new RingBuffer(argv[1], RBUFSIZE);
33  // RingBuffer* rbufin = new RingBuffer(argv[1]);
34  // RingBuffer* rbufout = new RingBuffer(argv[2], RBUFSIZE);
35 
36  int nout = argc - 2;
37 
38  vector<RingBuffer*> rbufout;
39  for (int i = 0; i < nout; i++) {
40  // rbufout.push_back(new RingBuffer(argv[i + 2]));
41  printf("rb2mrb : allocating %s with size=%d (KBytes)\n", argv[i + 2], RBUFSIZE * 4 / 1000);
42  rbufout.push_back(new RingBuffer(argv[i + 2], RBUFSIZE));
43  }
44 
45  char* evbuf = new char[MAXEVTSIZE];
46 
47  int outptr = 0;
48  int bsize;
49  for (;;) {
50  // Get a record from ringbuf
51  while ((bsize = rbufin->remq((int*)evbuf)) == 0) {
52  // printf ( "Rx : evtbuf is not available yet....\n" );
53  // usleep(100);
54  usleep(20);
55  }
56  EvtMessage* msg = new EvtMessage(evbuf);
57  if (msg->type() == MSG_TERMINATE) {
58  printf("EoF found. Exitting.....\n");
59  break;
60  }
61 
62  // Put the message in ring buffer
63  int irb = 0;
64  for (;;) {
65  irb = rbufout[outptr]->insq((int*)evbuf, bsize);
66  if (irb >= 0) break;
67  // usleep(100);
68  usleep(20);
69  }
70  outptr++;
71  if (outptr >= nout) outptr = 0;
72  delete msg;
73  }
74 
75  // EOF
76  for (int i = 0; i < nout; i++) {
77  int irb = 0;
78  for (;;) {
79  irb = rbufout[i]->insq((int*)evbuf, bsize);
80  if (irb >= 0) break;
81  // usleep(100);
82  usleep(20);
83  }
84  }
85  exit(0);
86 }
87 
88 
89 
90 
Belle2::EvtMessage::type
ERecordType type() const
Get record type.
Definition: EvtMessage.cc:115
Belle2::EvtMessage
Class to manage streamed object.
Definition: EvtMessage.h:60
Belle2::RingBuffer
Class to manage a Ring Buffer placed in an IPC shared memory.
Definition: RingBuffer.h:36
main
int main(int argc, char **argv)
Run all tests.
Definition: test_main.cc:77
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::RingBuffer::remq
int remq(int *buf)
Pick up a buffer from the RingBuffer.
Definition: RingBuffer.cc:311