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 namespace artdaq
00010 {
00011 int SimpleMemoryReaderApp(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 SimpleMemoryReader reader(0xA99,0xB99,eec);
00022 reader.run();
00023 return 0;
00024 }
00025 catch (std::string const& msg)
00026 {
00027 std::cerr << "SimpleMemoryReaderApp failed: "
00028 << 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_ARB(50, "SimpleMemoryReader") <<"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_INFO("SharedMemoryReader")
00060 << "InputFailure: Reading timed out in SharedMemoryReader::readNext()" << TLOG_ENDL;
00061 keep_looping = true;
00062 }
00063 }
00064
00065 if (!got_event) break;
00066
00067 auto errflag = false;
00068 auto evtHeader = incoming_events_->ReadHeader(errflag);
00069 if (errflag) break;
00070 auto fragmentTypes = incoming_events_->GetFragmentTypes(errflag);
00071 if (errflag) break;
00072 if (fragmentTypes.size() == 0)
00073 {
00074 TLOG_ERROR("SharedMemoryReader") << "Event has no Fragments! Aborting!" << TLOG_ENDL;
00075 incoming_events_->ReleaseBuffer();
00076 break;
00077 }
00078 auto firstFragmentType = *fragmentTypes.begin();
00079
00080
00081
00082
00083
00084
00085 if (!got_event || firstFragmentType == Fragment::EndOfDataFragmentType)
00086 {
00087 TLOG_DEBUG("SharedMemoryReader") << "Received shutdown message, returning false" << TLOG_ENDL;
00088 incoming_events_->ReleaseBuffer();
00089 break;
00090 }
00091
00092 ++eventsSeen;
00093 RawEvent evt = RawEvent(*evtHeader);
00094 if (doPrint) { std::cout << evt << std::endl; }
00095 incoming_events_->ReleaseBuffer();
00096
00097 }
00098 if (expectedEventCount_ && eventsSeen != expectedEventCount_)
00099 {
00100 std::ostringstream os;
00101 os << "Wrong number of events in SimpleMemoryReader ("
00102 << eventsSeen << " != " << expectedEventCount_ << ").\n";
00103 throw os.str();
00104 }
00105 }
00106 }