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
00085 virtual int receiveFragment(artdaq::Fragment& fragment, size_t receiveTimeout);
00086
00093 virtual int receiveFragmentHeader(detail::RawFragmentHeader& header, size_t receiveTimeout) = 0;
00094
00104 virtual int receiveFragmentData(RawDataType* destination, size_t wordCount) = 0;
00105
00112 virtual CopyStatus copyFragment(artdaq::Fragment& fragment, size_t send_timeout_usec = std::numeric_limits<size_t>::max()) = 0;
00113
00114
00121 virtual CopyStatus moveFragment(artdaq::Fragment&& fragment, size_t send_timeout_usec = std::numeric_limits<size_t>::max()) = 0;
00122
00127 std::string uniqueLabel() const { return unique_label_; }
00128
00133 virtual int source_rank() const { return source_rank_; }
00138 virtual int destination_rank() const { return destination_rank_; }
00139 private:
00140 const Role role_;
00141
00142 const int source_rank_;
00143 const int destination_rank_;
00144 const std::string unique_label_;
00145
00146 protected:
00147 size_t buffer_count_;
00148 const size_t max_fragment_size_words_;
00149 protected:
00154 Role role() const { return role_; }
00155 };
00156 }
00157
00158 #define DEFINE_ARTDAQ_TRANSFER(klass) \
00159 extern "C" std::unique_ptr<artdaq::TransferInterface> make(fhicl::ParameterSet const & ps, \
00160 artdaq::TransferInterface::Role role) { \
00161 return std::unique_ptr<artdaq::TransferInterface>(new klass(ps, role)); \
00162 }
00163
00164
00165 #endif
00166
00167
00168
00169