00001 #include "artdaq-core/Core/SimpleMemoryReader.hh"
00002
00003 #include <chrono>
00004 #include <cstddef>
00005 #include <iostream>
00006 #include <string>
00007 #include <thread>
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: "
00029 << msg;
00030 return 1;
00031 }
00032 catch (...)
00033 {
00034 return 1;
00035 }
00036 }
00037
00038 SimpleMemoryReader::
00039 SimpleMemoryReader(uint32_t shm_key,uint32_t broadcast_key, std::size_t eec) :
00040 incoming_events_(new SharedMemoryEventReceiver(shm_key, broadcast_key))
00041 , expectedEventCount_(eec)
00042 {
00043 TLOG_ARB(50, "SimpleMemoryReader") <<"ctor done (after queue_.setReaderIsReady())" << TLOG_ENDL;
00044 }
00045
00046 void SimpleMemoryReader::run()
00047 {
00048 std::size_t eventsSeen = 0;
00049 auto doPrint = getenv("VERBOSE_QUEUE_READING");
00050 while (true)
00051 {
00052 bool keep_looping = true;
00053 bool got_event = false;
00054 while (keep_looping)
00055 {
00056 keep_looping = false;
00057 got_event = incoming_events_->ReadyForRead();
00058 if (!got_event)
00059 {
00060 TLOG_INFO("SharedMemoryReader")
00061 << "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_ERROR("SharedMemoryReader") << "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_DEBUG("SharedMemoryReader") << "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 }