DUNE-DAQ
DUNE Trigger and Data Acquisition software
Toggle main menu visibility
Loading...
Searching...
No Matches
dunedaq
sourcecode
asiolibs
src
SourceModel.hpp
Go to the documentation of this file.
1
8
#ifndef ASIOLIBS_SRC_SOURCEMODEL_HPP_
9
#define ASIOLIBS_SRC_SOURCEMODEL_HPP_
10
11
#include "
SourceConcept.hpp
"
12
13
#include "
iomanager/IOManager.hpp
"
14
#include "
iomanager/Sender.hpp
"
15
#include "
logging/Logging.hpp
"
16
17
#include "
asiolibs/opmon/SourceModel.pb.h
"
18
19
// #include "datahandlinglibs/utils/ReusableThread.hpp"
20
#include "
datahandlinglibs/DataMoveCallbackRegistry.hpp
"
21
#include "
datahandlinglibs/utils/BufferCopy.hpp
"
22
23
// #include <folly/ProducerConsumerQueue.h>
24
// #include <nlohmann/json.hpp>
25
26
#include <atomic>
27
#include <memory>
28
#include <mutex>
29
#include <string>
30
#include <utility>
31
32
namespace
dunedaq::asiolibs
{
33
34
template
<
class
TargetPayloadType>
35
class
SourceModel
:
public
SourceConcept
36
{
37
public
:
38
using
sink_t
=
iomanager::SenderConcept<TargetPayloadType>
;
39
using
inherited
=
SourceConcept
;
40
using
data_t
= nlohmann::json;
41
46
SourceModel
()
47
:
SourceConcept
()
48
{
49
}
50
~SourceModel
() {}
51
52
void
acquire_callback
()
override
53
{
54
if
(
m_callback_is_acquired
) {
55
TLOG_DEBUG
(5) <<
"SourceModel callback is already acquired!"
;
56
}
else
{
57
// Getting DataMoveCBRegistry
58
auto
dmcbr =
datahandlinglibs::DataMoveCallbackRegistry::get
();
59
m_sink_callback
= dmcbr->get_callback<TargetPayloadType>(
inherited::m_sink_conf
);
60
m_callback_is_acquired
=
true
;
61
}
62
}
63
64
// Process an incoming raw byte buffer and extract complete frames of type TargetPayloadType.
65
void
handle_daq_frame
(
char
* buffer)
override
66
{
67
// Materialize a real TargetPayloadType object by copying bytes from the buffer.
68
// This is defined behavior, alignment-safe, and fast, without pointer vodoo
69
// Previously reinterpret_cast to TargetPayloadType* introduced alignment traps
70
// “pretend there’s a constructed object there” UB.
71
TargetPayloadType frame;
72
std::memcpy(&frame, buffer,
m_expected_frame_size
);
73
74
// Pass by value (moved); no references into 'buffer', so no UAF.
75
(*m_sink_callback)(std::move(frame));
76
}
77
78
std::size_t
get_expected_frame_size
()
const override
{
return
m_expected_frame_size
; }
79
80
void
generate_opmon_data
()
override
81
{
82
83
opmon::SourceInfo
info;
84
info.set_leftover_bytes_encountered(
m_leftover_bytes_encountered
.exchange(0));
85
86
publish
(std::move(info));
87
}
88
89
private
:
90
// Constants
91
const
std::size_t
m_expected_frame_size
=
sizeof
(TargetPayloadType);
92
93
// Callback internals
94
bool
m_callback_is_acquired
{
false
};
95
using
sink_cb_t
= std::shared_ptr<std::function<void(TargetPayloadType&&)>>;
96
sink_cb_t
m_sink_callback
;
97
98
// Stats
99
std::atomic<uint64_t>
m_leftover_bytes_encountered
{ 0 };
// NOLINT(build/unsigned)
100
};
101
102
}
// namespace dunedaq::asiolibs
103
104
#endif
// ASIOLIBS_SRC_SOURCEMODEL_HPP_
BufferCopy.hpp
DataMoveCallbackRegistry.hpp
IOManager.hpp
SourceModel.pb.h
SourceConcept.hpp
dunedaq::asiolibs::SourceConcept::SourceConcept
SourceConcept()
Definition
SourceConcept.hpp:32
dunedaq::asiolibs::SourceConcept::m_sink_conf
const appmodel::DataMoveCallbackConf * m_sink_conf
Definition
SourceConcept.hpp:53
dunedaq::asiolibs::SourceModel::inherited
SourceConcept inherited
Definition
SourceModel.hpp:39
dunedaq::asiolibs::SourceModel::generate_opmon_data
void generate_opmon_data() override
Definition
SourceModel.hpp:80
dunedaq::asiolibs::SourceModel::m_expected_frame_size
const std::size_t m_expected_frame_size
Definition
SourceModel.hpp:91
dunedaq::asiolibs::SourceModel::m_leftover_bytes_encountered
std::atomic< uint64_t > m_leftover_bytes_encountered
Definition
SourceModel.hpp:99
dunedaq::asiolibs::SourceModel::m_callback_is_acquired
bool m_callback_is_acquired
Definition
SourceModel.hpp:94
dunedaq::asiolibs::SourceModel::sink_cb_t
std::shared_ptr< std::function< void(TargetPayloadType &&)> > sink_cb_t
Definition
SourceModel.hpp:95
dunedaq::asiolibs::SourceModel::m_sink_callback
sink_cb_t m_sink_callback
Definition
SourceModel.hpp:96
dunedaq::asiolibs::SourceModel::SourceModel
SourceModel()
SourceModel Constructor.
Definition
SourceModel.hpp:46
dunedaq::asiolibs::SourceModel::data_t
nlohmann::json data_t
Definition
SourceModel.hpp:40
dunedaq::asiolibs::SourceModel::get_expected_frame_size
std::size_t get_expected_frame_size() const override
Definition
SourceModel.hpp:78
dunedaq::asiolibs::SourceModel::acquire_callback
void acquire_callback() override
Definition
SourceModel.hpp:52
dunedaq::asiolibs::SourceModel::~SourceModel
~SourceModel()
Definition
SourceModel.hpp:50
dunedaq::asiolibs::SourceModel::handle_daq_frame
void handle_daq_frame(char *buffer) override
Definition
SourceModel.hpp:65
dunedaq::asiolibs::SourceModel::sink_t
iomanager::SenderConcept< TargetPayloadType > sink_t
Definition
SourceModel.hpp:38
dunedaq::asiolibs::opmon::SourceInfo
Definition
SourceModel.pb.h:80
dunedaq::datahandlinglibs::DataMoveCallbackRegistry::get
static std::shared_ptr< DataMoveCallbackRegistry > get()
Definition
DataMoveCallbackRegistry.hpp:52
dunedaq::iomanager::SenderConcept
Definition
Sender.hpp:44
dunedaq::opmonlib::MonitorableObject::publish
void publish(google::protobuf::Message &&, CustomOrigin &&co={}, OpMonLevel l=to_level(EntryOpMonLevel::kDefault)) const noexcept
Definition
MonitorableObject.cpp:59
Sender.hpp
Logging.hpp
TLOG_DEBUG
#define TLOG_DEBUG(lvl,...)
Definition
Logging.hpp:116
dunedaq::asiolibs
Definition
CreateGenericReceiver.hpp:25
Generated on
for DUNE-DAQ by
1.18.0