2 #define TRACE_NAME "ShmemWrapper"
4 #include "artdaq/ArtModules/detail/ShmemWrapper.hh"
5 #include "art/Framework/Services/Registry/ServiceHandle.h"
6 #include "artdaq/ArtModules/ArtdaqSharedMemoryService.h"
7 #include "artdaq/DAQdata/NetMonHeader.hh"
11 init_timeout_s_ = ps.get<
double>(
"init_fragment_timeout_seconds", 600.0);
13 art::ServiceHandle<ArtdaqSharedMemoryServiceInterface> shm;
18 TLOG(5) <<
"Receiving Fragment from NetMonTransportService";
19 TLOG(TLVL_TRACE) <<
"receiveMessage BEGIN";
20 art::ServiceHandle<ArtdaqSharedMemoryServiceInterface> shm;
21 artdaq::FragmentPtrs output;
24 auto start = std::chrono::steady_clock::now();
25 while (!init_received_ && artdaq::TimeUtils::GetElapsedTime(start) < init_timeout_s_)
27 usleep(init_timeout_s_ * 1000000 / 100);
31 TLOG(TLVL_ERROR) <<
"Did not receive Init Fragment after " << init_timeout_s_ <<
" seconds.";
35 artdaq::Fragments recvd_fragments;
36 while (recvd_fragments.size() == 0)
38 auto eventMap = shm->ReceiveEvent(
false);
40 if (eventMap.size() == 0)
42 TLOG(TLVL_DEBUG) <<
"Did not receive event after timeout, returning from receiveMessage ";
46 if (eventMap.count(artdaq::Fragment::type_t(artdaq::Fragment::EndOfDataFragmentType)))
48 TLOG(TLVL_DEBUG) <<
"Received shutdown message, returning";
51 if (eventMap.count(artdaq::Fragment::type_t(artdaq::Fragment::DataFragmentType)))
53 std::move(eventMap[artdaq::Fragment::type_t(artdaq::Fragment::DataFragmentType)]->begin(), eventMap[artdaq::Fragment::type_t(artdaq::Fragment::DataFragmentType)]->end(), std::back_inserter(recvd_fragments));
55 std::sort(recvd_fragments.begin(), recvd_fragments.end(), artdaq::fragmentSequenceIDCompare);
58 TLOG(TLVL_TRACE) <<
"receiveMessage: Returning top Fragment";
59 for (
auto& frag : recvd_fragments)
61 TLOG(TLVL_TRACE) <<
"receiveMessage: Returning Fragment, length="
63 output.emplace_back(
new artdaq::Fragment(std::move(frag)));
66 #if DUMP_RECEIVE_MESSAGE
67 std::string fileName =
"receiveMessage_" + std::to_string(my_rank) +
"_" + std::to_string(getpid()) +
"_" +
68 std::to_string(topFrag.sequenceID()) +
".bin";
69 std::fstream ostream(fileName.c_str(), std::ios::out | std::ios::binary);
70 ostream.write(buffer, header->data_length);
74 TLOG(TLVL_TRACE) <<
"receiveMessage END";
76 TLOG(5) <<
"Done Receiving Fragment from NetMonTransportService";
82 TLOG(5) <<
"Receiving Fragment from NetMonTransportService";
83 TLOG(TLVL_TRACE) <<
"receiveMessage BEGIN";
84 art::ServiceHandle<ArtdaqSharedMemoryServiceInterface> shm;
85 std::unordered_map<artdaq::Fragment::type_t, std::unique_ptr<artdaq::Fragments>> output;
88 auto start = std::chrono::steady_clock::now();
89 while (!init_received_ && artdaq::TimeUtils::GetElapsedTime(start) < init_timeout_s_)
91 usleep(init_timeout_s_ * 1000000 / 100);
95 TLOG(TLVL_ERROR) <<
"Did not receive Init Fragment after " << init_timeout_s_ <<
" seconds.";
98 output = shm->ReceiveEvent(
false);
100 if (output.size() == 0)
102 TLOG(TLVL_DEBUG) <<
"Did not receive event after timeout, returning from receiveMessage ";
106 hdr_ptr_ = shm->GetEventHeader();
107 TLOG(TLVL_TRACE) <<
"receiveMessage END";
109 TLOG(5) <<
"Done Receiving Fragments from Shared Memory";
115 TLOG(5) <<
"Receiving Init Fragment from NetMonTransportService";
117 TLOG(TLVL_TRACE) <<
"receiveInitMessage BEGIN";
118 art::ServiceHandle<ArtdaqSharedMemoryServiceInterface> shm;
119 auto start = std::chrono::steady_clock::now();
120 std::unordered_map<artdaq::Fragment::type_t, std::unique_ptr<artdaq::Fragments>> eventMap;
121 while (eventMap.size() == 0)
123 eventMap = shm->ReceiveEvent(
true);
125 if (eventMap.count(artdaq::Fragment::type_t(artdaq::Fragment::EndOfDataFragmentType)))
127 TLOG(TLVL_DEBUG) <<
"Received shutdown message, returning";
128 return artdaq::FragmentPtrs();
130 else if (!eventMap.count(artdaq::Fragment::type_t(artdaq::Fragment::InitFragmentType)) && eventMap.size() > 0)
132 TLOG(TLVL_WARNING) <<
"Did NOT receive Init Fragment as first broadcast! Type="
133 << artdaq::detail::RawFragmentHeader::SystemTypeToString(eventMap.begin()->first);
136 else if (artdaq::TimeUtils::GetElapsedTime(start) > init_timeout_s_)
138 TLOG(TLVL_WARNING) <<
"Did not receive Init fragment after init_fragment_timeout_seconds (" << artdaq::TimeUtils::GetElapsedTime(start) <<
")!";
139 return artdaq::FragmentPtrs();
149 TLOG(TLVL_TRACE) <<
"receiveInitMessage: Returning top Fragment";
150 artdaq::FragmentPtrs output;
151 for (
auto& frag : *eventMap[artdaq::Fragment::InitFragmentType])
153 output.emplace_back(
new artdaq::Fragment(std::move(frag)));
156 #if DUMP_RECEIVE_MESSAGE
157 std::string fileName =
"receiveInitMessage_" + std::to_string(getpid()) +
".bin";
158 std::fstream ostream(fileName.c_str(), std::ios::out | std::ios::binary);
159 ostream.write(buffer, header->data_length);
163 TLOG(TLVL_TRACE) <<
"receiveInitMessage END";
164 init_received_ =
true;
166 TLOG(5) <<
"Done Receiving Init Fragment from NetMonTransportService";
std::unordered_map< artdaq::Fragment::type_t, std::unique_ptr< artdaq::Fragments > > receiveMessages()
Receive all messsages for an event from ArtdaqSharedMemoryService.
artdaq::FragmentPtrs receiveMessage()
Receive a message from the ArtdaqSharedMemoryService.
ShmemWrapper(fhicl::ParameterSet const &ps)
ShmemWrapper Constructor.
artdaq::FragmentPtrs receiveInitMessage()
Receive an init message from the ArtdaqSharedMemoryService.