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 copyFragment(artdaq::Fragment& fragment,
00058 size_t send_timeout_usec = std::numeric_limits<size_t>::max()) override;
00059
00066 CopyStatus moveFragment(artdaq::Fragment&& fragment,
00067 size_t send_timeout_usec = std::numeric_limits<size_t>::max()) override;
00068
00069 private:
00070 std::unique_ptr<artdaq::RTIDDS> rtidds_reader_;
00071 std::unique_ptr<artdaq::RTIDDS> rtidds_writer_;
00072 };
00073 }
00074
00075 int artdaq::RTIDDSTransfer::receiveFragment(artdaq::Fragment& fragment,
00076 size_t receiveTimeout)
00077 {
00078 bool receivedFragment = false;
00079
00080
00081
00082
00083
00084 try
00085 {
00086 receivedFragment = rtidds_reader_->octets_listener_.receiveFragmentFromDDS(fragment, receiveTimeout);
00087 }
00088 catch (...)
00089 {
00090 ExceptionHandler(ExceptionHandlerRethrow::yes,
00091 "Error in RTIDDS transfer plugin: caught exception in call to OctetsListener::receiveFragmentFromDDS, rethrowing");
00092 }
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 return receivedFragment ? source_rank() : TransferInterface::RECV_TIMEOUT;
00110 }
00111
00112 artdaq::TransferInterface::CopyStatus
00113 artdaq::RTIDDSTransfer::moveFragment(artdaq::Fragment&& fragment, size_t send_timeout_usec)
00114 {
00115 (void)&send_timeout_usec;
00116
00117 rtidds_writer_->moveFragmentToDDS_(std::move(fragment));
00118 return CopyStatus::kSuccess;
00119 }
00120
00121 artdaq::TransferInterface::CopyStatus
00122 artdaq::RTIDDSTransfer::copyFragment(artdaq::Fragment& fragment,
00123 size_t send_timeout_usec)
00124 {
00125 (void) &send_timeout_usec;
00126
00127 rtidds_writer_->copyFragmentToDDS_(fragment);
00128 return CopyStatus::kSuccess;
00129 }
00130
00131 DEFINE_ARTDAQ_TRANSFER(artdaq::RTIDDSTransfer)
00132
00133
00134
00135