00001 #ifndef artdaq_TransferPlugins_ShmemTransfer_hh 00002 #define artdaq_TransferPlugins_ShemmTransfer_hh 00003 00004 #include <fhiclcpp/fwd.h> 00005 #include <atomic> 00006 00007 #include "artdaq/TransferPlugins/TransferInterface.hh" 00008 00009 #define BUFFER_EMPTY 0UL 00010 #define WRITING_FRAGMENT 1UL 00011 #define FRAGMENT_READY 2UL 00012 #define READING_FRAGMENT 3UL 00013 00014 namespace artdaq 00015 { 00019 class ShmemTransfer : public TransferInterface 00020 { 00021 public: 00022 00034 ShmemTransfer(fhicl::ParameterSet const& pset, Role role); 00035 00039 virtual ~ShmemTransfer() noexcept; 00040 00047 int receiveFragment(Fragment& fragment, 00048 size_t receiveTimeout) override; 00049 00056 CopyStatus copyFragment(Fragment& fragment, 00057 size_t send_timeout_usec = std::numeric_limits<size_t>::max()) override; 00058 00065 CopyStatus moveFragment(Fragment&& fragment, 00066 size_t send_timeout_usec = std::numeric_limits<size_t>::max()) override; 00067 00068 private: 00069 CopyStatus sendFragment(Fragment&& fragment, 00070 size_t send_timeout_usec, bool reliable = false); 00071 00072 bool readyForRead_(); 00073 00074 bool readyForWrite_(); 00075 00076 RawDataType* offsetToPtr(size_t offset); 00077 00078 struct ShmBuffer 00079 { 00080 size_t offset; 00081 size_t fragmentSizeWords; 00082 std::atomic<unsigned int> sem; 00083 unsigned int writeCount; 00084 }; 00085 00086 struct ShmStruct 00087 { 00088 std::atomic<unsigned int> read_pos; 00089 std::atomic<unsigned int> write_pos; 00090 ShmBuffer buffers[100]; 00091 }; 00092 00093 00094 size_t send_timeout_usec_; 00095 int shm_segment_id_; 00096 ShmStruct* shm_ptr_; 00097 int shm_key_; 00098 00099 Role role_; 00100 }; 00101 } 00102 00103 #endif // artdaq_TransferPlugins/ShmemTransfer_hh