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 size_t eec(0);
00015 if (argc == 2) {
00016 std::istringstream ins(argv[1]);
00017 ins >> eec;
00018 }
00019 SimpleQueueReader reader(eec);
00020 reader.run();
00021 return 0;
00022 }
00023 catch (std::string const & msg) {
00024 std::cerr << "simpleQueueReaderApp failed: "
00025 << msg;
00026 return 1;
00027 }
00028 catch (...) {
00029 return 1;
00030 }
00031 }
00032
00033 SimpleQueueReader::
00034 SimpleQueueReader(std::size_t eec) :
00035 queue_(getGlobalQueue()),
00036 expectedEventCount_(eec)
00037 {
00038 queue_.setReaderIsReady();
00039 }
00040
00041 void SimpleQueueReader::run()
00042 {
00043 std::size_t eventsSeen = 0;
00044 char * doPrint = getenv("VERBOSE_QUEUE_READING");
00045 while (true) {
00046 RawEvent_ptr rawEventPtr;
00047 if (queue_.deqNowait(rawEventPtr)) {
00048
00049 if (!rawEventPtr) { break; }
00050 ++eventsSeen;
00051
00052 if (doPrint) { std::cout << *rawEventPtr << std::endl; }
00053 }
00054 else {
00055 std::this_thread::sleep_for(std::chrono::milliseconds(250));
00056 }
00057 }
00058 if (expectedEventCount_ && eventsSeen != expectedEventCount_)
00059 {
00060 std::ostringstream os;
00061 os << "Wrong number of events in SimpleQueueReader ("
00062 << eventsSeen << " != " << expectedEventCount_ << ").\n";
00063 throw os.str();
00064 }
00065 }
00066 }