00001 #include "artdaq-core/Core/SimpleQueueReader.hh"
00002
00003 #include <chrono>
00004 #include <cstddef>
00005 #include <iostream>
00006 #include <string>
00007 #include <thread>
00008
00009 namespace artdaq
00010 {
00011 int simpleQueueReaderApp(int argc, char** argv)
00012 {
00013 try
00014 {
00015 size_t eec(0);
00016 if (argc == 2)
00017 {
00018 std::istringstream ins(argv[1]);
00019 ins >> eec;
00020 }
00021 SimpleQueueReader reader(eec);
00022 reader.run();
00023 return 0;
00024 }
00025 catch (std::string const& msg)
00026 {
00027 std::cerr << "simpleQueueReaderApp failed: "
00028 << msg;
00029 return 1;
00030 }
00031 catch (...)
00032 {
00033 return 1;
00034 }
00035 }
00036
00037 SimpleQueueReader::
00038 SimpleQueueReader(std::size_t eec) :
00039 queue_(getGlobalQueue())
00040 , expectedEventCount_(eec)
00041 {
00042 queue_.setReaderIsReady();
00043 }
00044
00045 void SimpleQueueReader::run()
00046 {
00047 std::size_t eventsSeen = 0;
00048 auto doPrint = getenv("VERBOSE_QUEUE_READING");
00049 while (true)
00050 {
00051 RawEvent_ptr rawEventPtr;
00052 if (queue_.deqNowait(rawEventPtr))
00053 {
00054
00055 if (!rawEventPtr) { break; }
00056 ++eventsSeen;
00057
00058 if (doPrint) { std::cout << *rawEventPtr << std::endl; }
00059 }
00060 else
00061 {
00062 std::this_thread::sleep_for(std::chrono::milliseconds(250));
00063 }
00064 }
00065 if (expectedEventCount_ && eventsSeen != expectedEventCount_)
00066 {
00067 std::ostringstream os;
00068 os << "Wrong number of events in SimpleQueueReader ("
00069 << eventsSeen << " != " << expectedEventCount_ << ").\n";
00070 throw os.str();
00071 }
00072 }
00073 }