SObjectizer 5.8
Loading...
Searching...
No Matches
mbox.cpp
Go to the documentation of this file.
1/*
2 SObjectizer 5.
3*/
4
5#include <so_5/mbox.hpp>
6
7#include <so_5/ret_code.hpp>
8
9#include <so_5/environment.hpp>
10
11namespace so_5
12{
13
14//
15// abstract_message_box_t
16//
17
18//
19// wrap_to_msink
20//
21
23{
24
25//
26// mbox_as_sink_t
27//
28/*!
29 * \brief Implementation of abstract_message_sink for a case when
30 * the destination is a mbox.
31 *
32 * \note
33 * Because mbox has no priority, but message_sink should have it, the
34 * priority has to be specified in the constructor.
35 */
36class mbox_as_sink_t final : public abstract_message_sink_t
37 {
38 //! The destination for messages.
39 const mbox_t m_mbox;
40
41 //! The priority for the sink.
43
44 public:
45 //! Initializing constructor.
47 mbox_t mbox,
48 priority_t priority )
49 : m_mbox{ std::move(mbox) }
50 , m_sink_priority{ priority }
51 {}
52
54 environment() const noexcept override
55 {
57 }
58
60 sink_priority() const noexcept override
61 {
62 return m_sink_priority;
63 }
64
65 /*!
66 * Actual implementation of so_5::abstract_message_sink_t::push_event().
67 *
68 * If \a redirection_deep exceeds so_5::max_redirection_deep then message is
69 * ignored (with logging). Otherwise the message is pushed to m_mbox.
70 */
71 void
73 mbox_id_t /*mbox_id*/,
74 message_delivery_mode_t delivery_mode,
75 const std::type_index & msg_type,
76 const message_ref_t & message,
77 unsigned int redirection_deep,
78 const message_limit::impl::action_msg_tracer_t * /*tracer*/ ) override
79 {
80 if( redirection_deep >= max_redirection_deep )
81 {
82 // NOTE: this fragment can throw but it isn't a problem
83 // because transform_reaction() is called during message
84 // delivery process and exceptions are expected in that
85 // process.
88 logger )
89 logger << "maximum message redirection deep exceeded on "
90 "mbox_as_sink::push_event; message will be ignored;"
91 << " msg_type: " << msg_type.name()
92 << ", target_mbox: " << m_mbox->query_name();
93 }
94 else
95 {
97 delivery_mode,
98 msg_type,
99 message,
100 // redirection_deep has to be increased.
101 redirection_deep + 1u );
102 }
103 }
104 };
105
106} /* namespace as_msink_impl */
107
108msink_t
110 const mbox_t & mbox,
111 so_5::priority_t sink_priority )
112 {
113 return msink_t{
114 std::make_unique<
115 simple_sink_owner_t< as_msink_impl::mbox_as_sink_t >
116 >( mbox, sink_priority )
117 };
118 }
119
120} /* namespace so_5 */
virtual so_5::environment_t & environment() const noexcept=0
SObjectizer Environment for which the mbox is created.
virtual std::string query_name() const =0
Get the mbox name.
virtual void do_deliver_message(message_delivery_mode_t delivery_mode, const std::type_index &msg_type, const message_ref_t &message, unsigned int redirection_deep)=0
Deliver message for all subscribers with respect to message limits.
Interface for message sink.
const priority_t m_sink_priority
The priority for the sink.
Definition mbox.cpp:42
priority_t sink_priority() const noexcept override
Get the priority for the message sink.
Definition mbox.cpp:60
void push_event(mbox_id_t, message_delivery_mode_t delivery_mode, const std::type_index &msg_type, const message_ref_t &message, unsigned int redirection_deep, const message_limit::impl::action_msg_tracer_t *) override
Definition mbox.cpp:72
mbox_as_sink_t(mbox_t mbox, priority_t priority)
Initializing constructor.
Definition mbox.cpp:46
environment_t & environment() const noexcept override
Definition mbox.cpp:54
const mbox_t m_mbox
The destination for messages.
Definition mbox.cpp:39
SObjectizer Environment.
error_logger_t & error_logger() const
Get the error_logger object.
intrusive_ptr_t(intrusive_ptr_t &&o) noexcept
Move constructor.
T * operator->() const noexcept
An interface of tracer for message delivery tracing.
#define SO_5_LOG_ERROR(logger, var_name)
A special macro for helping error logging.
Internal implementation of message limits related stuff.
Definition message.hpp:883
All stuff related to message limits.
Definition message.hpp:862
Private part of message limit implementation.
Definition agent.cpp:33
message_delivery_mode_t
Possible modes of message/signal delivery.
Definition types.hpp:172
constexpr unsigned int max_redirection_deep
Maximum deep of message redirections.
priority_t
Definition of supported priorities.
Definition priority.hpp:28
msink_t SO_5_FUNC wrap_to_msink(const mbox_t &mbox, priority_t sink_priority=prio::p0)
Helper for wrapping an existing mbox into message_sink.
Definition mbox.cpp:109