00001 #ifndef artdaq_core_Core_SharedMemoryEventReceiver_hh 00002 #define artdaq_core_Core_SharedMemoryEventReceiver_hh 1 00003 00004 #include <set> 00005 00006 #include "artdaq-core/Core/SharedMemoryManager.hh" 00007 #include "artdaq-core/Data/Fragment.hh" 00008 #include "artdaq-core/Data/RawEvent.hh" 00009 00010 namespace artdaq 00011 { 00015 class SharedMemoryEventReceiver 00016 { 00017 public: 00023 SharedMemoryEventReceiver(uint32_t shm_key, uint32_t broadcast_shm_key); 00027 virtual ~SharedMemoryEventReceiver() = default; 00028 00035 bool ReadyForRead(bool broadcast = false, size_t timeout_us = 1000000); 00036 00042 detail::RawEventHeader* ReadHeader(bool& err); 00043 00049 std::set<Fragment::type_t> GetFragmentTypes(bool& err); 00050 00057 std::unique_ptr<Fragments> GetFragmentsByType(bool& err, Fragment::type_t type); 00058 00063 std::string toString(); 00064 00068 void ReleaseBuffer(); 00069 00074 int GetRank() { return data_.GetRank(); } 00075 00080 int ReadReadyCount() { return data_.ReadReadyCount() + broadcasts_.ReadReadyCount(); } 00081 00086 size_t size() { return data_.size(); } 00087 00088 private: 00089 std::string printBuffers_(SharedMemoryManager* data_source); 00090 00091 int current_read_buffer_; 00092 bool initialized_; 00093 detail::RawEventHeader* current_header_; 00094 SharedMemoryManager* current_data_source_; 00095 SharedMemoryManager data_; 00096 SharedMemoryManager broadcasts_; 00097 }; 00098 } // artdaq 00099 00100 #endif /* artdaq_core_Core_SharedMemoryEventReceiver_hh */