SObjectizer  5.8
Loading...
Searching...
No Matches
make_mchain.hpp
Go to the documentation of this file.
1/*
2 * SObjectizer-5
3 */
4
5/*!
6 * \file
7 * \brief A helper function for the creation of a new mchain.
8 *
9 * \since
10 * v.5.7.0
11 */
12
13#pragma once
14
15#include <so_5/impl/mchain_details.hpp>
16#include <so_5/impl/msg_tracing_helpers.hpp>
17
18namespace so_5
19{
20
21namespace impl
22{
23
24/*!
25 * \brief Helper function for creation of a new mchain with respect
26 * to message tracing.
27 *
28 * This function was in mbox_core.cpp file until v.5.7.0 and is
29 * placed in a separate header file in v.5.7.0.
30 *
31 * \tparam Q type of demand queue to be used for new mchain.
32 * \tparam A type of arguments for mchain_template constructor.
33 */
34template< typename Q, typename... A >
35[[nodiscard]] mchain_t
38 const mchain_params_t & params,
39 A &&... args )
40 {
41 using namespace so_5::mchain_props;
42 using namespace so_5::impl::msg_tracing_helpers;
45
48 return mchain_t{
49 new mchain_template< Q, E >{
50 std::forward<A>(args)...,
51 params,
52 tracer } };
53 else
54 return mchain_t{
55 new mchain_template< Q, D >{
56 std::forward<A>(args)..., params } };
57 }
58
59} /* namespace impl */
60
61} /* namespace so_5 */
An interface of message chain.
Definition mchain.hpp:459
Interface for message sink.
static bool special_sink_ptr_compare(const abstract_message_sink_t *a, const abstract_message_sink_t *b) noexcept
A base class for agents.
Definition agent.hpp:673
Interface for creator of new mbox in OOP style.
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.
abstract_message_sink_t & sink_reference() const noexcept
Get a reference to the subscribed 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.
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.
mbox_core_t(outliving_reference_t< so_5::msg_tracing::holder_t > msg_tracing_stuff)
Definition mbox_core.cpp:27
mbox_t create_custom_mbox(environment_t &env, ::so_5::custom_mbox_details::creator_iface_t &creator)
Create a custom mbox.
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.
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.
A class for the name of mbox_namespace.
Parameters for message chain.
Definition mchain.hpp:741
Parameters for defining chain size.
Definition mchain.hpp:229
Implementation of demands queue for size-limited message chain with dynamically allocated storage.
limited_dynamic_demand_queue(const capacity_t &capacity)
Initializing constructor.
std::size_t size() const noexcept
Size of the queue.
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 size() const noexcept
Size of the 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.
limited_preallocated_demand_queue(const capacity_t &capacity)
Initializing constructor.
demand_t & front()
Access to front item from queue.
Implementation of demands queue for size-unlimited message chain.
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.
const empty_notification_func_t m_empty_notificator
Optional notificator for 'empty' condition.
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 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.
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 &params, 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.
Interface of holder of message tracer and message trace filter objects.
A class for the name which cannot be empty.
Helper class for indication of long-lived reference via its type.
Definition outliving.hpp:98
#define SO_5_LOG_ERROR(logger, var_name)
A special macro for helping error logging.
#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.
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:905
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.
Implementation details.
Definition mchain.hpp:37
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.
Definition mchain.hpp:28
close_mode_t
What to do with chain's content at close.
Definition mchain.hpp:410
extraction_status_t
Result of extraction of message from a message chain.
Definition mchain.hpp:371
push_status_t
Result of attempt of pushing a message into a message chain.
Definition mchain.hpp:389
Public part of message delivery tracing mechanism.
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
Full name for a named mbox.
Definition mbox_core.hpp:69
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
Base class for a mbox for the case when message delivery tracing is disabled.
Description of one demand in message chain.
Definition mchain.hpp:144