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 GetMyId() { return data_.GetMyId(); } 00081 00086 int ReadReadyCount() { return data_.ReadReadyCount() + broadcasts_.ReadReadyCount(); } 00087 00092 size_t size() { return data_.size(); } 00093 00094 private: 00095 std::string printBuffers_(SharedMemoryManager* data_source); 00096 00097 int current_read_buffer_; 00098 bool initialized_; 00099 detail::RawEventHeader* current_header_; 00100 SharedMemoryManager* current_data_source_; 00101 SharedMemoryManager data_; 00102 SharedMemoryManager broadcasts_; 00103 }; 00104 } // artdaq 00105 00106 #endif /* artdaq_core_Core_SharedMemoryEventReceiver_hh */