artdaq  v2_02_03
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Pages
TransferInterface.hh
1 #ifndef artdaq_ArtModules_TransferInterface_hh
2 #define artdaq_ArtModules_TransferInterface_hh
3 
4 #include "artdaq/DAQdata/Globals.hh"
5 #include "artdaq-core/Data/Fragment.hh"
6 #include "fhiclcpp/ParameterSet.h"
7 
8 #include <limits>
9 #include <iostream>
10 #include <sstream>
11 
12 namespace artdaq
13 {
18  {
19  public:
24  static const int RECV_TIMEOUT = 0xfedcba98;
25 
29  enum class Role
30  {
31  kSend,
32  kReceive
33  };
34 
39  enum class CopyStatus
40  {
41  kSuccess,
42  kTimeout,
44  };
45 
61  TransferInterface(const fhicl::ParameterSet& ps, Role role);
62 
66  TransferInterface(const TransferInterface&) = delete;
67 
73 
77  virtual ~TransferInterface() = default;
78 
87  virtual int receiveFragment(artdaq::Fragment& fragment, size_t receiveTimeout) = 0;
88 
95  virtual CopyStatus copyFragment(artdaq::Fragment& fragment, size_t send_timeout_usec = std::numeric_limits<size_t>::max()) = 0;
96 
97  // Move fragment (should be reliable)
104  virtual CopyStatus moveFragment(artdaq::Fragment&& fragment, size_t send_timeout_usec = std::numeric_limits<size_t>::max()) = 0;
105 
110  std::string uniqueLabel() const { return unique_label_; }
111 
116  int source_rank() const { return source_rank_; }
121  int destination_rank() const { return destination_rank_; }
122  private:
123  const Role role_;
124 
125  const int source_rank_;
126  const int destination_rank_;
127  const std::string unique_label_;
128 
129  protected:
130  size_t buffer_count_;
132  protected:
137  Role role() const { return role_; }
138  };
139 }
140 
141 #define DEFINE_ARTDAQ_TRANSFER(klass) \
142  extern "C" std::unique_ptr<artdaq::TransferInterface> make(fhicl::ParameterSet const & ps, \
143  artdaq::TransferInterface::Role role) { \
144  return std::unique_ptr<artdaq::TransferInterface>(new klass(ps, role)); \
145 }
146 
147 
148 #endif /* artdaq_ArtModules_TransferInterface.hh */
149 
150 // Local Variables:
151 // mode: c++
152 // End:
size_t buffer_count_
The number of Fragment transfers the TransferInterface can handle simultaneously. ...
virtual CopyStatus moveFragment(artdaq::Fragment &&fragment, size_t send_timeout_usec=std::numeric_limits< size_t >::max())=0
Move a Fragment to the destination. This should be reliable, if the underlying transport mechanism su...
TransferInterface & operator=(const TransferInterface &)=delete
Copy Assignment operator is deleted.
Role role() const
Get the TransferInterface::Role of this TransferInterface.
virtual ~TransferInterface()=default
Default virtual Destructor.
static const int RECV_TIMEOUT
Value to be returned upon receive timeout. Because receivers otherwise return rank, this is also the limit on the number of ranks that artdaq currently supports.
int destination_rank() const
Get the destination rank for this TransferInterface instance.
This TransferInterface is a Receiver.
int source_rank() const
Get the source rank for this TransferInterface instance.
virtual int receiveFragment(artdaq::Fragment &fragment, size_t receiveTimeout)=0
Receive a Fragment from the transport mechanism.
This TransferInterface is a Sender.
Some error occurred, but no exception was thrown.
Role
Used to determine if a TransferInterface is a Sender or Receiver.
virtual CopyStatus copyFragment(artdaq::Fragment &fragment, size_t send_timeout_usec=std::numeric_limits< size_t >::max())=0
Copy a Fragment to the destination. May not necessarily be reliable.
The send operation completed successfully.
std::string uniqueLabel() const
Get the unique label of this TransferInterface instance.
This interface defines the functions used to transfer data between artdaq applications.
TransferInterface(const fhicl::ParameterSet &ps, Role role)
TransferInterface Constructor.
CopyStatus
Returned from the send functions, this enumeration describes the possible return codes. If an exception occurs, it will be thrown and should be handled normally.
const size_t max_fragment_size_words_
The maximum size of the transferred Fragment objects, in artdaq::Fragment::RawDataType words...