$treeview $search $mathjax $extrastylesheet
artdaq_core
v3_06_01
$projectbrief
|
$projectbrief
|
$searchbox |
00001 #define TRACE_NAME "SimpleMemoryReader" 00002 #include "artdaq-core/Core/SimpleMemoryReader.hh" 00003 00004 #include <chrono> // for milliseconds 00005 #include <cstddef> // for std::size_t 00006 #include <iostream> 00007 #include <string> 00008 #include "tracemf.h" // TRACE 00009 00010 namespace artdaq { 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]); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic) 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: " << msg; 00028 return 1; 00029 } 00030 catch (...) 00031 { 00032 return 1; 00033 } 00034 } 00035 00036 SimpleMemoryReader:: 00037 SimpleMemoryReader(uint32_t shm_key, uint32_t broadcast_key, std::size_t eec) 00038 : incoming_events_(new SharedMemoryEventReceiver(shm_key, broadcast_key)) 00039 , expectedEventCount_(eec) 00040 { 00041 TLOG(50) << "ctor done (after queue_.setReaderIsReady())"; 00042 } 00043 00044 void SimpleMemoryReader::run() 00045 { 00046 std::size_t eventsSeen = 0; 00047 auto doPrint = getenv("VERBOSE_QUEUE_READING"); 00048 while (true) 00049 { 00050 bool keep_looping = true; 00051 bool got_event = false; 00052 while (keep_looping) 00053 { 00054 keep_looping = false; 00055 got_event = incoming_events_->ReadyForRead(); 00056 if (!got_event) 00057 { 00058 TLOG(TLVL_INFO) << "InputFailure: Reading timed out in SharedMemoryReader::readNext()"; 00059 keep_looping = true; 00060 } 00061 } 00062 00063 if (!got_event) 00064 { 00065 break; 00066 } 00067 00068 auto errflag = false; 00069 auto evtHeader = incoming_events_->ReadHeader(errflag); 00070 if (errflag) 00071 { 00072 break; // Buffer was changed out from under reader! 00073 } 00074 auto fragmentTypes = incoming_events_->GetFragmentTypes(errflag); 00075 if (errflag) 00076 { 00077 break; // Buffer was changed out from under reader! 00078 } 00079 if (fragmentTypes.empty()) 00080 { 00081 TLOG(TLVL_ERROR) << "Event has no Fragments! Aborting!"; 00082 incoming_events_->ReleaseBuffer(); 00083 break; 00084 } 00085 auto firstFragmentType = *fragmentTypes.begin(); 00086 00087 // We return false, indicating we're done reading, if: 00088 // 1) we did not obtain an event, because we timed out and were 00089 // configured NOT to keep trying after a timeout, or 00090 // 2) the event we read was the end-of-data marker: a null 00091 // pointer 00092 if (!got_event || firstFragmentType == Fragment::EndOfDataFragmentType) 00093 { 00094 TLOG(TLVL_DEBUG) << "Received shutdown message, returning false"; 00095 incoming_events_->ReleaseBuffer(); 00096 break; 00097 } 00098 00099 ++eventsSeen; 00100 RawEvent evt = RawEvent(*evtHeader); 00101 if (doPrint != nullptr) { std::cout << evt << std::endl; } 00102 incoming_events_->ReleaseBuffer(); 00103 } 00104 if ((expectedEventCount_ != 0u) && eventsSeen != expectedEventCount_) 00105 { 00106 throw cet::exception("SimpleMemoryReader") // NOLINT(cert-err60-cpp) 00107 << "Wrong number of events in SimpleMemoryReader (" 00108 << eventsSeen << " != " << expectedEventCount_ << ")."; 00109 } 00110 } 00111 } // namespace artdaq