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