DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
dunedaq::iomanager::NetworkSenderModel< Datatype > Class Template Reference

#include <NetworkSenderModel.hpp>

Inheritance diagram for dunedaq::iomanager::NetworkSenderModel< Datatype >:
[legend]
Collaboration diagram for dunedaq::iomanager::NetworkSenderModel< Datatype >:
[legend]

Public Member Functions

 NetworkSenderModel (ConnectionId const &conn_id)
 
 NetworkSenderModel (NetworkSenderModel &&other)
 
void send (Datatype &&data, Sender::timeout_t timeout) override
 
bool try_send (Datatype &&data, Sender::timeout_t timeout) override
 
void send_with_topic (Datatype &&data, Sender::timeout_t timeout, std::string topic) override
 
bool is_ready_for_sending (Sender::timeout_t timeout) override
 
- Public Member Functions inherited from dunedaq::iomanager::SenderConcept< Datatype >
 SenderConcept (ConnectionId const &conn_id)
 
- Public Member Functions inherited from dunedaq::iomanager::Sender
 Sender (ConnectionId const &this_conn)
 
virtual ~Sender ()=default
 
ConnectionId id () const
 
- Public Member Functions inherited from dunedaq::utilities::NamedObject
 NamedObject (const std::string &name)
 NamedObject Constructor.
 
 NamedObject (NamedObject const &)=delete
 NamedObject is not copy-constructible.
 
 NamedObject (NamedObject &&)=default
 NamedObject is move-constructible.
 
NamedObjectoperator= (NamedObject const &)=delete
 NamedObject is not copy-assignable.
 
NamedObjectoperator= (NamedObject &&)=default
 NamedObject is move-assignable.
 
virtual ~NamedObject ()=default
 Default virtual destructor.
 
const std::string & get_name () const final
 Get the name of this NamedObejct.
 
- Public Member Functions inherited from dunedaq::utilities::Named
 Named ()=default
 Named Constructor.
 
 Named (Named const &)=delete
 Named is not copy-constructible.
 
 Named (Named &&)=default
 Named is move-constructible.
 
Namedoperator= (Named const &)=delete
 Named is not copy-assignable.
 
Namedoperator= (Named &&)=default
 Named is move-assignable.
 
virtual ~Named ()=default
 Default virtual destructor.
 

Private Member Functions

void get_sender (Sender::timeout_t const &timeout)
 
template<typename MessageType >
std::enable_if< dunedaq::serialization::is_serializable< MessageType >::value, void >::type write_network (MessageType &message, Sender::timeout_t const &timeout)
 
template<typename MessageType >
std::enable_if<!dunedaq::serialization::is_serializable< MessageType >::value, void >::type write_network (MessageType &, Sender::timeout_t const &)
 
template<typename MessageType >
std::enable_if< dunedaq::serialization::is_serializable< MessageType >::value, bool >::type try_write_network (MessageType &message, Sender::timeout_t const &timeout)
 
template<typename MessageType >
std::enable_if<!dunedaq::serialization::is_serializable< MessageType >::value, bool >::type try_write_network (MessageType &, Sender::timeout_t const &)
 
template<typename MessageType >
std::enable_if< dunedaq::serialization::is_serializable< MessageType >::value, void >::type write_network_with_topic (MessageType &message, Sender::timeout_t const &timeout, std::string topic)
 
template<typename MessageType >
std::enable_if<!dunedaq::serialization::is_serializable< MessageType >::value, void >::type write_network_with_topic (MessageType &, Sender::timeout_t const &, std::string)
 
Sender::timeout_t extend_first_timeout (Sender::timeout_t timeout)
 

Private Attributes

std::shared_ptr< ipm::Senderm_network_sender_ptr
 
std::mutex m_send_mutex
 
std::string m_topic { "" }
 
std::atomic< bool > m_first { true }
 

Additional Inherited Members

- Public Types inherited from dunedaq::iomanager::Sender
using timeout_t = std::chrono::milliseconds
 
- Static Public Attributes inherited from dunedaq::iomanager::Sender
static constexpr timeout_t s_block = timeout_t::max()
 
