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