DUNE-DAQ
DUNE Trigger and Data Acquisition software
Toggle main menu visibility
Loading...
Searching...
No Matches
dunedaq
sourcecode
ipm
include
ipm
Receiver.hpp
Go to the documentation of this file.
1
22
23
#ifndef IPM_INCLUDE_IPM_RECEIVER_HPP_
24
#define IPM_INCLUDE_IPM_RECEIVER_HPP_
25
26
#include "cetlib/BasicPluginFactory.h"
27
#include "cetlib/compiler_macros.h"
28
#include "
ers/Issue.hpp
"
29
#include "
logging/Logging.hpp
"
// NOTE: if ISSUES ARE DECLARED BEFORE include logging/Logging.hpp, TLOG_DEBUG<<issue wont work.
30
#include "
opmonlib/MonitorableObject.hpp
"
31
32
#include <atomic>
33
#include <memory>
34
#include <string>
35
#include <vector>
36
37
namespace
dunedaq
{
38
// Disable coverage collection LCOV_EXCL_START
39
ERS_DECLARE_ISSUE
(
ipm
, KnownStateForbidsReceive,
"Receiver not in a state to receive data"
, )
40
ERS_DECLARE_ISSUE
(
ipm
,
41
UnexpectedNumberOfBytes,
42
connection_name <<
": Expected "
<< bytes1 <<
" bytes in message but received "
<< bytes2,
43
((
std
::
string
)connection_name)((
int
)bytes1)((
int
)bytes2))
// NOLINT
44
ERS_DECLARE_ISSUE
(
ipm
,
45
ReceiveTimeoutExpired
,
46
connection_name <<
": Unable to receive within timeout period (timeout period was "
<< timeout <<
" milliseconds)"
,
47
((
std
::
string
)connection_name)((
int
)timeout))
// NOLINT
48
// Reenable coverage collection LCOV_EXCL_STOP
49
}
// namespace dunedaq
50
51
#ifndef EXTERN_C_FUNC_DECLARE_START
52
// NOLINTNEXTLINE(build/define_used)
53
#define EXTERN_C_FUNC_DECLARE_START \
54
extern "C" \
55
{
56
#endif
57
62
// NOLINTNEXTLINE
63
#define DEFINE_DUNE_IPM_RECEIVER(klass) \
64
EXTERN_C_FUNC_DECLARE_START \
65
std::shared_ptr<dunedaq::ipm::Receiver> make() \
66
{ \
67
return std::shared_ptr<dunedaq::ipm::Receiver>(new klass()); \
68
} \
69
}
70
71
namespace
dunedaq::ipm
{
72
73
class
Receiver
:
public
opmonlib::MonitorableObject
74
{
75
76
public
:
77
struct
ConnectionInfo
78
{
79
std::string
connection_name
{
""
};
80
std::string
connection_string
{
""
};
81
std::vector<std::string>
connection_strings
{};
82
};
83
using
duration_t
= std::chrono::milliseconds;
84
static
constexpr
duration_t
s_block
= duration_t::max();
85
static
constexpr
duration_t
s_no_block
= duration_t::zero();
86
87
using
message_size_t
= int;
88
static
constexpr
message_size_t
s_any_size
=
89
0;
// Since "I want 0 bytes" is pointless, "0" denotes "I don't care about the size"
90
91
Receiver
() =
default
;
92
virtual
~Receiver
() =
default
;
93
94
virtual
std::string
connect_for_receives
(
const
ConnectionInfo
& connection_info) = 0;
95
96
virtual
bool
can_receive
() const noexcept = 0;
97
98
// receive() will perform some universally-desirable checks before calling user-implemented receive_:
99
// -Throws KnownStateForbidsReceive if can_receive() == false
100
// -Throws UnexpectedNumberOfBytes if the "nbytes" argument isn't anysize, and the
101
// received bytes inside the function aren't the same number as nbytes
102
103
struct
Response
104
{
105
std::string
metadata
{
""
};
106
std::vector<char>
data
{};
107
};
108
109
Response receive(
const
duration_t& timeout, message_size_t num_bytes = s_any_size,
bool
no_tmoexcept_mode =
false
);
110
virtual
bool
data_pending
() = 0;
111
112
virtual
void
register_callback
(std::function<
void
(
Response
&)>) = 0;
113
virtual
void
unregister_callback
() = 0;
114
115
Receiver
(
const
Receiver
&) =
delete
;
116
Receiver
&
operator=
(
const
Receiver
&) =
delete
;
117
118
Receiver
(
Receiver
&&) =
delete
;
119
Receiver
&
operator=
(
Receiver
&&) =
delete
;
120
121
protected
:
122
ConnectionInfo
m_connection_info
;
123
void
generate_opmon_data
()
override
;
124
125
virtual
Response
receive_
(
const
duration_t
& timeout,
bool
no_tmoexcept_mode) = 0;
126
127
private
:
128
mutable
std::atomic<size_t>
m_bytes
= { 0 };
129
mutable
std::atomic<size_t>
m_messages
= { 0 };
130
};
131
132
inline
std::shared_ptr<Receiver>
133
make_ipm_receiver
(std::string
const
& plugin_name)
134
{
135
static
cet::BasicPluginFactory bpf(
"duneIPM"
,
"make"
);
136
return
bpf.makePlugin<std::shared_ptr<Receiver>>(plugin_name);
137
}
138
139
}
// namespace dunedaq::ipm
140
141
#endif
// IPM_INCLUDE_IPM_RECEIVER_HPP_
Issue.hpp
MonitorableObject.hpp
dunedaq::ipm::Receiver::m_connection_info
ConnectionInfo m_connection_info
Definition
Receiver.hpp:122
dunedaq::ipm::Receiver::Receiver
Receiver(const Receiver &)=delete
dunedaq::ipm::Receiver::unregister_callback
virtual void unregister_callback()=0
dunedaq::ipm::Receiver::~Receiver
virtual ~Receiver()=default
dunedaq::ipm::Receiver::s_block
static constexpr duration_t s_block
Definition
Receiver.hpp:84
dunedaq::ipm::Receiver::duration_t
std::chrono::milliseconds duration_t
Definition
Receiver.hpp:83
dunedaq::ipm::Receiver::s_any_size
static constexpr message_size_t s_any_size
Definition
Receiver.hpp:88
dunedaq::ipm::Receiver::Receiver
Receiver(Receiver &&)=delete
dunedaq::ipm::Receiver::Receiver
Receiver()=default
dunedaq::ipm::Receiver::data_pending
virtual bool data_pending()=0
dunedaq::ipm::Receiver::message_size_t
int message_size_t
Definition
Receiver.hpp:87
dunedaq::ipm::Receiver::operator=
Receiver & operator=(const Receiver &)=delete
dunedaq::ipm::Receiver::m_bytes
std::atomic< size_t > m_bytes
Definition
Receiver.hpp:128
dunedaq::ipm::Receiver::s_no_block
static constexpr duration_t s_no_block
Definition
Receiver.hpp:85
dunedaq::ipm::Receiver::generate_opmon_data
void generate_opmon_data() override
Definition
Receiver.cpp:39
dunedaq::ipm::Receiver::operator=
Receiver & operator=(Receiver &&)=delete
dunedaq::ipm::Receiver::receive_
virtual Response receive_(const duration_t &timeout, bool no_tmoexcept_mode)=0
dunedaq::ipm::Receiver::can_receive
virtual bool can_receive() const noexcept=0
dunedaq::ipm::Receiver::m_messages
std::atomic< size_t > m_messages
Definition
Receiver.hpp:129
dunedaq::ipm::Receiver::register_callback
virtual void register_callback(std::function< void(Response &)>)=0
dunedaq::ipm::Receiver::connect_for_receives
virtual std::string connect_for_receives(const ConnectionInfo &connection_info)=0
dunedaq::opmonlib::MonitorableObject
Definition
MonitorableObject.hpp:74
Logging.hpp
ERS_DECLARE_ISSUE
#define ERS_DECLARE_ISSUE( namespace_name, class_name, message_, attributes)
Definition
macro.hpp:65
dunedaq::ipm
An ERS Error indicating that an exception was thrown from ZMQ while performing an operation.
Definition
PluginInfo.hpp:26
dunedaq::ipm::make_ipm_receiver
std::shared_ptr< Receiver > make_ipm_receiver(std::string const &plugin_name)
Definition
Receiver.hpp:133
dunedaq
Including Qt Headers.
Definition
module.cpp:16
dunedaq::ReceiveTimeoutExpired
ReceiveTimeoutExpired
Definition
Receiver.hpp:45
dunedaq::ERS_DECLARE_ISSUE
ERS_DECLARE_ISSUE(snbmodules, InvalidGroupTransferIDError, "InvalidGroupTransferIDError: Transfer ID "<< transfer_id<< " not found in "<< location,((std::string) transfer_id)((std::string) location)) ERS_DECLARE_ISSUE(snbmodules
std
Definition
SchemaUtils.hpp:118
dunedaq::ipm::Receiver::ConnectionInfo
Definition
Receiver.hpp:78
dunedaq::ipm::Receiver::ConnectionInfo::connection_strings
std::vector< std::string > connection_strings
Definition
Receiver.hpp:81
dunedaq::ipm::Receiver::ConnectionInfo::connection_name
std::string connection_name
Definition
Receiver.hpp:79
dunedaq::ipm::Receiver::ConnectionInfo::connection_string
std::string connection_string
Definition
Receiver.hpp:80
dunedaq::ipm::Receiver::Response
Definition
Receiver.hpp:104
dunedaq::ipm::Receiver::Response::metadata
std::string metadata
Definition
Receiver.hpp:105
dunedaq::ipm::Receiver::Response::data
std::vector< char > data
Definition
Receiver.hpp:106
Generated on
for DUNE-DAQ by
1.17.0