static constexpr timeout_t s_no_block = timeout_t::zero()
 
- Protected Attributes inherited from dunedaq::iomanager::Sender
ConnectionId m_conn
 

Detailed Description

template<typename Datatype>
class dunedaq::iomanager::NetworkSenderModel< Datatype >

Definition at line 25 of file NetworkSenderModel.hpp.

Constructor & Destructor Documentation

◆ NetworkSenderModel() [1/2]

template<typename Datatype >
dunedaq::iomanager::NetworkSenderModel< Datatype >::NetworkSenderModel ( ConnectionId const & conn_id)
inlineexplicit

Definition at line 17 of file NetworkSenderModel.hxx.

19{
20 TLOG("NetworkSenderModel") << "NetworkSenderModel created with DT! Addr: " << static_cast<void*>(this)
21 << ", uid=" << conn_id.uid << ", data_type=" << conn_id.data_type;
22 get_sender(std::chrono::milliseconds(1000));
23 if (m_network_sender_ptr == nullptr) {
24 TLOG("NetworkSenderModel") << "Initial connection attempt failed for uid=" << conn_id.uid
25 << ", data_type=" << conn_id.data_type;
26 }
27}
void get_sender(Sender::timeout_t const &timeout)
std::shared_ptr< ipm::Sender > m_network_sender_ptr
SenderConcept(ConnectionId const &conn_id)
Definition Sender.hpp:46
#define TLOG(...)
Definition macro.hpp:22

◆ NetworkSenderModel() [2/2]

template<typename Datatype >
dunedaq::iomanager::NetworkSenderModel< Datatype >::NetworkSenderModel ( NetworkSenderModel< Datatype > && other)
inline

Definition at line 30 of file NetworkSenderModel.hxx.

31 : SenderConcept<Datatype>(other.m_conn.uid)
32 , m_network_sender_ptr(std::move(other.m_network_sender_ptr))
33 , m_topic(std::move(other.m_topic))
34{
35}

Member Function Documentation

◆ extend_first_timeout()

template<typename Datatype >
Sender::timeout_t dunedaq::iomanager::NetworkSenderModel< Datatype >::extend_first_timeout ( Sender::timeout_t timeout)
inlineprivate

Definition at line 204 of file NetworkSenderModel.hxx.

205{
206 if (m_first) {
207 m_first = false;
208 if (timeout > 1000ms) {
209 return timeout;
210 }
211 return 1000ms;
212 }
213
214 return timeout;
215}

◆ get_sender()

template<typename Datatype >
void dunedaq::iomanager::NetworkSenderModel< Datatype >::get_sender ( Sender::timeout_t const & timeout)
inlineprivate

Definition at line 76 of file NetworkSenderModel.hxx.

77{
78 auto start = std::chrono::steady_clock::now();
79 while (m_network_sender_ptr == nullptr &&
80 std::chrono::duration_cast<Sender::timeout_t>(std::chrono::steady_clock::now() - start) <= timeout) {
81 // get network resources
82 try {
84
85 if (NetworkManager::get().is_pubsub_connection(this->id())) {
86 TLOG("NetworkSenderModel") << "Setting topic to " << this->id().data_type;
87 m_topic = this->id().data_type;
88 }
89 } catch (ers::Issue const& ex) {
90 m_network_sender_ptr = nullptr;
91 std::this_thread::sleep_for(std::chrono::milliseconds(1));
92 }
93 }
94}
static NetworkManager & get()
std::shared_ptr< ipm::Sender > get_sender(ConnectionId const &conn_id)
ConnectionId id() const
Definition Sender.hpp:35
Base class for any user define issue.
Definition Issue.hpp:69

◆ is_ready_for_sending()

template<typename Datatype >
bool dunedaq::iomanager::NetworkSenderModel< Datatype >::is_ready_for_sending ( Sender::timeout_t timeout)
inlineoverridevirtual

Implements dunedaq::iomanager::SenderConcept< Datatype >.

Definition at line 68 of file NetworkSenderModel.hxx.

69{
70 get_sender(timeout);
71 return (m_network_sender_ptr != nullptr);
72}

◆ send()

