11 #include <framework/pcore/RingBuffer.h>
12 #include <daq/rfarm/event/hltsocket/HLTMainLoop.h>
13 #include <framework/logging/Logger.h>
14 #include <framework/pcore/EvtMessage.h>
16 #include <boost/program_options.hpp>
19 #define MAXEVTSIZE 80000000
20 #define RBUFSIZE 10000000
24 namespace po = boost::program_options;
26 int main(
int argc,
char* argv[])
28 std::vector<std::string> inputRingBufferNames;
29 std::vector<std::string> outputRingBufferNames;
31 po::options_description desc(
"b2hlt_rb2rb");
33 (
"help,h",
"Print this help message")
34 (
"input-ring-buffer-name,r", po::value<std::vector<std::string>>(&inputRingBufferNames)->required(),
35 "name of the input ring buffers")
36 (
"output-ring-buffer-name,r", po::value<std::vector<std::string>>(&outputRingBufferNames)->required(),
37 "name of the output ring buffers");
41 po::store(po::command_line_parser(argc, argv).options(desc).run(), vm);
42 }
catch (std::exception& e) {
46 if (vm.count(
"help")) {
47 std::cout << desc << std::endl;
53 }
catch (std::exception& e) {
57 if (outputRingBufferNames.empty() or inputRingBufferNames.empty()) {
58 B2FATAL(
"Need at least one output and input ring buffer!");
62 std::vector<RingBuffer*> inputRingBuffers;
63 for (
const std::string& bufferName : inputRingBufferNames) {
64 inputRingBuffers.push_back(
new RingBuffer(bufferName.c_str(), RBUFSIZE));
65 inputRingBuffers.back()->dump_db();
68 std::vector<RingBuffer*> outputRingBuffers;
69 for (
const std::string& bufferName : outputRingBufferNames) {
70 outputRingBuffers.push_back(
new RingBuffer(bufferName.c_str(), RBUFSIZE));
71 outputRingBuffers.back()->dump_db();
76 int* buffer =
new int[MAXEVTSIZE];
79 auto inputRingBuffer = inputRingBuffers.begin();
80 auto outputRingBuffer = outputRingBuffers.begin();
82 while (mainLoop.isRunning()) {
84 const int size = mainLoop.readFromRingBufferWaiting(*inputRingBuffer, buffer);
87 if (mainLoop.isRunning()) {
88 B2ERROR(
"Writing to the ring buffer failed!");
93 B2ASSERT(
"Size is negative! This should be handled above. Not good!", size > 0);
96 const int returnValue = mainLoop.writeToRingBufferWaiting(*outputRingBuffer, buffer, size);
98 if (returnValue <= 0) {
99 if (mainLoop.isRunning()) {
100 B2ERROR(
"Writing to the ring buffer failed!");
105 B2ASSERT(
"Written size is negative! This should be handled above. Not good!", returnValue > 0);
109 if (nevt % 5000 == 0) {
110 B2RESULT(
"b2hlt_rb2socket event number: " << nevt);
114 if (inputRingBuffer == inputRingBuffers.end()) {
115 inputRingBuffer = inputRingBuffers.begin();
118 if (outputRingBuffer == outputRingBuffers.end()) {
119 outputRingBuffer = outputRingBuffers.begin();
123 B2RESULT(
"Program terminated.");