SObjectizer 5.8
Loading...
Searching...
No Matches
mpsc_mbox.hpp
Go to the documentation of this file.
1/*
2 SObjectizer 5.
3*/
4
5/*!
6 \file
7 \since
8 v.5.4.0
9
10 \brief A multi-producer/single-consumer mbox definition.
11*/
12
13#pragma once
14
15#include <so_5/types.hpp>
16#include <so_5/exception.hpp>
17#include <so_5/spinlocks.hpp>
18
19#include <so_5/mbox.hpp>
20#include <so_5/event_queue.hpp>
21#include <so_5/message_limit.hpp>
22
23#include <so_5/impl/local_mbox_basic_subscription_info.hpp>
24#include <so_5/impl/message_sink_without_message_limit.hpp>
25#include <so_5/impl/msg_tracing_helpers.hpp>
26
27#include <type_traits>
28
29namespace so_5
30{
31
32namespace impl
33{
34
35/*!
36 * \brief Mixin to be used in implementation of MPSC mbox with message limits.
37 *
38 * It returns a reference to a sink from subscription_info_with_sink_t object
39 * in message_sink_to_use() method.
40 */
42 {
44
45 protected:
46 [[nodiscard]]
47 agent_t &
48 query_owner_reference() const noexcept
49 {
50 return m_owner;
51 }
52
53 [[nodiscard]]
56 const local_mbox_details::subscription_info_with_sink_t & info ) const noexcept
57 {
58 return info.sink_reference();
59 }
60
61 public:
66 };
67
68/*!
69 * \brief Mixin to be used in implementation of MPSC mbox without message limits.
70 *
71 * Holds an actual instance of message_sink_without_message_limit_t.
72 *
73 * It ignores \a info parameter to message_sink_to_use() method and returns
74 * a reference to m_actual_sink.
75 */
77 {
78 //! Actual message sink to be used.
80
81 protected:
82 [[nodiscard]]
83 agent_t &
84 query_owner_reference() const noexcept
85 {
86 return m_actual_sink.owner_reference();
87 }
88
89 [[nodiscard]]
92 const local_mbox_details::subscription_info_with_sink_t & /*info*/ ) noexcept
93 {
94 return m_actual_sink;
95 }
96
97 public:
102 };
103
104namespace
105{
106
107/*!
108 * \brief Helper the ensures that sink can be used with agent.
109 *
110 * It throws if:
111 *
112 * - \a sink is not a message_sink_for_agent_t (or derived class);
113 * - \a sink is created for a different owner.
114 */
115void
117 agent_t & actual_owner,
119 {
120 auto * p = dynamic_cast<message_sink_for_agent_t *>( std::addressof(sink) );
121 if( !p )
124 "unexpected type of message_sink is used for subscription "
125 "to agent's direct mbox" );
126
127 if( std::addressof(actual_owner) != p->owner_pointer() )
130 "the only one consumer can create subscription to mpsc_mbox" );
131 }
132
133} /* namespace anonymous */
134
135//
136// mpsc_mbox_template_t
137//
138
139/*!
140 * \since
141 * v.5.4.0, v.5.7.1
142 *
143 * \brief A multi-producer/single-consumer mbox definition.
144 *
145 * \note Renamed from limitful_mpsc_mbox_t to limitful_mpsc_mbox_template
146 * in v.5.5.9.
147 * \note Renamed from limitful_mpsc_mbox_template to
148 * limitful_mpsc_mbox_template_t in v.5.7.1.
149 * \note Renamed from limitful_mpsc_mbox_template_t to
150 * mpsc_mbox_template_t in v.5.7.4.
151 */
152template<
153 typename Tracing_Base,
154 typename Limits_Handling_Mixin >
155class mpsc_mbox_template_t final
157 , private Limits_Handling_Mixin
158 , protected Tracing_Base
159 {
160 public:
161 template< typename... Tracing_Args >
163 mbox_id_t id,
164 environment_t & env,
166 Tracing_Args &&... tracing_args )
167 : Limits_Handling_Mixin{ owner }
168 , Tracing_Base{ std::forward< Tracing_Args >( tracing_args )... }
169 , m_id{ id }
170 , m_env{ env }
171 {}
172
173 mbox_id_t
174 id() const override
175 {
176 return m_id;
177 }
178
179 void
181 const std::type_index & msg_type,
182 abstract_message_sink_t & subscriber ) override
183 {
184 std::lock_guard< default_rw_spinlock_t > lock{ m_lock };
185
186 ensure_sink_for_same_owner(
187 this->query_owner_reference(),
188 subscriber );
189
190 insert_or_modify_subscription(
191 msg_type,
192 [&] {
193 return subscription_info_t{ subscriber };
194 },
195 [&]( subscription_info_t & info ) {
196 info.set_sink( subscriber );
197 } );
198 }
199
200 void
202 const std::type_index & msg_type,
203 abstract_message_sink_t & subscriber ) noexcept override
204 {
205 std::lock_guard< default_rw_spinlock_t > lock{ m_lock };
206
207 // ensure_sink_for_same_owner can't be used here because
208 // we're in noexcept method.
209 // So let's check the possiblity of unsubscription right here.
210 {
211 auto * p = dynamic_cast<message_sink_for_agent_t *>(
212 std::addressof(subscriber) );
213 if( !p )
214 return;
215
216 if( std::addressof(this->query_owner_reference()) !=
217 p->owner_pointer() )
218 return;
219 }
220
221 modify_and_remove_subscription_if_needed(
222 msg_type,
223 []( subscription_info_t & info ) {
224 info.drop_sink();
225 } );
226 }
227
228 std::string
229 query_name() const override
230 {
231 std::ostringstream s;
232 s << "<mbox:type=MPSC:id=" << m_id << ">";
233
234 return s.str();
235 }
236
238 type() const override
239 {
241 }
242
243 void
245 message_delivery_mode_t delivery_mode,
246 const std::type_index & msg_type,
247 const message_ref_t & message,
248 unsigned int redirection_deep ) override
249 {
250 typename Tracing_Base::deliver_op_tracer tracer{
251 *this, // as Tracing_Base
252 *this, // as abstract_message_box_t
253 "deliver_message",
254 delivery_mode,
255 msg_type,
256 message,
257 redirection_deep };
258
259 this->do_delivery(
260 msg_type,
261 message,
262 tracer,
263 [&]( const subscription_info_t & info )
264 {
265 // NOTE: method message_sink_to_use is inherited from
266 // Limits_Handling_Mixin. In the case of
267 // limitful_mpsc_mbox_mixin_t this method returns a reference
268 // to a separate sink with message limit info. In the case of
269 // limitless_mpsc_mbox_mixin_t it will be a reference to the
270 // single message sink without information about limits.
271 this->message_sink_to_use( info ).push_event(
272 this->m_id,
273 delivery_mode,
274 msg_type,
275 message,
276 redirection_deep,
277 tracer.overlimit_tracer() );
278 } );
279 }
280
281 void
283 const std::type_index & msg_type,
284 const delivery_filter_t & filter,
285 abstract_message_sink_t & subscriber ) override
286 {
287 std::lock_guard< default_rw_spinlock_t > lock{ m_lock };
288
289 ensure_sink_for_same_owner(
290 this->query_owner_reference(),
291 subscriber );
292
293 insert_or_modify_subscription(
294 msg_type,
295 [&] {
296 return subscription_info_t{ filter };
297 },
298 [&]( subscription_info_t & info ) {
299 info.set_filter( filter );
300 } );
301 }
302
303 void
305 const std::type_index & msg_type,
306 abstract_message_sink_t & /*subscriber*/ ) noexcept override
307 {
308 std::lock_guard< default_rw_spinlock_t > lock{ m_lock };
309
310 modify_and_remove_subscription_if_needed(
311 msg_type,
312 []( subscription_info_t & info ) {
313 info.drop_filter();
314 } );
315 }
316
318 environment() const noexcept override
319 {
320 return m_env;
321 }
322
323 protected :
324 /*!
325 * \brief Information related to a subscribed message type.
326 *
327 * \since v.5.7.4
328 */
330
331 /*!
332 * \brief Type of dictionary for information about the current
333 * subscriptions.
334 *
335 * \since v.5.7.1
336 */
337 using subscriptions_map_t = std::map<
338 std::type_index,
339 subscription_info_t >;
340
341 /*!
342 * \brief ID of this mbox.
343 */
344 const mbox_id_t m_id;
345
346 /*!
347 * \brief Environment in that the mbox was created.
348 *
349 * \note
350 * Previous versions of SObjectizer didn't hold this reference
351 * in MPSC-mbox implementations. Instead, the reference was
352 * obtained via m_single_consumer. But this approach lead to
353 * access violation when MPSC-mbox's environment() method was
354 * called after the deregistration of m_single_consumer.
355 * Because of than the reference to SOEnv is stored inside
356 * MPSC-mbox and is returned by environment() method.
357 *
358 * \since v.5.7.5
359 */
361
362 /*!
363 * \brief Protection of object from modification.
364 *
365 * \since v.5.5.9
366 */
367 default_rw_spinlock_t m_lock;
368
369 /*!
370 * \brief Information about the current subscriptions.
371 *
372 * \since v.5.7.1
373 */
374 subscriptions_map_t m_subscriptions;
375
376 /*!
377 * \brief Helper for performing insertion or modification
378 * of subscription info.
379 *
380 * \since v.5.7.4
381 */
382 template< typename Info_Maker, typename Info_Changer >
383 void
385 const std::type_index & msg_type,
386 Info_Maker maker,
387 Info_Changer changer )
388 {
389 auto it = m_subscriptions.find( msg_type );
390 if( it == m_subscriptions.end() )
391 {
392 // Subscription for that type has to be created.
393 m_subscriptions.emplace( msg_type, maker() );
394 }
395 else
396 {
397 // Subscription for that type has to be modified.
398 changer( it->second );
399 }
400 }
401
402 /*!
403 * \brief Helper for modification and deletion of
404 * subscription info.
405 *
406 * \since v.5.7.4
407 */
408 template< typename Info_Changer >
409 void
411 const std::type_index & msg_type,
412 Info_Changer changer )
413 {
414 auto it = m_subscriptions.find( msg_type );
415 if( it != m_subscriptions.end() )
416 {
417 changer( it->second );
418 if( it->second.empty() )
419 m_subscriptions.erase( it );
420 }
421 }
422
423 /*!
424 * \since
425 * v.5.5.9
426 *
427 * \brief Helper method to do delivery actions under locked object.
428 *
429 * \tparam L lambda with actual delivery actions.
430 */
431 template< typename L >
432 void
434 //! Type of message/signal to be delivered.
435 const std::type_index & msg_type,
436 //! Message object to be delivered.
437 const message_ref_t & message,
438 //! Tracer object to log the case of abscense of subscriptions.
439 typename Tracing_Base::deliver_op_tracer const & tracer,
440 //! Lambda with actual delivery actions.
441 L l )
442 {
443 read_lock_guard_t< default_rw_spinlock_t > lock{ m_lock };
444
445 const auto it = m_subscriptions.find( msg_type );
446 if( it != m_subscriptions.end() )
447 {
448 // Since v.5.7.4 we have to ask delivery_filter before the
449 // delivery attempt.
450 const auto delivery_status =
451 it->second.must_be_delivered(
452 message,
453 []( const message_ref_t & m ) -> message_t & {
454 return *m;
455 } );
456
457 if( delivery_possibility_t::must_be_delivered == delivery_status )
458 {
459 l( it->second );
460 }
461 else
462 {
463 tracer.message_rejected(
464 // It's safe to pass nullptr as a pointer
465 // to the subscriber.
466 nullptr,
467 delivery_status );
468 }
469 }
470 else
471 {
472 tracer.no_subscribers();
473 }
474 }
475 };
476
477/*!
478 * \since v.5.5.9, v.5.7.4, v.5.8.0
479 *
480 * \brief Alias for mpsc_mbox without message delivery tracing.
481 */
482using ordinary_mpsc_mbox_without_tracing_t =
483 mpsc_mbox_template_t<
486 >;
487
488/*!
489 * \since v.5.5.9, v.5.7.4, v.5.8.0
490 *
491 * \brief Alias for mpsc_mbox with message delivery tracing.
492 */
493using ordinary_mpsc_mbox_with_tracing_t =
494 mpsc_mbox_template_t<
497 >;
498
499/*!
500 * \brief Alias for mpsc_mbox without message delivery tracing that
501 * ignores message limits.
502 *
503 * \since v.5.8.0
504 */
505using limitless_mpsc_mbox_without_tracing_t =
506 mpsc_mbox_template_t<
509 >;
510
511/*!
512 * \brief Alias for mpsc_mbox with message delivery tracing that
513 * ignores message limits.
514 *
515 * \since v.5.8.0
516 */
517using limitless_mpsc_mbox_with_tracing_t =
518 mpsc_mbox_template_t<
521 >;
522
523} /* namespace impl */
524
525} /* namespace so_5 */
Interface for message sink.
static bool special_sink_ptr_compare(const abstract_message_sink_t *a, const abstract_message_sink_t *b) noexcept
virtual void push_event(mbox_id_t mbox_id, 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 *tracer)=0
Get a message and push it to the appropriate destination.
A base class for agents.
Definition agent.hpp:673
Interface for creator of new mbox in OOP style.
virtual mbox_t create(const mbox_creation_data_t &data)=0
Creation of custom mbox.
An interface of delivery filter object.
Definition mbox.hpp:62
SObjectizer Environment.
Mixin to be used in implementation of MPSC mbox with message limits.
Definition mpsc_mbox.hpp:42
agent_t & query_owner_reference() const noexcept
Definition mpsc_mbox.hpp:48
abstract_message_sink_t & message_sink_to_use(const local_mbox_details::subscription_info_with_sink_t &info) const noexcept
Definition mpsc_mbox.hpp:55
limitful_mpsc_mbox_mixin_t(outliving_reference_t< agent_t > owner)
Definition mpsc_mbox.hpp:62
Mixin to be used in implementation of MPSC mbox without message limits.
Definition mpsc_mbox.hpp:77
message_sink_without_message_limit_t m_actual_sink
Actual message sink to be used.
Definition mpsc_mbox.hpp:79
agent_t & query_owner_reference() const noexcept
Definition mpsc_mbox.hpp:84
abstract_message_sink_t & message_sink_to_use(const local_mbox_details::subscription_info_with_sink_t &) noexcept
Definition mpsc_mbox.hpp:91
limitless_mpsc_mbox_mixin_t(outliving_reference_t< agent_t > owner)
Definition mpsc_mbox.hpp:98
A special container for holding subscriber_info objects.
subscriber_adaptive_container_t(const subscriber_adaptive_container_t &o)
Copy constructor.
storage_type m_storage
The current storage type to be used by container.
subscriber_adaptive_container_t & operator=(subscriber_adaptive_container_t &&o) noexcept
Move operator.
void insert_to_vector(abstract_message_sink_t &sink_as_key, subscription_info_with_sink_t &&info)
Insertion of new item to vector.
void emplace(abstract_message_sink_t &sink_as_key, Args &&... args)
friend void swap(subscriber_adaptive_container_t &a, subscriber_adaptive_container_t &b) noexcept
vector_type m_vector
Container for small amount of subscriber_infos.
void insert(abstract_message_sink_t &sink_as_key, subscription_info_with_sink_t info)
void insert_to_map(abstract_message_sink_t &sink_as_key, subscription_info_with_sink_t &&info)
Insertion of new item to map.
subscriber_adaptive_container_t(subscriber_adaptive_container_t &&o) noexcept
Move constructor.
void switch_storage_to_map()
Switching storage from vector to map.
iterator find(abstract_message_sink_t &subscriber)
map_type m_map
Container for large amount of subscriber_infos.
iterator find_in_vector(abstract_message_sink_t &subscriber)
subscriber_adaptive_container_t & operator=(const subscriber_adaptive_container_t &o)
Copy operator.
iterator find_in_map(abstract_message_sink_t &subscriber)
void switch_storage_to_vector()
Switching storage from map to vector.
An information block about one subscription to one message type with presence of message_sink.
void set_filter(const delivery_filter_t &filter)
Set the delivery filter for the subscriber.
abstract_message_sink_t & sink_reference() const noexcept
Get a reference to the subscribed sink.
abstract_message_sink_t * sink_pointer() const noexcept
Get a pointer to the subscribed sink.
void set_sink(abstract_message_sink_t &sink)
Inform about addition of a subscription.
A template with implementation of local mbox.
mbox_type_t type() const override
Get the type of message box.
environment_t & environment() const noexcept override
SObjectizer Environment for which the mbox is created.
mbox_id_t id() const override
Unique ID of this mbox.
void do_deliver_message_impl(typename Tracing_Base::deliver_op_tracer const &tracer, message_delivery_mode_t delivery_mode, const std::type_index &msg_type, const message_ref_t &message, unsigned int redirection_deep)
void set_delivery_filter(const std::type_index &msg_type, const delivery_filter_t &filter, abstract_message_sink_t &subscriber) override
Set a delivery filter for message type and subscriber.
void do_deliver_message_to_subscriber(const local_mbox_details::subscription_info_with_sink_t &subscriber_info, typename Tracing_Base::deliver_op_tracer const &tracer, message_delivery_mode_t delivery_mode, const std::type_index &msg_type, const message_ref_t &message, unsigned int redirection_deep) const
void ensure_immutable_message(const std::type_index &msg_type, const message_ref_t &what) const
Ensures that message is an immutable message.
local_mbox_template(mbox_id_t id, environment_t &env, Tracing_Args &&... args)
void modify_and_remove_subscriber_if_needed(const std::type_index &type_wrapper, abstract_message_sink_t &subscriber, Info_Changer changer)
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
Deliver message for all subscribers with respect to message limits.
void subscribe_event_handler(const std::type_index &type_wrapper, abstract_message_sink_t &subscriber) override
Add the message handler.
void unsubscribe_event_handler(const std::type_index &type_wrapper, abstract_message_sink_t &subscriber) noexcept override
Remove all message handlers.
std::string query_name() const override
Get the mbox name.
void insert_or_modify_subscriber(const std::type_index &type_wrapper, abstract_message_sink_t &subscriber, Info_Maker maker, Info_Changer changer)
void drop_delivery_filter(const std::type_index &msg_type, abstract_message_sink_t &subscriber) noexcept override
Removes delivery filter for message type and subscriber.
mbox_t create_ordinary_mpsc_mbox(environment_t &env, agent_t &owner)
Create mpsc_mbox that handles message limits.
mbox_t create_limitless_mpsc_mbox(environment_t &env, agent_t &owner)
Create mpsc_mbox that ignores message limits.
named_mboxes_dictionary_t m_named_mboxes_dictionary
Named mboxes.
mbox_t introduce_named_mbox(mbox_namespace_name_t mbox_namespace, nonempty_name_t mbox_name, const std::function< mbox_t() > &mbox_factory)
Introduce named mbox with user-provided factory.
outliving_reference_t< so_5::msg_tracing::holder_t > m_msg_tracing_stuff
Data related to message delivery tracing.
mbox_core_t(outliving_reference_t< so_5::msg_tracing::holder_t > msg_tracing_stuff)
Definition mbox_core.cpp:27
std::mutex m_dictionary_lock
Named mbox map's lock.
mbox_t create_custom_mbox(environment_t &env, ::so_5::custom_mbox_details::creator_iface_t &creator)
Create a custom mbox.
std::atomic< mbox_id_t > m_mbox_id_counter
A counter for mbox ID generation.
void destroy_mbox(const full_named_mbox_id_t &name) noexcept
Remove a reference to the named mbox.
mchain_t create_mchain(environment_t &env, const mchain_params_t &params)
Create message chain.
mbox_t create_mbox(environment_t &env)
Create local anonymous mbox.
Definition mbox_core.cpp:35
mbox_t create_mbox(environment_t &env, nonempty_name_t mbox_name)
Create local named mbox.
Definition mbox_core.cpp:46
mbox_id_t allocate_mbox_id() noexcept
Allocate an ID for a new custom mbox or mchain.
mbox_core_stats_t query_stats()
Get statistics for run-time monitoring.
A base class for message sinks to be used by agents.
void push_event(mbox_id_t mbox_id, message_delivery_mode_t, const std::type_index &msg_type, const message_ref_t &message, unsigned int, const message_limit::impl::action_msg_tracer_t *tracer) override
Get a message and push it to the appropriate destination.
mpsc_mbox_template_t(mbox_id_t id, environment_t &env, outliving_reference_t< agent_t > owner, Tracing_Args &&... tracing_args)
mbox_type_t type() const override
Get the type of message box.
void modify_and_remove_subscription_if_needed(const std::type_index &msg_type, Info_Changer changer)
Helper for modification and deletion of subscription info.
const mbox_id_t m_id
ID of this mbox.
void unsubscribe_event_handler(const std::type_index &msg_type, abstract_message_sink_t &subscriber) noexcept override
Remove all message handlers.
void do_delivery(const std::type_index &msg_type, const message_ref_t &message, typename Tracing_Base::deliver_op_tracer const &tracer, L l)
Helper method to do delivery actions under locked object.
subscriptions_map_t m_subscriptions
Information about the current subscriptions.
default_rw_spinlock_t m_lock
Protection of object from modification.
void drop_delivery_filter(const std::type_index &msg_type, abstract_message_sink_t &) noexcept override
Removes delivery filter for message type and subscriber.
void set_delivery_filter(const std::type_index &msg_type, const delivery_filter_t &filter, abstract_message_sink_t &subscriber) override
Set a delivery filter for message type and subscriber.
std::string query_name() const override
Get the mbox name.
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
Deliver message for all subscribers with respect to message limits.
void subscribe_event_handler(const std::type_index &msg_type, abstract_message_sink_t &subscriber) override
Add the message handler.
mbox_id_t id() const override
Unique ID of this mbox.
environment_t & environment() const noexcept override
SObjectizer Environment for which the mbox is created.
void insert_or_modify_subscription(const std::type_index &msg_type, Info_Maker maker, Info_Changer changer)
Helper for performing insertion or modification of subscription info.
environment_t & m_env
Environment in that the mbox was created.
Base class for a mbox for the case when message delivery tracing is enabled.
void set_delivery_filter(const std::type_index &msg_type, const delivery_filter_t &filter, abstract_message_sink_t &subscriber) override
Set a delivery filter for message type and subscriber.
mbox_id_t id() const override
Unique ID of this mbox.
void subscribe_event_handler(const std::type_index &type_wrapper, abstract_message_sink_t &subscriber) override
Add the message handler.
named_local_mbox_t(full_named_mbox_id_t full_name, const mbox_t &mbox, impl::mbox_core_t &mbox_core)
mbox_type_t type() const override
Get the type of message box.
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
Deliver message for all subscribers with respect to message limits.
impl::mbox_core_ref_t m_mbox_core
An utility for this mbox.
environment_t & environment() const noexcept override
SObjectizer Environment for which the mbox is created.
std::string query_name() const override
Get the mbox name.
void unsubscribe_event_handler(const std::type_index &type_wrapper, abstract_message_sink_t &subscriber) noexcept override
Remove all message handlers.
void drop_delivery_filter(const std::type_index &msg_type, abstract_message_sink_t &subscriber) noexcept override
Removes delivery filter for message type and subscriber.
const full_named_mbox_id_t m_name
Mbox name.
intrusive_ptr_t(T *obj) noexcept
Constructor for a raw pointer.
intrusive_ptr_t & operator=(intrusive_ptr_t &&o) noexcept
Move operator.
T & operator*() const noexcept
A class for the name of mbox_namespace.
std::string_view query_name() const noexcept(noexcept(std::string_view{m_name}))
Get the value.
Parameters for message chain.
Definition mchain.hpp:729
const mchain_props::capacity_t & capacity() const
Get chain's capacity and related params.
Definition mchain.hpp:757
memory_usage_t memory_usage() const
Memory allocation type for size-limited chain.
Definition mchain.hpp:332
bool unlimited() const
Is message chain have no size limit?
Definition mchain.hpp:318
Implementation of demands queue for size-limited message chain with dynamically allocated storage.
Implementation of demands queue for size-limited message chain with preallocated storage.
Implementation of demands queue for size-unlimited message chain.
A base class for agent messages.
Definition message.hpp:47
friend message_mutability_t message_mutability(const intrusive_ptr_t< message_t > &what) noexcept
Helper method for safe get of message mutability flag.
Definition message.hpp:74
Interface of holder of message tracer and message trace filter objects.
virtual bool is_msg_tracing_enabled() const noexcept=0
Is message tracing enabled?
A class for the name which cannot be empty.
std::string giveout_value() noexcept(noexcept(std::string{ std::move(m_nonempty_name) }))
Get the value away from the object.
Helper class for indication of long-lived reference via its type.
Definition outliving.hpp:98
T & get() const noexcept
outliving_reference_t(outliving_reference_t const &o) noexcept
Scoped guard for shared locks.
#define SO_5_THROW_EXCEPTION(error_code, desc)
Definition exception.hpp:74
Some reusable and low-level classes/functions which can be used in public header files.
auto invoke_noexcept_code(L lambda) noexcept -> decltype(lambda())
std::unique_ptr< abstract_message_box_t > make_actual_mbox(outliving_reference_t< so_5::msg_tracing::holder_t > msg_tracing_stuff, A &&... args)
void ensure_sink_for_same_owner(agent_t &actual_owner, abstract_message_sink_t &sink)
Helper the ensures that sink can be used with agent.
Implementation details for MPMC mboxes.
Various helpers for message delivery tracing mechanism.
Details of SObjectizer run-time implementations.
Definition agent.cpp:780
mchain_t make_mchain(outliving_reference_t< so_5::msg_tracing::holder_t > tracer, const mchain_params_t &params, A &&... args)
Helper function for creation of a new mchain with respect to message tracing.
std::string default_global_mbox_namespace()
Helper function that returns name of the default global namespace for named mboxes.
Implementation details.
Definition mchain.hpp:37
Various properties and parameters of message chains.
Definition mchain.hpp:28
memory_usage_t
Memory allocation for storage for size-limited chains.
Definition mchain.hpp:182
@ dynamic
Storage can be allocated and deallocated dynamically.
Public part of message delivery tracing mechanism.
Private part of message limit implementation.
Definition agent.cpp:33
const int rc_nullptr_as_result_of_user_mbox_factory
nullptr returned by user-provided mbox factory.
Definition ret_code.hpp:468
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
message_mutability_t
A enum with variants of message mutability or immutability.
Definition types.hpp:94
delivery_possibility_t
Result of checking delivery posibility.
Definition mbox.hpp:39
const int rc_illegal_subscriber_for_mpsc_mbox
An attempt to create illegal subscription to mpsc_mbox.
Definition ret_code.hpp:115
const int rc_mutable_msg_cannot_be_delivered_via_mpmc_mbox
An attempt to deliver mutable message via MPMC mbox.
Definition ret_code.hpp:234
outliving_reference_t< T > outliving_mutable(T &r)
Make outliving_reference wrapper for mutable reference.
Full name for a named mbox.
Definition mbox_core.hpp:69
full_named_mbox_id_t(std::string mbox_namespace, std::string mbox_name)
Initializing constructor.
Definition mbox_core.hpp:86
A coolection of data required for local mbox implementation.
messages_table_t m_subscribers
Map of subscribers to messages.
data_t(mbox_id_t id, environment_t &env)
environment_t & m_env
Environment for which the mbox is created.
default_rw_spinlock_t m_lock
Object lock.
const mbox_id_t m_id
ID of this mbox.
bool operator()(abstract_message_sink_t *a, abstract_message_sink_t *b) const noexcept
bool operator()(const subscribers_vector_item_t &a, const subscribers_vector_item_t &b) const noexcept
subscription_info_with_sink_t m_info
Information about the subscription.
abstract_message_sink_t * m_sink_as_key
Pointer to sink that has to be used as search key.
subscribers_vector_item_t(abstract_message_sink_t &sink_as_key, subscription_info_with_sink_t info)
The normal initializing constructor.
Statistics from mbox_core for run-time monitoring.
Definition mbox_core.hpp:49
mbox_t m_mbox
Real mbox for that name.
unsigned int m_external_ref_count
Reference count by external mbox_refs.
Base class for a mbox for the case when message delivery tracing is disabled.
An information which is necessary for creation of a new mbox.
mbox_creation_data_t(outliving_reference_t< environment_t > env, mbox_id_t id, outliving_reference_t< msg_tracing::holder_t > tracer)
Initializing constructor.