1 #define TRACE_NAME "NetMonWrapper"
3 #include "artdaq/ArtModules/NetMonWrapper.hh"
4 #include "art/Framework/Services/Registry/ServiceHandle.h"
5 #include "artdaq/ArtModules/ArtdaqSharedMemoryService.h"
6 #include "artdaq/DAQdata/NetMonHeader.hh"
8 #include <TBufferFile.h>
12 init_timeout_s_ = ps.get<
double>(
"init_fragment_timeout_seconds", 1.0);
14 art::ServiceHandle<ArtdaqSharedMemoryService> shm;
19 TLOG(5) <<
"Receiving Fragment from NetMonTransportService";
20 TBufferFile* msg(
nullptr);
21 TLOG(TLVL_TRACE) <<
"receiveMessage BEGIN";
22 art::ServiceHandle<ArtdaqSharedMemoryService> shm;
25 auto start = std::chrono::steady_clock::now();
26 while (!init_received_ && artdaq::TimeUtils::GetElapsedTime(start) < init_timeout_s_)
28 usleep(init_timeout_s_ * 1000000 / 100);
32 TLOG(TLVL_ERROR) <<
"Did not receive Init Fragment after " << init_timeout_s_ <<
" seconds. Art will crash.";
37 artdaq::Fragments recvd_fragments;
38 while (recvd_fragments.size() == 0)
40 auto eventMap = shm->ReceiveEvent(
false);
42 if (eventMap.size() == 0)
44 TLOG(TLVL_DEBUG) <<
"Did not receive event after timeout, returning from receiveMessage ";
48 if (eventMap.count(artdaq::Fragment::type_t(artdaq::Fragment::EndOfDataFragmentType)))
50 TLOG(TLVL_DEBUG) <<
"Received shutdown message, returning";
54 if (eventMap.count(artdaq::Fragment::type_t(artdaq::Fragment::DataFragmentType)))
56 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));
58 std::sort(recvd_fragments.begin(), recvd_fragments.end(), artdaq::fragmentSequenceIDCompare);
61 TLOG(TLVL_TRACE) <<
"receiveMessage: Returning top Fragment";
62 artdaq::Fragment topFrag = std::move(recvd_fragments.at(0));
63 recvd_fragments.erase(recvd_fragments.begin());
65 TLOG(TLVL_TRACE) <<
"receiveMessage: Copying Fragment into TBufferFile, length="
68 auto buffer =
static_cast<char*
>(malloc(header->
data_length));
69 memcpy(buffer, &*topFrag.dataBegin(), header->
data_length);
70 msg =
new TBufferFile(TBuffer::kRead, header->
data_length, buffer, kTRUE, 0);
72 #if DUMP_RECEIVE_MESSAGE
73 std::string fileName =
"receiveMessage_" + std::to_string(my_rank) +
"_" + std::to_string(getpid()) +
"_" +
74 std::to_string(topFrag.sequenceID()) +
".bin";
75 std::fstream ostream(fileName.c_str(), std::ios::out | std::ios::binary);
80 TLOG(TLVL_TRACE) <<
"receiveMessage END";
83 TLOG(5) <<
"Done Receiving Fragment from NetMonTransportService";
88 TLOG(5) <<
"Receiving Init Fragment from NetMonTransportService";
89 TBufferFile* msg(
nullptr);
91 TLOG(TLVL_TRACE) <<
"receiveInitMessage BEGIN";
92 art::ServiceHandle<ArtdaqSharedMemoryService> shm;
93 std::unordered_map<artdaq::Fragment::type_t, std::unique_ptr<artdaq::Fragments>> eventMap;
94 while (eventMap.size() == 0)
96 eventMap = shm->ReceiveEvent(
true);
98 if (eventMap.count(artdaq::Fragment::type_t(artdaq::Fragment::EndOfDataFragmentType)))
100 TLOG(TLVL_DEBUG) <<
"Received shutdown message, returning";
104 else if (!eventMap.count(artdaq::Fragment::type_t(artdaq::Fragment::InitFragmentType)) && eventMap.size() > 0)
106 TLOG(TLVL_WARNING) <<
"Did NOT receive Init Fragment as first broadcast! Type="
107 << artdaq::detail::RawFragmentHeader::SystemTypeToString(eventMap.begin()->first);
118 TLOG(TLVL_TRACE) <<
"receiveInitMessage: Returning top Fragment";
119 artdaq::Fragment topFrag = std::move(eventMap[artdaq::Fragment::type_t(artdaq::Fragment::InitFragmentType)]->at(0));
122 TLOG(TLVL_TRACE) <<
"receiveInitMessage: Copying Fragment into TBufferFile: message length: " << header->
data_length;
123 auto buffer =
new char[header->data_length];
125 memcpy(buffer, &*topFrag.dataBegin(), header->data_length);
127 #if DUMP_RECEIVE_MESSAGE
128 std::string fileName =
"receiveInitMessage_" + std::to_string(getpid()) +
".bin";
129 std::fstream ostream(fileName.c_str(), std::ios::out | std::ios::binary);
130 ostream.write(buffer, header->data_length);
134 msg =
new TBufferFile(TBuffer::kRead, header->data_length, buffer, kTRUE, 0);
136 TLOG(TLVL_TRACE) <<
"receiveInitMessage END";
137 init_received_ =
true;
140 TLOG(5) <<
"Done Receiving Init Fragment from NetMonTransportService";
NetMonWrapper(fhicl::ParameterSet const &ps)
NetMonWrapper Constructor.
void receiveMessage(std::unique_ptr< TBufferFile > &msg)
Receive a message from the NetMonTransportService.
void receiveInitMessage(std::unique_ptr< TBufferFile > &msg)
Receive an init message from the NetMonTransportService.