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 00080 CopyStatus moveFragment(artdaq::Fragment&& fragment) override 00081 { 00082 return theTransfer_->moveFragment(std::move(fragment)); 00083 } 00084 00089 bool isRunning() override { return theTransfer_->isRunning(); } 00090 00091 private: 00092 std::unique_ptr<TransferInterface> theTransfer_; 00093 }; 00094 } 00095 00096 artdaq::AutodetectTransfer::AutodetectTransfer(const fhicl::ParameterSet& pset, Role role) 00097 : TransferInterface(pset, role) 00098 { 00099 TLOG(TLVL_INFO) << GetTraceName() << ": Begin AutodetectTransfer constructor" ; 00100 std::string srcHost, destHost; 00101 auto hosts = pset.get<std::vector<fhicl::ParameterSet>>("host_map"); 00102 for (auto& ps : hosts) 00103 { 00104 auto rank = ps.get<int>("rank", -1); 00105 if (rank == source_rank()) 00106 { 00107 srcHost = ps.get<std::string>("host", "localhost"); 00108 } 00109 if (rank == destination_rank()) 00110 { 00111 destHost = ps.get<std::string>("host", "localhost"); 00112 } 00113 } 00114 TLOG(TLVL_DEBUG) << GetTraceName() << ": srcHost=" << srcHost << ", destHost=" << destHost ; 00115 if (srcHost == destHost) 00116 { 00117 TLOG(TLVL_INFO) << GetTraceName() << ": Constructing ShmemTransfer" ; 00118 theTransfer_.reset(new ShmemTransfer(pset, role)); 00119 } 00120 else 00121 { 00122 TLOG(TLVL_INFO) << GetTraceName() << ": Constructing TCPSocketTransfer" ; 00123 theTransfer_.reset(new TCPSocketTransfer(pset, role)); 00124 } 00125 } 00126 00127 DEFINE_ARTDAQ_TRANSFER(artdaq::AutodetectTransfer)