artdaq  v3_03_00
RTIDDS_transfer.cc
1 #include "artdaq/TransferPlugins/TransferInterface.hh"
2 
3 #include "artdaq/RTIDDS/RTIDDS.hh"
4 
5 #include "artdaq-core/Utilities/ExceptionHandler.hh"
6 #include <memory>
7 #include <iostream>
8 
9 
10 namespace fhicl
11 {
12  class ParameterSet;
13 }
14 
15 // ----------------------------------------------------------------------
16 
17 namespace artdaq
18 {
23  {
24  public:
28  virtual ~RTIDDSTransfer() = default;
29 
37  RTIDDSTransfer(fhicl::ParameterSet const& ps, Role role) :
38  TransferInterface(ps, role)
39  , rtidds_reader_(std::make_unique<artdaq::RTIDDS>("RTIDDSTransfer_reader", artdaq::RTIDDS::IOType::reader))
40  , rtidds_writer_(std::make_unique<artdaq::RTIDDS>("RTIDDSTransfer_writer", artdaq::RTIDDS::IOType::writer)) { }
41 
48  int receiveFragment(artdaq::Fragment& fragment,
49  size_t receiveTimeout) override;
50 
57  CopyStatus copyFragment(artdaq::Fragment& fragment,
58  size_t send_timeout_usec = std::numeric_limits<size_t>::max()) override;
59 
66  CopyStatus moveFragment(artdaq::Fragment&& fragment,
67  size_t send_timeout_usec = std::numeric_limits<size_t>::max()) override;
68 
73  bool isRunning() override
74  {
75  switch (role())
76  {
78  return rtidds_writer_ != nullptr;
80  return rtidds_reader_ != nullptr;
81  }
82  }
83  private:
84  std::unique_ptr<artdaq::RTIDDS> rtidds_reader_;
85  std::unique_ptr<artdaq::RTIDDS> rtidds_writer_;
86  };
87 }
88 
89 int artdaq::RTIDDSTransfer::receiveFragment(artdaq::Fragment& fragment,
90  size_t receiveTimeout)
91 {
92  bool receivedFragment = false;
93  // static std::size_t consecutive_timeouts = 0;
94  // std::size_t message_after_N_timeouts = 10;
95 
96  // while (!receivedFragment) {
97 
98  try
99  {
100  receivedFragment = rtidds_reader_->octets_listener_.receiveFragmentFromDDS(fragment, receiveTimeout);
101  }
102  catch (...)
103  {
104  ExceptionHandler(ExceptionHandlerRethrow::yes,
105  "Error in RTIDDS transfer plugin: caught exception in call to OctetsListener::receiveFragmentFromDDS, rethrowing");
106  }
107 
108  // if (!receivedFragment) {
109 
110  // consecutive_timeouts++;
111 
112  // if (consecutive_timeouts % message_after_N_timeouts == 0) {
113  // TLOG_INFO("RTIDDSTransfer") << consecutive_timeouts << " consecutive " <<
114  // static_cast<float>(receiveTimeout)/1e6 << "-second timeouts calling OctetsListener::receiveFragmentFromDDS, will continue trying..." ;
115  // }
116  // } else {
117  // consecutive_timeouts = 0;
118  // }
119  // }
120 
121  // return 0;
122 
123  return receivedFragment ? source_rank() : TransferInterface::RECV_TIMEOUT;
124 }
125 
127 artdaq::RTIDDSTransfer::moveFragment(artdaq::Fragment&& fragment, size_t send_timeout_usec)
128 {
129  (void)&send_timeout_usec; // No-op to get the compiler not to complain about unused parameter
130 
131  rtidds_writer_->moveFragmentToDDS_(std::move(fragment));
132  return CopyStatus::kSuccess;
133 }
134 
136 artdaq::RTIDDSTransfer::copyFragment(artdaq::Fragment& fragment,
137  size_t send_timeout_usec)
138 {
139  (void) &send_timeout_usec; // No-op to get the compiler not to complain about unused parameter
140 
141  rtidds_writer_->copyFragmentToDDS_(fragment);
142  return CopyStatus::kSuccess;
143 }
144 
145 DEFINE_ARTDAQ_TRANSFER(artdaq::RTIDDSTransfer)
146 
147 // Local Variables:
148 // mode: c++
149 // End:
DDS Transport Implementation.
Definition: RTIDDS.hh:21
virtual int source_rank() const
Get the source rank for this TransferInterface instance.
CopyStatus moveFragment(artdaq::Fragment &&fragment, size_t send_timeout_usec=std::numeric_limits< size_t >::max()) override
Move a Fragment to the destination.
Role role() const
Get the TransferInterface::Role of this TransferInterface.
This TransferInterface is a Receiver.
bool isRunning() override
Determine whether the TransferInterface plugin is able to send/receive data.
This TransferInterface is a Sender.
Role
Used to determine if a TransferInterface is a Sender or Receiver.
int receiveFragment(artdaq::Fragment &fragment, size_t receiveTimeout) override
Receive a Fragment using DDS.
RTIDDSTransfer is a TransferInterface implementation plugin that transfers data using RTI DDS...
This interface defines the functions used to transfer data between artdaq applications.
RTIDDSTransfer(fhicl::ParameterSet const &ps, Role role)
RTIDDSTransfer Constructor.
Value to be returned upon receive timeout.
virtual ~RTIDDSTransfer()=default
RTIDDSTransfer default Destructor.
CopyStatus
Returned from the send functions, this enumeration describes the possible return codes. If an exception occurs, it will be thrown and should be handled normally.
CopyStatus copyFragment(artdaq::Fragment &fragment, size_t send_timeout_usec=std::numeric_limits< size_t >::max()) override
Copy a Fragment to the destination.