00001 #include "artdaq/TransferPlugins/TransferInterface.hh" 00002 #include "artdaq/TransferPlugins/TCPSocketTransfer.hh" 00003 #include "artdaq/TransferPlugins/ShmemTransfer.hh" 00004 00005 namespace artdaq 00006 { 00013 class AutodetectTransfer : public TransferInterface 00014 { 00015 public: 00021 AutodetectTransfer(const fhicl::ParameterSet& pset, Role role); 00022 00026 virtual ~AutodetectTransfer() = default; 00027 00034 int receiveFragment(artdaq::Fragment& fragment, 00035 size_t receiveTimeout) override 00036 { 00037 return theTransfer_->receiveFragment(fragment, receiveTimeout); 00038 } 00039 00046 CopyStatus copyFragment(artdaq::Fragment& fragment, 00047 size_t send_timeout_usec = std::numeric_limits<size_t>::max()) override 00048 { 00049 return theTransfer_->copyFragment(fragment, send_timeout_usec); 00050 } 00051 00058 CopyStatus moveFragment(artdaq::Fragment&& fragment, 00059 size_t send_timeout_usec = std::numeric_limits<size_t>::max()) override 00060 { 00061 return theTransfer_->moveFragment(std::move(fragment), send_timeout_usec); 00062 } 00063 00064 private: 00065 std::unique_ptr<TransferInterface> theTransfer_; 00066 }; 00067 } 00068 00069 artdaq::AutodetectTransfer::AutodetectTransfer(const fhicl::ParameterSet& pset, Role role) 00070 : TransferInterface(pset, role) 00071 { 00072 TLOG_DEBUG(uniqueLabel()) << "Begin AutodetectTransfer constructor" << TLOG_ENDL; 00073 std::string srcHost, destHost; 00074 auto hosts = pset.get<std::vector<fhicl::ParameterSet>>("host_map"); 00075 for (auto& ps : hosts) 00076 { 00077 auto rank = ps.get<int>("rank", -1); 00078 if (rank == source_rank()) 00079 { 00080 srcHost = ps.get<std::string>("host", "localhost"); 00081 } 00082 if (rank == destination_rank()) 00083 { 00084 destHost = ps.get<std::string>("host", "localhost"); 00085 } 00086 } 00087 TLOG_DEBUG(uniqueLabel()) << "ADT: srcHost=" << srcHost << ", destHost=" << destHost << TLOG_ENDL; 00088 if (srcHost == destHost) 00089 { 00090 TLOG_DEBUG(uniqueLabel()) << "ADT: Constructing ShmemTransfer" << TLOG_ENDL; 00091 theTransfer_.reset(new ShmemTransfer(pset, role)); 00092 } 00093 else 00094 { 00095 TLOG_DEBUG(uniqueLabel()) << "ADT: Constructing TCPSocketTransfer" << TLOG_ENDL; 00096 theTransfer_.reset(new TCPSocketTransfer(pset, role)); 00097 } 00098 } 00099 00100 DEFINE_ARTDAQ_TRANSFER(artdaq::AutodetectTransfer)