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
14
#include "
iomanager/IOManager.hpp
"
15
#include "
iomanager/Sender.hpp
"
16
#include "
logging/Logging.hpp
"
17
18
#include "
asiolibs/opmon/SourceModel.pb.h
"
19
20
// #include "datahandlinglibs/utils/ReusableThread.hpp"
21
#include "
datahandlinglibs/DataMoveCallbackRegistry.hpp
"
22
#include "
datahandlinglibs/utils/BufferCopy.hpp
"
23
24
// #include <folly/ProducerConsumerQueue.h>
25
// #include <nlohmann/json.hpp>
26
27
#include <atomic>
28
#include <memory>
29
#include <mutex>
30
#include <string>
31
#include <utility>
32
33
namespace
dunedaq::asiolibs
{
34
35
template
<
class
TargetPayloadType>
36
class
SourceModel
:
public
SourceConcept
37
{
38
public
:
39
using
sink_t
=
iomanager::SenderConcept<TargetPayloadType>
;
40
using
inherited
=
SourceConcept
;
41
using
data_t
= nlohmann::json;
42
47
SourceModel
()
48
:
SourceConcept
()
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
{
79
return
m_expected_frame_size
;
80
}
81
82
void
generate_opmon_data
()
override
{
83
84
opmon::SourceInfo
info;
85
info.set_leftover_bytes_encountered(
m_leftover_bytes_encountered
.exchange(0) );
86
87
publish
( std::move(info) );
88
}
89
90
private
:
91
// Constants
92
const
std::size_t
m_expected_frame_size
=
sizeof
(TargetPayloadType);
93
94
// Callback internals
95
bool
m_callback_is_acquired
{
false
};
96
using
sink_cb_t
= std::shared_ptr<std::function<void(TargetPayloadType&&)>>;
97
sink_cb_t
m_sink_callback
;
98
99
// Stats
100
std::atomic<uint64_t>
m_leftover_bytes_encountered
{0};
// NOLINT(build/unsigned)
101
102
};
103
104
}
// namespace dunedaq::asiolibs
105
106
#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:56
dunedaq::asiolibs::SourceModel::inherited
SourceConcept inherited
Definition
SourceModel.hpp:40
dunedaq::asiolibs::SourceModel::generate_opmon_data
void generate_opmon_data() override
Definition
SourceModel.hpp:82
dunedaq::asiolibs::SourceModel::m_expected_frame_size
const std::size_t m_expected_frame_size
Definition
SourceModel.hpp:92
dunedaq::asiolibs::SourceModel::m_leftover_bytes_encountered
std::atomic< uint64_t > m_leftover_bytes_encountered
Definition
SourceModel.hpp:100
dunedaq::asiolibs::SourceModel::m_callback_is_acquired
bool m_callback_is_acquired
Definition
SourceModel.hpp:95
dunedaq::asiolibs::SourceModel::sink_cb_t
std::shared_ptr< std::function< void(TargetPayloadType &&)> > sink_cb_t
Definition
SourceModel.hpp:96
dunedaq::asiolibs::SourceModel::m_sink_callback
sink_cb_t m_sink_callback
Definition
SourceModel.hpp:97
dunedaq::asiolibs::SourceModel::SourceModel
SourceModel()
SourceModel Constructor.
Definition
SourceModel.hpp:47
dunedaq::asiolibs::SourceModel::data_t
nlohmann::json data_t
Definition
SourceModel.hpp:41
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:39
dunedaq::asiolibs::opmon::SourceInfo
Definition
SourceModel.pb.h:80
dunedaq::datahandlinglibs::DataMoveCallbackRegistry::get
static std::shared_ptr< DataMoveCallbackRegistry > get()
Definition
DataMoveCallbackRegistry.hpp:50
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:58
Sender.hpp
Logging.hpp
TLOG_DEBUG
#define TLOG_DEBUG(lvl,...)
Definition
Logging.hpp:112
dunedaq::asiolibs
Definition
CreateGenericReceiver.hpp:25
Generated on
for DUNE-DAQ by
1.17.0