Line data Source code
1 : #include "TRACE/tracemf.h"
2 : #define TRACE_NAME "TransferOutputReliable"
3 : #include "artdaq/ArtModules/ArtdaqOutput.hh"
4 :
5 : #include <csignal>
6 : #include "art/Framework/Core/ModuleMacros.h"
7 : #include "artdaq/DAQdata/NetMonHeader.hh"
8 : #include "artdaq/TransferPlugins/MakeTransferPlugin.hh"
9 : #include "artdaq/TransferPlugins/TransferInterface.hh"
10 :
11 : namespace art {
12 : class TransferOutputReliable;
13 : }
14 :
15 : /**
16 : * \brief An art::OutputModule which sends events using DataSenderManager.
17 : * This module is designed for transporting Fragment-wrapped art::Events after
18 : * they have been read into art, for example between the EventBuilder and the Aggregator.
19 : */
20 : class art::TransferOutputReliable : public ArtdaqOutput
21 : {
22 : public:
23 : /**
24 : * \brief TransferOutputReliable Constructor
25 : * \param ps ParameterSet used to configure TransferOutputReliable
26 : *
27 : * TransferOutputReliable accepts no Parameters beyond those which art::OutputModule takes.
28 : * See the art::OutputModule documentation for more details on those Parameters.
29 : */
30 : explicit TransferOutputReliable(fhicl::ParameterSet const& ps);
31 :
32 : /**
33 : * \brief TransferOutputReliable Destructor
34 : */
35 : ~TransferOutputReliable() override;
36 :
37 : protected:
38 : /// <summary>
39 : /// Send a message using the Transfer Plugin
40 : /// </summary>
41 : /// <param name="fragment">Fragment to send</param>
42 : void SendMessage(artdaq::FragmentPtr& fragment) override;
43 :
44 : private:
45 : TransferOutputReliable(TransferOutputReliable const&) = delete;
46 : TransferOutputReliable(TransferOutputReliable&&) = delete;
47 : TransferOutputReliable& operator=(TransferOutputReliable const&) = delete;
48 : TransferOutputReliable& operator=(TransferOutputReliable&&) = delete;
49 :
50 : std::unique_ptr<artdaq::TransferInterface> transfer_;
51 : };
52 :
53 0 : art::TransferOutputReliable::TransferOutputReliable(fhicl::ParameterSet const& ps)
54 0 : : ArtdaqOutput(ps)
55 : {
56 0 : TLOG(TLVL_DEBUG + 32) << "Begin: TransferOutputReliable::TransferOutputReliable(ParameterSet const& ps)";
57 0 : transfer_ = artdaq::MakeTransferPlugin(ps, "transfer_plugin", artdaq::TransferInterface::Role::kSend);
58 0 : TLOG(TLVL_DEBUG + 32) << "END: TransferOutputReliable::TransferOutputReliable";
59 0 : }
60 :
61 0 : art::TransferOutputReliable::~TransferOutputReliable()
62 : {
63 0 : TLOG(TLVL_DEBUG + 32) << "Begin: TransferOutputReliable::~TransferOutputReliable()";
64 :
65 0 : auto sts = transfer_->transfer_fragment_reliable_mode(std::move(*artdaq::Fragment::eodFrag(0)));
66 0 : if (sts != artdaq::TransferInterface::CopyStatus::kSuccess)
67 : {
68 0 : TLOG(TLVL_ERROR) << "Error sending EOD Fragment!";
69 : }
70 0 : transfer_.reset(nullptr);
71 0 : TLOG(TLVL_DEBUG + 32) << "End: TransferOutputReliable::~TransferOutputReliable()";
72 0 : }
73 :
74 0 : void art::TransferOutputReliable::SendMessage(artdaq::FragmentPtr& fragment)
75 : {
76 0 : auto seqID = fragment->sequenceID();
77 0 : auto type = static_cast<int>(fragment->type());
78 0 : auto length = fragment->dataSizeBytes();
79 0 : TLOG(TLVL_DEBUG + 32) << "Sending message with sequenceID=" << fragment->sequenceID() << ", type=" << static_cast<int>(fragment->type())
80 0 : << ", length=" << fragment->dataSizeBytes();
81 0 : auto sts = artdaq::TransferInterface::CopyStatus::kErrorNotRequiringException;
82 0 : sts = transfer_->transfer_fragment_reliable_mode(std::move(*fragment));
83 0 : if (sts != artdaq::TransferInterface::CopyStatus::kSuccess)
84 : {
85 0 : TLOG(TLVL_ERROR) << "Error sending Fragment " << seqID << " of type " << type << " and length " << length;
86 : }
87 0 : }
88 :
89 0 : DEFINE_ART_MODULE(art::TransferOutputReliable) // NOLINT(performance-unnecessary-value-param)
|