template<typename Datatype >
void dunedaq::iomanager::NetworkSenderModel< Datatype >::send ( Datatype && data,
Sender::timeout_t timeout )
inlineoverridevirtual

Implements dunedaq::iomanager::SenderConcept< Datatype >.

Definition at line 39 of file NetworkSenderModel.hxx.

40{
41 try {
42 write_network<Datatype>(data, timeout);
43 } catch (ipm::SendTimeoutExpired& ex) {
44 throw TimeoutExpired(ERS_HERE, this->id().uid, "send", timeout.count(), ex);
45 }
46}
#define ERS_HERE
std::enable_if< dunedaq::serialization::is_serializable< MessageType >::value, void >::type write_network(MessageType &message, Sender::timeout_t const &timeout)

◆ send_with_topic()

template<typename Datatype >
void dunedaq::iomanager::NetworkSenderModel< Datatype >::send_with_topic ( Datatype && data,
Sender::timeout_t timeout,
std::string topic )
inlineoverridevirtual

Implements dunedaq::iomanager::SenderConcept< Datatype >.

Definition at line 57 of file NetworkSenderModel.hxx.

58{
59 try {
60 write_network_with_topic<Datatype>(data, timeout, topic);
61 } catch (ipm::SendTimeoutExpired& ex) {
62 throw TimeoutExpired(ERS_HERE, this->id().uid, "send", timeout.count(), ex);
63 }
64}
std::enable_if< dunedaq::serialization::is_serializable< MessageType >::value, void >::type write_network_with_topic(MessageType &message, Sender::timeout_t const &timeout, std::string topic)

◆ try_send()

template<typename Datatype >
bool dunedaq::iomanager::NetworkSenderModel< Datatype >::try_send ( Datatype && data,
Sender::timeout_t timeout )
inlineoverridevirtual

Implements dunedaq::iomanager::SenderConcept< Datatype >.

Definition at line 50 of file NetworkSenderModel.hxx.

51{
52 return try_write_network<Datatype>(data, timeout);
53}
std::enable_if< dunedaq::serialization::is_serializable< MessageType >::value, bool >::type try_write_network(MessageType &message, Sender::timeout_t const &timeout)

◆ try_write_network() [1/2]

template<typename Datatype >
template<typename MessageType >
std::enable_if<!dunedaq::serialization::is_serializable< MessageType >::value, bool >::type dunedaq::iomanager::NetworkSenderModel< Datatype >::try_write_network ( MessageType & ,
Sender::timeout_t const &  )
private

◆ try_write_network() [2/2]

template<typename Datatype >
template<typename MessageType >
std::enable_if<!dunedaq::serialization::is_serializable< MessageType >::value, bool >::type dunedaq::iomanager::NetworkSenderModel< Datatype >::try_write_network ( MessageType & message,
Sender::timeout_t const & timeout )
inlineprivate

Definition at line 134 of file NetworkSenderModel.hxx.

135{
136 std::lock_guard<std::mutex> lk(m_send_mutex);
137 get_sender(timeout);
138 if (m_network_sender_ptr == nullptr) {
139 TLOG("NetworkSenderModel") << ConnectionInstanceNotFound(ERS_HERE, this->id().uid);
140 return false;
141 }
142
144 // TLOG("NetworkSenderModel") << "Serialized message for network sending: " << serialized.size() << ", topic=" <<
145 // m_topic <<
146 // ", this=" << (void*)this;
147
148 auto res =
149 m_network_sender_ptr->send(serialized.data(), serialized.size(), extend_first_timeout(timeout), m_topic, true);
150 if (!res) {
151 TLOG("NetworkSenderModel") << "Timeout detected, removing sender to re-acquire connection";
153 m_network_sender_ptr = nullptr;
154 }
155 return res;
156}
void remove_sender(ConnectionId const &conn_id)
Sender::timeout_t extend_first_timeout(Sender::timeout_t timeout)
std::vector< uint8_t > serialize(const T &obj, SerializationType stype)
Serialize object obj using serialization method stype.

◆ write_network() [1/2]

