00001 #define TRACE_NAME "AutodetectTransfer" 00002 00003 #include "artdaq/TransferPlugins/TransferInterface.hh" 00004 #include "artdaq/TransferPlugins/TCPSocketTransfer.hh" 00005 #include "artdaq/TransferPlugins/ShmemTransfer.hh" 00006 00007 namespace artdaq 00008 { 00015 class AutodetectTransfer : public TransferInterface 00016 { 00017 public: 00023 AutodetectTransfer(const fhicl::ParameterSet& pset, Role role); 00024 00028 virtual ~AutodetectTransfer() = default; 00029 00036 int receiveFragment(artdaq::Fragment& fragment, 00037 size_t receiveTimeout) override 00038 { 00039 return theTransfer_->receiveFragment(fragment, receiveTimeout); 00040 } 00041 00048 int receiveFragmentHeader(detail::RawFragmentHeader& header, size_t receiveTimeout) override 00049 { 00050 return theTransfer_->receiveFragmentHeader(header, receiveTimeout); 00051 } 00052 00059 int receiveFragmentData(RawDataType* destination, size_t wordCount) override 00060 { 00061 return theTransfer_->receiveFragmentData(destination, wordCount); 00062 } 00063 00070 CopyStatus copyFragment(artdaq::Fragment& fragment, size_t send_timeout_usec) override 00071 { 00072 return theTransfer_->copyFragment(fragment, send_timeout_usec); 00073 } 00074 00081 CopyStatus moveFragment(artdaq::Fragment&& fragment) override 00082 { 00083 return theTransfer_->moveFragment(std::move(fragment)); 00084 } 00085 00090 bool isRunning() override { return theTransfer_->isRunning(); } 00091 00092 private: 00093 std::unique_ptr<TransferInterface> theTransfer_; 00094 }; 00095 } 00096 00097 artdaq::AutodetectTransfer::AutodetectTransfer(const fhicl::ParameterSet& pset, Role role) 00098 : TransferInterface(pset, role) 00099 { 00100 TLOG(TLVL_INFO) << GetTraceName() << ": Begin AutodetectTransfer constructor" ; 00101 std::string srcHost, destHost; 00102 auto hosts = pset.get<std::vector<fhicl::ParameterSet>>("host_map"); 00103 for (auto& ps : hosts) 00104 { 00105 auto rank = ps.get<int>("rank", -1); 00106 if (rank == source_rank()) 00107 { 00108 srcHost = ps.get<std::string>("host", "localhost"); 00109 } 00110 if (rank == destination_rank()) 00111 { 00112 destHost = ps.get<std::string>("host", "localhost"); 00113 } 00114 } 00115 TLOG(TLVL_DEBUG) << GetTraceName() << ": srcHost=" << srcHost << ", destHost=" << destHost ; 00116 if (srcHost == destHost) 00117 { 00118 TLOG(TLVL_INFO) << GetTraceName() << ": Constructing ShmemTransfer" ; 00119 theTransfer_.reset(new ShmemTransfer(pset, role)); 00120 } 00121 else 00122 { 00123 TLOG(TLVL_INFO) << GetTraceName() << ": Constructing TCPSocketTransfer" ; 00124 theTransfer_.reset(new TCPSocketTransfer(pset, role)); 00125 } 00126 } 00127 00128 DEFINE_ARTDAQ_TRANSFER(artdaq::AutodetectTransfer)