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 #include "cetlib/compiler_macros.h"
00008
00009 #include <limits>
00010 #include <iostream>
00011 #include <sstream>
00012
00013 namespace artdaq
00014 {
00018 class TransferInterface
00019 {
00020 public:
00021 enum : int {
00022 DATA_END = -2222,
00023 RECV_TIMEOUT = -1111,
00024 RECV_SUCCESS = 0
00025 };
00026
00030 enum class Role
00031 {
00032 kSend,
00033 kReceive
00034 };
00035
00040 enum class CopyStatus
00041 {
00042 kSuccess,
00043 kTimeout,
00044 kErrorNotRequiringException
00045 };
00046
00047 static std::string CopyStatusToString(CopyStatus in)
00048 {
00049 switch (in)
00050 {
00051 case CopyStatus::kSuccess: return "Success";
00052 case CopyStatus::kTimeout: return "Timeout";
00053 case CopyStatus::kErrorNotRequiringException: return "Error";
00054 default: return "UNKNOWN";
00055 }
00056 return "SWITCHERROR";
00057 }
00058
00074 TransferInterface(const fhicl::ParameterSet& ps, Role role);
00075
00079 TransferInterface(const TransferInterface&) = delete;
00080
00085 TransferInterface& operator=(const TransferInterface&) = delete;
00086
00090 virtual ~TransferInterface() = default;
00091
00098 virtual int receiveFragment(artdaq::Fragment& fragment, size_t receiveTimeout);
00099
00106 virtual int receiveFragmentHeader(detail::RawFragmentHeader& header, size_t receiveTimeout) = 0;
00107
00117 virtual int receiveFragmentData(RawDataType* destination, size_t wordCount) = 0;
00118
00125 virtual CopyStatus copyFragment(artdaq::Fragment& fragment, size_t send_timeout_usec) = 0;
00126
00127
00133 virtual CopyStatus moveFragment(artdaq::Fragment&& fragment) = 0;
00134
00139 std::string uniqueLabel() const { return unique_label_; }
00140
00145 virtual int source_rank() const { return source_rank_; }
00150 virtual int destination_rank() const { return destination_rank_; }
00151
00152
00157 std::string GetTraceName() const { return unique_label_ + (role_ == Role::kSend ? "_SEND" : "_RECV"); }
00158 private:
00159 const Role role_;
00160
00161 const int source_rank_;
00162 const int destination_rank_;
00163 const std::string unique_label_;
00164
00169 int GetPartitionNumber() const;
00170
00171 protected:
00172 size_t buffer_count_;
00173 const size_t max_fragment_size_words_;
00174 const short partition_number_;
00175
00176 protected:
00181 Role role() const { return role_; }
00182 };
00183 }
00184
00185 #ifndef EXTERN_C_FUNC_DECLARE_START
00186 #define EXTERN_C_FUNC_DECLARE_START extern "C" {
00187 #endif
00188
00189 #define DEFINE_ARTDAQ_TRANSFER(klass) \
00190 EXTERN_C_FUNC_DECLARE_START \
00191 std::unique_ptr<artdaq::TransferInterface> make(fhicl::ParameterSet const & ps, \
00192 artdaq::TransferInterface::Role role) { \
00193 return std::unique_ptr<artdaq::TransferInterface>(new klass(ps, role)); \
00194 }}
00195
00196
00197 #endif
00198
00199
00200
00201