$treeview $search $mathjax $extrastylesheet
artdaq
v3_04_00
$projectbrief
|
$projectbrief
|
$searchbox |
00001 #include "artdaq/TransferPlugins/TransferInterface.hh" 00002 00003 #include "artdaq/RTIDDS/RTIDDS.hh" 00004 00005 #include "artdaq-core/Utilities/ExceptionHandler.hh" 00006 #include <memory> 00007 #include <iostream> 00008 00009 00010 namespace fhicl 00011 { 00012 class ParameterSet; 00013 } 00014 00015 // ---------------------------------------------------------------------- 00016 00017 namespace artdaq 00018 { 00022 class RTIDDSTransfer : public TransferInterface 00023 { 00024 public: 00028 virtual ~RTIDDSTransfer() = default; 00029 00037 RTIDDSTransfer(fhicl::ParameterSet const& ps, Role role) : 00038 TransferInterface(ps, role) 00039 , rtidds_reader_(std::make_unique<artdaq::RTIDDS>("RTIDDSTransfer_reader", artdaq::RTIDDS::IOType::reader)) 00040 , rtidds_writer_(std::make_unique<artdaq::RTIDDS>("RTIDDSTransfer_writer", artdaq::RTIDDS::IOType::writer)) { } 00041 00048 int receiveFragment(artdaq::Fragment& fragment, 00049 size_t receiveTimeout) override; 00050 00057 CopyStatus transfer_fragment_min_blocking_mode(artdaq::Fragment const& fragment, 00058 size_t send_timeout_usec = std::numeric_limits<size_t>::max()) override; 00059 00065 CopyStatus transfer_fragment_reliable_mode(artdaq::Fragment&& fragment) override; 00066 00071 bool isRunning() override 00072 { 00073 switch (role()) 00074 { 00075 case TransferInterface::Role::kSend: 00076 return rtidds_writer_ != nullptr; 00077 case TransferInterface::Role::kReceive: 00078 return rtidds_reader_ != nullptr; 00079 } 00080 } 00081 00086 void flush_buffers() override {} 00087 private: 00088 std::unique_ptr<artdaq::RTIDDS> rtidds_reader_; 00089 std::unique_ptr<artdaq::RTIDDS> rtidds_writer_; 00090 }; 00091 } 00092 00093 int artdaq::RTIDDSTransfer::receiveFragment(artdaq::Fragment& fragment, 00094 size_t receiveTimeout) 00095 { 00096 bool receivedFragment = false; 00097 // static std::size_t consecutive_timeouts = 0; 00098 // std::size_t message_after_N_timeouts = 10; 00099 00100 // while (!receivedFragment) { 00101 00102 try 00103 { 00104 receivedFragment = rtidds_reader_->octets_listener_.receiveFragmentFromDDS(fragment, receiveTimeout); 00105 } 00106 catch (...) 00107 { 00108 ExceptionHandler(ExceptionHandlerRethrow::yes, 00109 "Error in RTIDDS transfer plugin: caught exception in call to OctetsListener::receiveFragmentFromDDS, rethrowing"); 00110 } 00111 00112 // if (!receivedFragment) { 00113 00114 // consecutive_timeouts++; 00115 00116 // if (consecutive_timeouts % message_after_N_timeouts == 0) { 00117 // TLOG_INFO("RTIDDSTransfer") << consecutive_timeouts << " consecutive " << 00118 // static_cast<float>(receiveTimeout)/1e6 << "-second timeouts calling OctetsListener::receiveFragmentFromDDS, will continue trying..." ; 00119 // } 00120 // } else { 00121 // consecutive_timeouts = 0; 00122 // } 00123 // } 00124 00125 // return 0; 00126 00127 return receivedFragment ? source_rank() : TransferInterface::RECV_TIMEOUT; 00128 } 00129 00130 artdaq::TransferInterface::CopyStatus 00131 artdaq::RTIDDSTransfer::transfer_fragment_reliable_mode(artdaq::Fragment&& fragment) 00132 { 00133 rtidds_writer_->transfer_fragment_reliable_mode_via_DDS_(std::move(fragment)); 00134 return CopyStatus::kSuccess; 00135 } 00136 00137 artdaq::TransferInterface::CopyStatus 00138 artdaq::RTIDDSTransfer::transfer_fragment_min_blocking_mode(artdaq::Fragment const& fragment, 00139 size_t send_timeout_usec) 00140 { 00141 (void) &send_timeout_usec; // No-op to get the compiler not to complain about unused parameter 00142 00143 rtidds_writer_->transfer_fragment_min_blocking_mode_via_DDS_(fragment); 00144 return CopyStatus::kSuccess; 00145 } 00146 00147 DEFINE_ARTDAQ_TRANSFER(artdaq::RTIDDSTransfer) 00148 00149 // Local Variables: 00150 // mode: c++ 00151 // End: