00001 #ifndef artdaq_ArtModules_TransferInterface_hh 00002 #define artdaq_ArtModules_TransferInterface_hh 00003 00004 #include "artdaq/DAQdata/Globals.hh" 00005 #include "artdaq-core/Data/Fragment.hh" 00006 #include "fhiclcpp/ParameterSet.h" 00007 00008 #include <limits> 00009 #include <iostream> 00010 #include <sstream> 00011 00012 namespace artdaq 00013 { 00017 class TransferInterface 00018 { 00019 public: 00024 static const int RECV_TIMEOUT = 0xfedcba98; 00025 00029 enum class Role 00030 { 00031 kSend, 00032 kReceive 00033 }; 00034 00039 enum class CopyStatus 00040 { 00041 kSuccess, 00042 kTimeout, 00043 kErrorNotRequiringException 00044 }; 00045 00061 TransferInterface(const fhicl::ParameterSet& ps, Role role); 00062 00066 TransferInterface(const TransferInterface&) = delete; 00067 00072 TransferInterface& operator=(const TransferInterface&) = delete; 00073 00077 virtual ~TransferInterface() = default; 00078 00087 virtual int receiveFragment(artdaq::Fragment& fragment, size_t receiveTimeout) = 0; 00088 00095 virtual CopyStatus copyFragment(artdaq::Fragment& fragment, size_t send_timeout_usec = std::numeric_limits<size_t>::max()) = 0; 00096 00097 // Move fragment (should be reliable) 00104 virtual CopyStatus moveFragment(artdaq::Fragment&& fragment, size_t send_timeout_usec = std::numeric_limits<size_t>::max()) = 0; 00105 00110 std::string uniqueLabel() const { return unique_label_; } 00111 00116 virtual int source_rank() const { return source_rank_; } 00121 virtual int destination_rank() const { return destination_rank_; } 00122 private: 00123 const Role role_; 00124 00125 const int source_rank_; 00126 const int destination_rank_; 00127 const std::string unique_label_; 00128 00129 protected: 00130 size_t buffer_count_; 00131 const size_t max_fragment_size_words_; 00132 protected: 00137 Role role() const { return role_; } 00138 }; 00139 } 00140 00141 #define DEFINE_ARTDAQ_TRANSFER(klass) \ 00142 extern "C" std::unique_ptr<artdaq::TransferInterface> make(fhicl::ParameterSet const & ps, \ 00143 artdaq::TransferInterface::Role role) { \ 00144 return std::unique_ptr<artdaq::TransferInterface>(new klass(ps, role)); \ 00145 } 00146 00147 00148 #endif /* artdaq_ArtModules_TransferInterface.hh */ 00149 00150 // Local Variables: 00151 // mode: c++ 00152 // End: