SObjectizer  5.8
Loading...
Searching...
No Matches
msg_tracing_individual.cpp
Go to the documentation of this file.
1/*
2 * SObjectizer-5
3 */
4
5/*!
6 * \file
7 * \brief Stuff related to individual message delivery tracing.
8 *
9 * \since v.5.8.3
10 */
11
12#include <so_5/msg_tracing_individual.hpp>
13
14#include <so_5/exception.hpp>
15
16namespace so_5::msg_tracing
17{
18
19namespace impl
20{
21
22//
23// special_enveloping_mbox_t
24//
25special_enveloping_mbox_t::special_enveloping_mbox_t(
26 mbox_t dest )
27 : m_dest{ std::move(dest) }
28 {}
29
30mbox_id_t
31special_enveloping_mbox_t::id() const
32 {
33 return m_dest->id();
34 }
35
36void
37special_enveloping_mbox_t::subscribe_event_handler(
38 const std::type_index & /*type_index*/,
39 abstract_message_sink_t & /*subscriber*/ )
40 {
41 SO_5_THROW_EXCEPTION( rc_not_implemented,
42 "subscribe_event_handler is not supported for "
43 "msg_tracing::impl::special_enveloping_mbox_t" );
44 }
45
46void
47special_enveloping_mbox_t::unsubscribe_event_handler(
48 const std::type_index & /*type_index*/,
49 abstract_message_sink_t & /*subscriber*/ ) noexcept
50 {
51 // Nothing to do.
52 }
53
55special_enveloping_mbox_t::query_name() const
56 {
57 return m_dest->query_name();
58 }
59
61special_enveloping_mbox_t::type() const
62 {
63 return m_dest->type();
64 }
65
66void
67special_enveloping_mbox_t::do_deliver_message(
68 message_delivery_mode_t delivery_mode,
69 const std::type_index & msg_type,
70 const message_ref_t & message,
71 unsigned int redirection_deep )
72 {
73 // The message has to be wrapped into a special envelope.
74 message_ref_t wrapped_msg{
75 std::make_unique< individual_tracing_envelope_t >( message )
76 };
77
78 m_dest->do_deliver_message( delivery_mode, msg_type, wrapped_msg, redirection_deep );
79 }
80
81void
82special_enveloping_mbox_t::set_delivery_filter(
83 const std::type_index & /*msg_type*/,
84 const delivery_filter_t & /*filter*/,
85 abstract_message_sink_t & /*subscriber*/ )
86 {
87 SO_5_THROW_EXCEPTION( rc_not_implemented,
88 "set_delivery_filter is not supported for "
89 "msg_tracing::impl::special_enveloping_mbox_t" );
90 }
91
92void
93special_enveloping_mbox_t::drop_delivery_filter(
94 const std::type_index & /*msg_type*/,
95 abstract_message_sink_t & /*subscriber*/ ) noexcept
96 {
97 // Nothing to do.
98 }
99
101special_enveloping_mbox_t::environment() const noexcept
102 {
103 return m_dest->environment();
104 }
105
106//
107// individual_tracing_envelope_t
108//
109individual_tracing_envelope_t::individual_tracing_envelope_t(
110 message_ref_t message )
112 {}
113
114void
115individual_tracing_envelope_t::access_hook(
116 access_context_t /*context*/,
117 handler_invoker_t & invoker ) noexcept
118 {
119 invoker.invoke( payload_info_t{ m_message } );
120 }
121
122} /* namespace impl */
123
124//
125// make_individual_trace_filter
126//
128filter_shptr_t
130 {
131 return make_filter( []( const trace_data_t & td ) -> bool {
132 const auto instance_info = td.message_instance_info();
133 if( instance_info && instance_info->m_envelope )
134 {
135 // Use the fact that instance_info.m_envelope is a pointer
136 // to message_t.
137 const message_t * msg =
138 //FIXME: it's better to have m_envelope as message_t pointer.
139 static_cast<const message_t *>(instance_info->m_envelope);
140
141 // It has to be an instance of the individual_tracing_envelope_t.
142 if( dynamic_cast< const impl::individual_tracing_envelope_t * >(msg) )
143 // Only now we can enable tracing.
144 return true;
145 }
146
147 // In all other cases the tracing has to be suppressed.
148 return false;
149 } );
150 }
151
152} /* namespace so_5::msg_tracing */
Interface for message sink.
An interface of delivery filter object.
Definition mbox.hpp:62
SObjectizer Environment.
individual_tracing_envelope_t(message_ref_t message)
Initializing constructor.
void access_hook(access_context_t context, handler_invoker_t &invoker) noexcept override
void subscribe_event_handler(const std::type_index &type_index, abstract_message_sink_t &subscriber) override
void drop_delivery_filter(const std::type_index &msg_type, abstract_message_sink_t &subscriber) noexcept override
so_5::environment_t & environment() const noexcept override
SObjectizer Environment for which the mbox is created.
special_enveloping_mbox_t(mbox_t dest)
Initializing constructor.
void unsubscribe_event_handler(const std::type_index &type_index, abstract_message_sink_t &subscriber) noexcept override
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) override
Implementation of message delivery.
void set_delivery_filter(const std::type_index &msg_type, const delivery_filter_t &filter, abstract_message_sink_t &subscriber) override
#define SO_5_FUNC
Definition declspec.hpp:48
#define SO_5_THROW_EXCEPTION(error_code, desc)
Definition exception.hpp:74
Implementation details of message delivery tracing mechanism.
Public part of message delivery tracing mechanism.
SO_5_FUNC filter_shptr_t make_individual_trace_filter()
Factory for special message tracing filter for individual tracing.
Private part of message limit implementation.
Definition agent.cpp:33
message_delivery_mode_t
Possible modes of message/signal delivery.
Definition types.hpp:172
mbox_type_t
Type of the message box.
Definition mbox.hpp:163