00001 #include "artdaq-core/Core/SimpleMemoryReader.hh"
00002
00003 #include <chrono>
00004 #include <cstddef>
00005 #include <iostream>
00006 #include <string>
00007 #include "tracemf.h"
00008
00009 #undef TRACE_NAME
00010 #define TRACE_NAME "SimpleMemoryReader"
00011
00012 namespace artdaq
00013 {
00014 int SimpleMemoryReaderApp(int argc, char** argv)
00015 {
00016 try
00017 {
00018 size_t eec(0);
00019 if (argc == 2)
00020 {
00021 std::istringstream ins(argv[1]);
00022 ins >> eec;
00023 }
00024 SimpleMemoryReader reader(0xA99, 0xB99, eec);
00025 reader.run();
00026 return 0;
00027 }
00028 catch (std::string const& msg)
00029 {
00030 std::cerr << "SimpleMemoryReaderApp failed: " << msg;
00031 return 1;
00032 }
00033 catch (...)
00034 {
00035 return 1;
00036 }
00037 }
00038
00039 SimpleMemoryReader::
00040 SimpleMemoryReader(uint32_t shm_key, uint32_t broadcast_key, std::size_t eec) :
00041 incoming_events_(new SharedMemoryEventReceiver(shm_key, broadcast_key))
00042 , expectedEventCount_(eec)
00043 {
00044 TLOG(50) << "ctor done (after queue_.setReaderIsReady())" << TLOG_ENDL;
00045 }
00046
00047 void SimpleMemoryReader::run()
00048 {
00049 std::size_t eventsSeen = 0;
00050 auto doPrint = getenv("VERBOSE_QUEUE_READING");
00051 while (true)
00052 {
00053 bool keep_looping = true;
00054 bool got_event = false;
00055 while (keep_looping)
00056 {
00057 keep_looping = false;
00058 got_event = incoming_events_->ReadyForRead();
00059 if (!got_event)
00060 {
00061 TLOG(TLVL_INFO) << "InputFailure: Reading timed out in SharedMemoryReader::readNext()" << TLOG_ENDL;
00062 keep_looping = true;
00063 }
00064 }
00065
00066 if (!got_event) break;
00067
00068 auto errflag = false;
00069 auto evtHeader = incoming_events_->ReadHeader(errflag);
00070 if (errflag) break;
00071 auto fragmentTypes = incoming_events_->GetFragmentTypes(errflag);
00072 if (errflag) break;
00073 if (fragmentTypes.size() == 0)
00074 {
00075 TLOG(TLVL_ERROR) << "Event has no Fragments! Aborting!" << TLOG_ENDL;
00076 incoming_events_->ReleaseBuffer();
00077 break;
00078 }
00079 auto firstFragmentType = *fragmentTypes.begin();
00080
00081
00082
00083
00084
00085
00086 if (!got_event || firstFragmentType == Fragment::EndOfDataFragmentType)
00087 {
00088 TLOG(TLVL_DEBUG) << "Received shutdown message, returning false" << TLOG_ENDL;
00089 incoming_events_->ReleaseBuffer();
00090 break;
00091 }
00092
00093 ++eventsSeen;
00094 RawEvent evt = RawEvent(*evtHeader);
00095 if (doPrint) { std::cout << evt << std::endl; }
00096 incoming_events_->ReleaseBuffer();
00097
00098 }
00099 if (expectedEventCount_ && eventsSeen != expectedEventCount_)
00100 {
00101 std::ostringstream os;
00102 os << "Wrong number of events in SimpleMemoryReader ("
00103 << eventsSeen << " != " << expectedEventCount_ << ").\n";
00104 throw os.str();
00105 }
00106 }
00107 }