2
3
6
7
8
9
10
11
15#include <so_5/mchain.hpp>
16#include <so_5/mchain_select_ifaces.hpp>
17#include <so_5/environment.hpp>
19#include <so_5/ret_code.hpp>
20#include <so_5/exception.hpp>
21#include <so_5/error_logger.hpp>
23#include <so_5/details/abort_on_fatal_error.hpp>
24#include <so_5/details/at_scope_exit.hpp>
25#include <so_5/details/safe_cv_wait_for.hpp>
30#include <condition_variable>
42
43
44
45
46
51 if( queue.is_empty() )
54 "an attempt to get message from empty demand queue" );
61
62
63
64
65
73 "an attempt to push a message to full demand queue" );
80
81
82
83
84
89
90
95
96
97
128 m_queue.push_back( std::move(demand) );
145
146
147
148
149
150
192 m_queue.push_back( std::move(demand) );
211
212
213
214
215
216
289
290
291
292
293
308
309
310
311
312
313
314
315
316template<
typename Queue,
typename Tracing_Base >
319 ,
private Tracing_Base
323 template<
typename... Tracing_Args >
332 Tracing_Args &&... tracing_args )
333 : Tracing_Base( std::forward<Tracing_Args>(tracing_args)... )
349 const std::type_index & ,
354 "mchain doesn't support subscription" );
359 const std::type_index & ,
366 std::ostringstream s;
367 s <<
"<mchain:id=" <<
m_id <<
">";
381 const std::type_index & msg_type,
382 const message_ref_t & message,
383 unsigned int )
override
385 switch( delivery_mode )
388 this->try_to_store_message_to_queue_ordinary_mode(
394 this->try_to_store_message_to_queue_nonblocking_mode(
402
403
404
407 const std::type_index & ,
413 "set_delivery_filter is called for mchain" );
418 const std::type_index & ,
426 duration_t empty_queue_timeout )
override
428 std::unique_lock< std::mutex > lock{
m_lock };
431 bool queue_empty =
m_queue.is_empty();
439 auto predicate = [
this, &queue_empty]() ->
bool {
440 queue_empty =
m_queue.is_empty();
441 return !queue_empty ||
448 auto decrement_threads =
so_5::
details::at_scope_exit(
496 std::unique_lock< std::mutex > lock{
m_lock };
498 const bool queue_empty =
m_queue.is_empty();
518 const std::type_index & msg_type,
519 const message_ref_t & message,
522 typename Tracing_Base::deliver_op_tracer tracer{
528 std::unique_lock< std::mutex > lock{
m_lock };
558 std::lock_guard< std::mutex > lock{
m_lock };
565 if( c == &select_case )
583 std::lock_guard< std::mutex > lock{
m_lock };
590 const bool was_full =
m_queue.is_full();
596 this->trace_demand_drop_on_close(
645
646
647
648
649
650
651
652
656
657
658
659
660
665
666
667
668
669
672 const std::type_index & msg_type,
673 const message_ref_t & message )
675 typename Tracing_Base::deliver_op_tracer tracer{
681 std::unique_lock< std::mutex > lock{
m_lock };
690 bool queue_full =
m_queue.is_full();
697 [
this, &queue_full] {
698 queue_full =
m_queue.is_full();
699 return !queue_full ||
719 tracer.overflow_drop_newest();
725 tracer.overflow_remove_oldest(
m_queue.front() );
730 tracer.overflow_throw_exception();
733 "an attempt to push message to full mchain "
734 "with overflow_reaction_t::throw_exception policy" );
739 tracer.overflow_throw_exception();
741 log_stream <<
"overflow_reaction_t::abort_app "
742 "will be performed for mchain (id="
743 <<
m_id <<
"), msg_type: "
745 <<
". Application will be aborted"
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
778 const std::type_index & msg_type,
779 const message_ref_t & message )
781 typename Tracing_Base::deliver_op_tracer tracer{
787 std::unique_lock< std::mutex > lock{
m_lock };
793 bool queue_full =
m_queue.is_full();
803 tracer.overflow_drop_newest();
809 tracer.overflow_remove_oldest(
m_queue.front() );
815 tracer.overflow_throw_exception();
817 log_stream <<
"overflow_reaction_t::abort_app "
818 "will be performed for mchain (id="
819 <<
m_id <<
"), msg_type: "
821 <<
". Application will be aborted"
835
836
837
838
839
840
841
842
843
849 const bool queue_was_full =
m_queue.is_full();
850 dest = std::move(
m_queue.front() );
853 this->trace_extracted_demand( *
this, dest );
868
869
870
883
884
885
886
887
888
889
890
891
892
895 typename Tracing_Base::deliver_op_tracer & tracer,
896 const std::type_index & msg_type,
897 const message_ref_t & message )
899 const bool was_empty =
m_queue.is_empty();
An interace of message chain.
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.
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.
Mixin to be used in implementation of MPSC mbox with message limits.
agent_t & query_owner_reference() const noexcept
abstract_message_sink_t & message_sink_to_use(const local_mbox_details::subscription_info_with_sink_t &info) const noexcept
limitful_mpsc_mbox_mixin_t(outliving_reference_t< agent_t > owner)
Mixin to be used in implementation of MPSC mbox without message limits.
message_sink_without_message_limit_t m_actual_sink
Actual message sink to be used.
agent_t & query_owner_reference() const noexcept
abstract_message_sink_t & message_sink_to_use(const local_mbox_details::subscription_info_with_sink_t &) noexcept
limitless_mpsc_mbox_mixin_t(outliving_reference_t< agent_t > owner)
const subscription_info_with_sink_t * operator->() const
const subscription_info_with_sink_t & operator*() const
const_map_iterator_type m_it_m
const_vector_iterator_type m_it_v
const_iterator & operator++()
const_iterator(const_vector_iterator_type it_v)
bool operator!=(const const_iterator &o) const
const_iterator(const_map_iterator_type it_m)
bool operator==(const const_iterator &o) const
const_iterator operator++(int)
iterator(map_iterator_type it_m)
bool operator==(const iterator &o) const
vector_iterator_type m_it_v
iterator(vector_iterator_type it_v)
subscription_info_with_sink_t & operator*()
bool operator!=(const iterator &o) const
subscription_info_with_sink_t * operator->()
A special container for holding subscriber_info objects.
subscriber_adaptive_container_t(const subscriber_adaptive_container_t &o)
Copy constructor.
bool is_vector() const
Is vector used as a storage.
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
const_iterator begin() const
const_iterator end() const
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)
subscriber_adaptive_container_t()
Default constructor.
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.
void erase(const iterator &it)
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.
void drop_filter()
Drop the delivery filter for the subscriber.
subscription_info_with_sink_t(const delivery_filter_t &filter)
void drop_sink()
Inform about removal of a subscription.
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.
bool empty() const noexcept
void set_sink(abstract_message_sink_t &sink)
Inform about addition of a subscription.
subscription_info_with_sink_t(abstract_message_sink_t &sink)
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)
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 ¶ms)
Create message chain.
mbox_t create_mbox(environment_t &env)
Create local anonymous mbox.
mbox_t create_mbox(environment_t &env, nonempty_name_t mbox_name)
Create local named mbox.
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.
mbox_t m_mbox
Actual mbox.
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.
~named_local_mbox_t() override
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.
const mchain_props::not_empty_notification_func_t & not_empty_notificator() const
Get chain's notificator for 'not_empty' condition.
const mchain_props::capacity_t & capacity() const
Get chain's capacity and related params.
Parameters for defining chain size.
memory_usage_t memory_usage() const
Memory allocation type for size-limited chain.
bool unlimited() const
Is message chain have no size limit?
overflow_reaction_t overflow_reaction() const
Overflow reaction for size-limited chain.
duration_t overflow_timeout() const
Get the value of waiting timeout for overflow case.
bool is_overflow_timeout_defined() const
Is waiting timeout for overflow case defined?
std::size_t max_size() const
Max size for size-limited chain.
Implementation of demands queue for size-limited message chain with dynamically allocated storage.
bool is_full() const noexcept
Is queue full?
limited_dynamic_demand_queue(const capacity_t &capacity)
Initializing constructor.
std::size_t size() const noexcept
Size of the queue.
std::deque< demand_t > m_queue
Queue's storage.
bool is_empty() const noexcept
Is queue empty?
void pop_front()
Remove the front item from queue.
void push_back(demand_t &&demand)
Add a new item to the end of the queue.
const std::size_t m_max_size
Maximum size of the queue.
demand_t & front()
Access to front item from queue.
Implementation of demands queue for size-limited message chain with preallocated storage.
std::size_t m_size
The current size of the queue.
std::size_t size() const noexcept
Size of the queue.
bool is_empty() const noexcept
Is queue empty?
void pop_front()
Remove the front item from queue.
void push_back(demand_t &&demand)
Add a new item to the end of the queue.
bool is_full() const noexcept
Is queue full?
std::vector< demand_t > m_storage
Queue's storage.
const std::size_t m_max_size
Maximum size of the queue.
limited_preallocated_demand_queue(const capacity_t &capacity)
Initializing constructor.
demand_t & front()
Access to front item from queue.
std::size_t m_head
Index of the queue head.
Implementation of demands queue for size-unlimited message chain.
unlimited_demand_queue(const capacity_t &)
demand_t & front()
Access to front item from queue.
void push_back(demand_t &&demand)
Add a new item to the end of the queue.
std::deque< demand_t > m_queue
Queue's storage.
void pop_front()
Remove the front item from queue.
std::size_t size() const noexcept
Size of the queue.
bool is_empty() const noexcept
Is queue empty?
bool is_full() const noexcept
Is queue full?
Template-based implementation of message chain.
void unsubscribe_event_handler(const std::type_index &, abstract_message_sink_t &) noexcept override
Remove all message handlers.
std::string query_name() const override
Get the mbox name.
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.
void set_delivery_filter(const std::type_index &, const delivery_filter_t &, abstract_message_sink_t &) override
const capacity_t m_capacity
Chain capacity.
std::size_t size() const override
Count of messages in the chain.
void notify_multi_chain_select_ops() noexcept
void try_to_store_message_to_queue_nonblocking_mode(const std::type_index &msg_type, const message_ref_t &message)
An implementation of storing another message to chain for the case of delated/periodic messages.
void try_to_store_message_to_queue_ordinary_mode(const std::type_index &msg_type, const message_ref_t &message)
Actual implementation of pushing message to the queue.
const not_empty_notification_func_t m_not_empty_notificator
Optional notificator for 'not_empty' condition.
void subscribe_event_handler(const std::type_index &, abstract_message_sink_t &) override
Add the message handler.
extraction_status_t extract_demand_from_not_empty_queue(demand_t &dest)
Implementation of extract operation for the case when message queue is not empty.
details::status m_status
Status of the chain.
select_case_t * m_select_tail
A queue of multi-chain selects in which this chain is used.
bool empty() const override
Is message chain empty?
std::condition_variable m_overflow_cond
Condition variable for waiting on full queue.
Queue m_queue
Chain's demands queue.
void do_deliver_message(message_delivery_mode_t delivery_mode, const std::type_index &msg_type, const message_ref_t &message, unsigned int) override
Deliver message for all subscribers with respect to message limits.
std::size_t m_threads_to_wakeup
Count of threads sleeping on empty mchain.
void remove_from_select(select_case_t &select_case) noexcept override
Removement of mchain from multi chain select.
mchain_props::push_status_t push(const std::type_index &msg_type, const message_ref_t &message, mchain_props::select_case_t &select_case) override
An attempt to push a new message into the mchain.
mbox_id_t id() const override
Unique ID of this mbox.
const mbox_id_t m_id
Mbox ID for chain.
std::mutex m_lock
Chain's lock.
environment_t & m_env
SObjectizer Environment for which message chain is created.
extraction_status_t extract(demand_t &dest, duration_t empty_queue_timeout) override
void actual_close(close_mode_t mode) override
Close the chain.
void complete_store_message_to_queue(typename Tracing_Base::deliver_op_tracer &tracer, const std::type_index &msg_type, const message_ref_t &message)
A reusable method with implementation of last part of storing a message into chain.
std::condition_variable m_underflow_cond
Condition variable for waiting on empty queue.
mchain_template(so_5::environment_t &env, mbox_id_t id, const mchain_params_t ¶ms, Tracing_Args &&... tracing_args)
Initializing constructor.
extraction_status_t extract(demand_t &dest, select_case_t &select_case) override
An extraction attempt as a part of multi chain select.
void drop_delivery_filter(const std::type_index &, abstract_message_sink_t &) noexcept override
Removes delivery filter for message type and subscriber.
Base class for representation of one case in multi chain select.
select_case_t * query_next() const noexcept
void set_next(select_case_t *next) noexcept
Set the next item in the current queue to which select_case belongs.
void notify() noexcept
Notification for all waiting select_cases.
A base class for agent messages.
friend message_mutability_t message_mutability(const intrusive_ptr_t< message_t > &what) noexcept
Helper method for safe get of message mutability flag.
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.
outliving_reference_t(outliving_reference_t const &o) noexcept
Scoped guard for shared locks.
read_lock_guard_t(Lock &l)
#define SO_5_LOG_ERROR(logger, var_name)
A special macro for helping error logging.
#define SO_5_THROW_EXCEPTION(error_code, desc)
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.
mchain_t make_mchain(outliving_reference_t< so_5::msg_tracing::holder_t > tracer, const mchain_params_t ¶ms, 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.
void ensure_queue_not_empty(Q &&queue)
Helper function which throws an exception if queue is empty.
status
Status of the message chain.
@ closed
Bag is closed. New messages cannot be sent to it.
@ open
Bag is open and can be used for message sending.
void ensure_queue_not_full(Q &&queue)
Helper function which throws an exception if queue is full.
Various properties and parameters of message chains.
close_mode_t
What to do with chain's content at close.
@ drop_content
All messages must be removed from chain.
overflow_reaction_t
What reaction must be performed on attempt to push new message to the full message chain.
@ remove_oldest
Oldest message in chain must be removed.
@ drop_newest
New message must be ignored and droped.
@ throw_exception
An exception must be thrown.
extraction_status_t
Result of extraction of message from a message chain.
@ msg_extracted
Message extracted successfully.
@ chain_closed
Message cannot be extracted because chain is closed.
@ no_messages
No available messages in the chain.
push_status_t
Result of attempt of pushing a message into a message chain.
@ stored
Message stored into a message chain.
@ chain_closed
Message wasn't stored because chain is closed.
memory_usage_t
Memory allocation for storage for size-limited chains.
@ dynamic
Storage can be allocated and deallocated dynamically.
Public part of message delivery tracing mechanism.
Private part of message limit implementation.
const int rc_nullptr_as_result_of_user_mbox_factory
nullptr returned by user-provided mbox factory.
message_delivery_mode_t
Possible modes of message/signal delivery.
mbox_type_t
Type of the message box.
@ multi_producer_single_consumer
@ multi_producer_multi_consumer
const int rc_msg_chain_overflow
const int rc_msg_chain_is_full
Attempt to push a message to full message queue.
message_mutability_t
A enum with variants of message mutability or immutability.
const int rc_msg_chain_doesnt_support_subscriptions
Attempt to make subscription for message chain.
delivery_possibility_t
Result of checking delivery posibility.
const int rc_illegal_subscriber_for_mpsc_mbox
An attempt to create illegal subscription to mpsc_mbox.
const int rc_msg_chain_is_empty
Attempt to get message from empty message queue.
const int rc_msg_chain_doesnt_support_delivery_filters
Attempt to set delivery_filter for message chain.
const int rc_mutable_msg_cannot_be_delivered_via_mpmc_mbox
An attempt to deliver mutable message via MPMC mbox.
outliving_reference_t< T > outliving_mutable(T &r)
Make outliving_reference wrapper for mutable reference.
Full name for a named mbox.
full_named_mbox_id_t(std::string mbox_namespace, std::string mbox_name)
Initializing constructor.
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.
static constexpr const std::size_t switch_to_vector
static constexpr const std::size_t switch_to_map
Predicate to be used for comparing keys in subscriber map.
bool operator()(abstract_message_sink_t *a, abstract_message_sink_t *b) const noexcept
Predicate to be used for searching information in the vector.
bool operator()(const subscribers_vector_item_t &a, const subscribers_vector_item_t &b) const noexcept
Information about one subscriber to be stored in a vector.
subscription_info_with_sink_t m_info
Information about the subscription.
subscribers_vector_item_t(abstract_message_sink_t &sink_as_key)
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.
named_mbox_info_t(mbox_t mbox)
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.
Description of one demand in message chain.
demand_t()
Default constructor.
demand_t(std::type_index msg_type, so_5::message_ref_t message_ref)
Initializing constructor.