artdaq  v3_02_00
Autodetect_transfer.cc
1 #define TRACE_NAME "AutodetectTransfer"
2 
3 #include "artdaq/TransferPlugins/TransferInterface.hh"
4 #include "artdaq/TransferPlugins/TCPSocketTransfer.hh"
5 #include "artdaq/TransferPlugins/ShmemTransfer.hh"
6 
7 namespace artdaq
8 {
16  {
17  public:
23  AutodetectTransfer(const fhicl::ParameterSet& pset, Role role);
24 
28  virtual ~AutodetectTransfer() = default;
29 
36  int receiveFragment(artdaq::Fragment& fragment,
37  size_t receiveTimeout) override
38  {
39  return theTransfer_->receiveFragment(fragment, receiveTimeout);
40  }
41 
48  int receiveFragmentHeader(detail::RawFragmentHeader& header, size_t receiveTimeout) override
49  {
50  return theTransfer_->receiveFragmentHeader(header, receiveTimeout);
51  }
52 
59  int receiveFragmentData(RawDataType* destination, size_t wordCount) override
60  {
61  return theTransfer_->receiveFragmentData(destination, wordCount);
62  }
63 
70  CopyStatus copyFragment(artdaq::Fragment& fragment, size_t send_timeout_usec) override
71  {
72  return theTransfer_->copyFragment(fragment, send_timeout_usec);
73  }
74 
81  CopyStatus moveFragment(artdaq::Fragment&& fragment) override
82  {
83  return theTransfer_->moveFragment(std::move(fragment));
84  }
85 
90  bool isRunning() override { return theTransfer_->isRunning(); }
91 
92  private:
93  std::unique_ptr<TransferInterface> theTransfer_;
94  };
95 }
96 
97 artdaq::AutodetectTransfer::AutodetectTransfer(const fhicl::ParameterSet& pset, Role role)
98  : TransferInterface(pset, role)
99 {
100  TLOG(TLVL_INFO) << GetTraceName() << ": Begin AutodetectTransfer constructor" ;
101  std::string srcHost, destHost;
102  auto hosts = pset.get<std::vector<fhicl::ParameterSet>>("host_map");
103  for (auto& ps : hosts)
104  {
105  auto rank = ps.get<int>("rank", -1);
106  if (rank == source_rank())
107  {
108  srcHost = ps.get<std::string>("host", "localhost");
109  }
110  if (rank == destination_rank())
111  {
112  destHost = ps.get<std::string>("host", "localhost");
113  }
114  }
115  TLOG(TLVL_DEBUG) << GetTraceName() << ": srcHost=" << srcHost << ", destHost=" << destHost ;
116  if (srcHost == destHost)
117  {
118  TLOG(TLVL_INFO) << GetTraceName() << ": Constructing ShmemTransfer" ;
119  theTransfer_.reset(new ShmemTransfer(pset, role));
120  }
121  else
122  {
123  TLOG(TLVL_INFO) << GetTraceName() << ": Constructing TCPSocketTransfer" ;
124  theTransfer_.reset(new TCPSocketTransfer(pset, role));
125  }
126 }
127 
128 DEFINE_ARTDAQ_TRANSFER(artdaq::AutodetectTransfer)
bool isRunning() override
Determine whether the TransferInterface plugin is able to send/receive data.
int receiveFragmentHeader(detail::RawFragmentHeader &header, size_t receiveTimeout) override
Receive a Fragment Header from the transport mechanism.
virtual int source_rank() const
Get the source rank for this TransferInterface instance.
Role role() const
Get the TransferInterface::Role of this TransferInterface.
virtual ~AutodetectTransfer()=default
AutodetectTransfer default Destructor.
int receiveFragment(artdaq::Fragment &fragment, size_t receiveTimeout) override
Receive a Fragment, using the underlying transfer plugin.
std::string GetTraceName() const
Constructs a name suitable for TRACE messages.
AutodetectTransfer(const fhicl::ParameterSet &pset, Role role)
AutodetectTransfer Constructor.
CopyStatus copyFragment(artdaq::Fragment &fragment, size_t send_timeout_usec) override
Send a Fragment in non-reliable mode, using the underlying transfer plugin.
Role
Used to determine if a TransferInterface is a Sender or Receiver.
int receiveFragmentData(RawDataType *destination, size_t wordCount) override
Receive the body of a Fragment to the given destination pointer.
A TransferInterface implementation plugin that transfers data using Shared Memory.
This interface defines the functions used to transfer data between artdaq applications.
virtual int destination_rank() const
Get the destination rank for this TransferInterface instance.
CopyStatus moveFragment(artdaq::Fragment &&fragment) override
Send a Fragment in reliable mode, using the underlying transfer plugin.
TransferInterface implementation plugin that sends data using TCP sockets.
The AutodetectTransfer TransferInterface plugin sets up a Shmem_transfer plugin or TCPSocket_transfer...
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.