template<typename Datatype >
template<typename MessageType >
std::enable_if<!dunedaq::serialization::is_serializable< MessageType >::value, void >::type dunedaq::iomanager::NetworkSenderModel< Datatype >::write_network ( MessageType & ,
Sender::timeout_t const &  )
private

◆ write_network() [2/2]

template<typename Datatype >
template<typename MessageType >
std::enable_if<!dunedaq::serialization::is_serializable< MessageType >::value, void >::type dunedaq::iomanager::NetworkSenderModel< Datatype >::write_network ( MessageType & message,
Sender::timeout_t const & timeout )
inlineprivate

Definition at line 99 of file NetworkSenderModel.hxx.

100{
101 std::lock_guard<std::mutex> lk(m_send_mutex);
102 get_sender(timeout);
103 if (m_network_sender_ptr == nullptr) {
104 throw TimeoutExpired(
105 ERS_HERE, this->id().uid, "send", timeout.count(), ConnectionInstanceNotFound(ERS_HERE, this->id().uid));
106 }
107
109 // TLOG("NetworkSenderModel") << "Serialized message for network sending: " << serialized.size() << ", topic=" <<
110 // m_topic << ", this="
111 // << (void*)this;
112
113 try {
114 m_network_sender_ptr->send(serialized.data(), serialized.size(), extend_first_timeout(timeout), m_topic);
115 } catch (ipm::SendTimeoutExpired const& ex) {
116 TLOG("NetworkSenderModel") << "Timeout detected, removing sender to re-acquire connection";
118 m_network_sender_ptr = nullptr;
119 throw;
120 }
121}

◆ write_network_with_topic() [1/2]

template<typename Datatype >
template<typename MessageType >
std::enable_if<!dunedaq::serialization::is_serializable< MessageType >::value, void >::type dunedaq::iomanager::NetworkSenderModel< Datatype >::write_network_with_topic ( MessageType & ,
Sender::timeout_t const & ,
std::string  )
private

◆ write_network_with_topic() [2/2]

template<typename Datatype >
template<typename MessageType >
std::enable_if<!dunedaq::serialization::is_serializable< MessageType >::value, void >::type dunedaq::iomanager::NetworkSenderModel< Datatype >::write_network_with_topic ( MessageType & message,
Sender::timeout_t const & timeout,
std::string topic )
inlineprivate

Definition at line 170 of file NetworkSenderModel.hxx.

173{
174 std::lock_guard<std::mutex> lk(m_send_mutex);
175 get_sender(timeout);
176 if (m_network_sender_ptr == nullptr) {
177 throw TimeoutExpired(
178 ERS_HERE, this->id().uid, "send", timeout.count(), ConnectionInstanceNotFound(ERS_HERE, this->id().uid));
179 }
180
182 // TLOG("NetworkSenderModel") << "Serialized message for network sending: " << serialized.size() << ", topic=" <<
183 // m_topic << ", this="
184 // << (void*)this;
185
186 try {
187 m_network_sender_ptr->send(serialized.data(), serialized.size(), timeout, topic);
188 } catch (TimeoutExpired const& ex) {
189 m_network_sender_ptr = nullptr;
190 throw;
191 }
192}

Member Data Documentation

◆ m_first

template<typename Datatype >
std::atomic<bool> dunedaq::iomanager::NetworkSenderModel< Datatype >::m_first { true }
private

Definition at line 81 of file NetworkSenderModel.hpp.

81{ true };

◆ m_network_sender_ptr

template<typename Datatype >
std::shared_ptr<ipm::Sender> dunedaq::iomanager::NetworkSenderModel< Datatype >::m_network_sender_ptr
private

Definition at line 78 of file NetworkSenderModel.hpp.

◆ m_send_mutex

template<typename Datatype >
std::mutex dunedaq::iomanager::NetworkSenderModel< Datatype >::m_send_mutex
private

Definition at line 79 of file NetworkSenderModel.hpp.

◆ m_topic

template<typename Datatype >
std::string dunedaq::iomanager::NetworkSenderModel< Datatype >::m_topic { "" }
private

Definition at line 80 of file NetworkSenderModel.hpp.

80{ "" };

The documentation for this class was generated from the following files: