$treeview $search $mathjax $extrastylesheet
artdaq_core
v3_05_08
$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]); 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) break; 00064 00065 auto errflag = false; 00066 auto evtHeader = incoming_events_->ReadHeader(errflag); 00067 if (errflag) break; // Buffer was changed out from under reader! 00068 auto fragmentTypes = incoming_events_->GetFragmentTypes(errflag); 00069 if (errflag) break; // Buffer was changed out from under reader! 00070 if (fragmentTypes.size() == 0) 00071 { 00072 TLOG(TLVL_ERROR) << "Event has no Fragments! Aborting!"; 00073 incoming_events_->ReleaseBuffer(); 00074 break; 00075 } 00076 auto firstFragmentType = *fragmentTypes.begin(); 00077 00078 // We return false, indicating we're done reading, if: 00079 // 1) we did not obtain an event, because we timed out and were 00080 // configured NOT to keep trying after a timeout, or 00081 // 2) the event we read was the end-of-data marker: a null 00082 // pointer 00083 if (!got_event || firstFragmentType == Fragment::EndOfDataFragmentType) 00084 { 00085 TLOG(TLVL_DEBUG) << "Received shutdown message, returning false"; 00086 incoming_events_->ReleaseBuffer(); 00087 break; 00088 } 00089 00090 ++eventsSeen; 00091 RawEvent evt = RawEvent(*evtHeader); 00092 if (doPrint) { std::cout << evt << std::endl; } 00093 incoming_events_->ReleaseBuffer(); 00094 } 00095 if (expectedEventCount_ && eventsSeen != expectedEventCount_) 00096 { 00097 std::ostringstream os; 00098 os << "Wrong number of events in SimpleMemoryReader (" 00099 << eventsSeen << " != " << expectedEventCount_ << ").\n"; 00100 throw os.str(); 00101 } 00102 } 00103 } // namespace artdaq