$treeview $search $mathjax $extrastylesheet
artdaq_core
v3_04_20a
$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 { 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())" ; 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()" ; 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; // Buffer was changed out from under reader! 00069 auto fragmentTypes = incoming_events_->GetFragmentTypes(errflag); 00070 if (errflag) break; // Buffer was changed out from under reader! 00071 if (fragmentTypes.size() == 0) 00072 { 00073 TLOG(TLVL_ERROR) << "Event has no Fragments! Aborting!" ; 00074 incoming_events_->ReleaseBuffer(); 00075 break; 00076 } 00077 auto firstFragmentType = *fragmentTypes.begin(); 00078 00079 // We return false, indicating we're done reading, if: 00080 // 1) we did not obtain an event, because we timed out and were 00081 // configured NOT to keep trying after a timeout, or 00082 // 2) the event we read was the end-of-data marker: a null 00083 // pointer 00084 if (!got_event || firstFragmentType == Fragment::EndOfDataFragmentType) 00085 { 00086 TLOG(TLVL_DEBUG) << "Received shutdown message, returning false" ; 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 }