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 int receiveFragmentHeader(detail::RawFragmentHeader& header, size_t receiveTimeout) override 00047 { 00048 return theTransfer_->receiveFragmentHeader(header, receiveTimeout); 00049 } 00050 00057 int receiveFragmentData(RawDataType* destination, size_t wordCount) override 00058 { 00059 return theTransfer_->receiveFragmentData(destination, wordCount); 00060 } 00061 00068 CopyStatus copyFragment(artdaq::Fragment& fragment, 00069 size_t send_timeout_usec = std::numeric_limits<size_t>::max()) override 00070 { 00071 return theTransfer_->copyFragment(fragment, send_timeout_usec); 00072 } 00073 00080 CopyStatus moveFragment(artdaq::Fragment&& fragment, 00081 size_t send_timeout_usec = std::numeric_limits<size_t>::max()) override 00082 { 00083 return theTransfer_->moveFragment(std::move(fragment), send_timeout_usec); 00084 } 00085 00086 private: 00087 std::unique_ptr<TransferInterface> theTransfer_; 00088 }; 00089 } 00090 00091 artdaq::AutodetectTransfer::AutodetectTransfer(const fhicl::ParameterSet& pset, Role role) 00092 : TransferInterface(pset, role) 00093 { 00094 TLOG_TRACE("AutodetectTransfer") << uniqueLabel() << " Begin AutodetectTransfer constructor" << TLOG_ENDL; 00095 std::string srcHost, destHost; 00096 auto hosts = pset.get<std::vector<fhicl::ParameterSet>>("host_map"); 00097 for (auto& ps : hosts) 00098 { 00099 auto rank = ps.get<int>("rank", -1); 00100 if (rank == source_rank()) 00101 { 00102 srcHost = ps.get<std::string>("host", "localhost"); 00103 } 00104 if (rank == destination_rank()) 00105 { 00106 destHost = ps.get<std::string>("host", "localhost"); 00107 } 00108 } 00109 TLOG_TRACE("AutodetectTransfer") << uniqueLabel() << " ADT: srcHost=" << srcHost << ", destHost=" << destHost << TLOG_ENDL; 00110 if (srcHost == destHost) 00111 { 00112 TLOG_TRACE("AutodetectTransfer") << uniqueLabel() << " ADT: Constructing ShmemTransfer" << TLOG_ENDL; 00113 theTransfer_.reset(new ShmemTransfer(pset, role)); 00114 } 00115 else 00116 { 00117 TLOG_TRACE("AutodetectTransfer") << uniqueLabel() << " ADT: Constructing TCPSocketTransfer" << TLOG_ENDL; 00118 theTransfer_.reset(new TCPSocketTransfer(pset, role)); 00119 } 00120 } 00121 00122 DEFINE_ARTDAQ_TRANSFER(artdaq::AutodetectTransfer)