2
3
6
7
8
9
13#include <so_5/impl/message_sink_for_agent.hpp>
25
26
27
28
34 message_sink_without_message_limit_t(
40 message_sink_without_message_limit_t(
49 const std::type_index & msg_type,
50 const message_ref_t & message,
virtual void unsubscribe_event_handler(const std::type_index &type_index, abstract_message_sink_t &subscriber) noexcept=0
Remove all message handlers.
virtual void subscribe_event_handler(const std::type_index &type_index, abstract_message_sink_t &subscriber)=0
Add the message handler.
virtual so_5::environment_t & environment() const noexcept=0
SObjectizer Environment for which the mbox is created.
abstract_message_box_t()=default
abstract_message_box_t(const abstract_message_box_t &)=delete
virtual void drop_delivery_filter(const std::type_index &msg_type, abstract_message_sink_t &subscriber) noexcept=0
Removes delivery filter for message type and subscriber.
virtual void set_delivery_filter(const std::type_index &msg_type, const delivery_filter_t &filter, abstract_message_sink_t &subscriber)=0
Set a delivery filter for message type and subscriber.
virtual ~abstract_message_box_t() noexcept=default
virtual mbox_id_t id() const =0
Unique ID of this mbox.
virtual std::string query_name() const =0
Get the mbox name.
abstract_message_box_t & operator=(abstract_message_box_t &&)=delete
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.
abstract_message_box_t & operator=(const abstract_message_box_t &)=delete
virtual mbox_type_t type() const =0
Get the type of message box.
abstract_message_box_t(abstract_message_box_t &&)=delete
An interace of message chain.
~abstract_message_chain_t() noexcept override=default
virtual void actual_close(mchain_props::close_mode_t mode)=0
Close the chain.
virtual mchain_props::push_status_t push(const std::type_index &msg_type, const message_ref_t &message, mchain_props::select_case_t &select_case)=0
An attempt to push a new message into the mchain.
virtual std::size_t size() const =0
Count of messages in the chain.
void close(Exceptions_Control, mchain_props::close_mode_t mode) noexcept(noexcept(details::should_terminate_if_throws_t< Exceptions_Control >::value))
Close the chain.
virtual void remove_from_select(mchain_props::select_case_t &select_case) noexcept=0
Removement of mchain from multi chain select.
abstract_message_chain_t(const abstract_message_chain_t &)=delete
so_5::mbox_t as_mbox()
Cast message chain to message box.
virtual mchain_props::extraction_status_t extract(mchain_props::demand_t &dest, mchain_props::select_case_t &select_case)=0
An extraction attempt as a part of multi chain select.
virtual bool empty() const =0
Is message chain empty?
abstract_message_chain_t & operator=(const abstract_message_chain_t &)=delete
abstract_message_chain_t()=default
virtual mchain_props::extraction_status_t extract(mchain_props::demand_t &dest, mchain_props::duration_t empty_queue_timeout)=0
Interface for message sink.
abstract_message_sink_t & operator=(const abstract_message_sink_t &)=default
abstract_message_sink_t(const abstract_message_sink_t &)=default
abstract_message_sink_t()=default
abstract_message_sink_t(abstract_message_sink_t &&) noexcept=default
abstract_message_sink_t & operator=(abstract_message_sink_t &&) noexcept=default
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.
virtual priority_t sink_priority() const noexcept=0
Get the priority for the message sink.
virtual environment_t & environment() const noexcept=0
virtual ~abstract_message_sink_t() noexcept=default
Interface for holders of message_sink instances.
abstract_sink_owner_t()=default
virtual const abstract_message_sink_t & sink() const noexcept=0
Get a const reference to the underlying message sink.
virtual abstract_message_sink_t & sink() noexcept=0
Get a reference to the underlying message sink.
virtual ~abstract_sink_owner_t() noexcept=default
A context for agent construction and tuning.
environment_t * m_env
SObjectizer Environment to work in.
agent_context_t(environment_t &env, agent_tuning_options_t options)
const agent_tuning_options_t & options() const
Read-only access to agent options.
agent_context_t(environment_t &env)
Constructor for the case when only environment available.
environment_t & environment() const
Access to SObjectizer Environment.
agent_tuning_options_t & options()
Read-Write access to agent options.
friend void swap(so_5::agent_context_t &a, so_5::agent_context_t &b) noexcept
Swap operation.
agent_tuning_options_t m_options
Options for agent tuning.
environment_t & env() const
Access to SObjectizer Environment.
Helper class for holding agent's identity (name or pointer).
std::string_view actual_name() const noexcept
Attempt to get an agent name.
std::string to_string() const
Transform identity into a string.
agent_identity_t(std::string_view name) noexcept
Initializing constructor for case when agent has a user specified name.
bool has_actual_name() const noexcept
Does agent have an actual name?
value_t m_value
Agent's identity.
agent_identity_t(const agent_t *pointer) noexcept
Initializing constructor for case when agent has no user specified name.
Interface of the agent state listener.
virtual ~agent_state_listener_t() noexcept=default
agent_state_listener_t(const agent_state_listener_t &)=delete
agent_state_listener_t & operator=(const agent_state_listener_t &)=delete
virtual void changed(agent_t &agent, const state_t &state) noexcept=0
Hook method for state changes.
agent_state_listener_t()=default
void so_subscribe_deadletter_handler(const so_5::mbox_t &mbox, Event_Handler &&handler, thread_safety_t thread_safety=thread_safety_t::unsafe)
Create a subscription for deadletter handler for a specific message from a specific mbox.
static demand_handler_pfn_t get_demand_handler_on_start_ptr() noexcept
impl::state_listener_controller_t m_state_listener_controller
State listeners controller.
decltype(auto) so_low_level_exec_as_event_handler(Lambda &&lambda) noexcept(noexcept(lambda()))
Helper method that allows to run a block of code as non-thread-safe event handler.
static void process_enveloped_msg(current_thread_id_t working_thread_id, execution_demand_t &d, const impl::event_handler_data_t *handler_data)
Actual implementation of enveloped message handling.
std::unique_ptr< impl::sinks_storage_t > m_message_sinks
Holder of message sinks for that agent.
bool so_has_subscription(const mbox_t &mbox) const noexcept
Check the presence of a subscription in the default_state.
void do_change_agent_state(const state_t &state_to_be_set)
Perform actual operations related to state switch.
void so_drop_delivery_filter(const mbox_t &mbox) noexcept
Drop a delivery filter.
void so_initiate_agent_definition()
A correct initiation of so_define_agent method call.
const agent_t * self_ptr() const
Get the raw pointer of itself.
so_5::current_thread_id_t m_working_thread_id
Working thread id.
default_rw_spinlock_t m_event_queue_lock
Event queue operation protector.
bool so_has_subscription(const mbox_t &mbox, const state_t &target_state) const noexcept
Check the presence of a subscription.
std::enable_if< details::is_agent_method_pointer< details::method_arity::unary, Method_Pointer >::value, bool >::type so_has_subscription(const mbox_t &mbox, Method_Pointer) const noexcept
Check the presence of a subscription.
const name_for_agent_t m_name
Optional name for the agent.
static const impl::event_handler_data_t * find_deadletter_handler(execution_demand_t &demand)
Search for event handler between deadletter handlers.
static demand_handler_pfn_t get_demand_handler_on_message_ptr() noexcept
bool is_agent_deactivated() const noexcept
Is agent already deactivated.
void so_switch_to_awaiting_deregistration_state()
Switching agent to special state in case of unhandled exception.
const state_t & so_current_state() const
Access to the current agent state.
static void process_message(current_thread_id_t working_thread_id, execution_demand_t &d, thread_safety_t thread_safety, event_handler_method_t method)
Actual implementation of message handling.
agent_ref_t create_ref()
Make an agent reference.
void so_drop_deadletter_handler(const so_5::mbox_t &mbox)
Drops the subscription for deadletter handler.
bool so_is_active_state(const state_t &state_to_check) const noexcept
Is a state activated?
void ensure_operation_is_on_working_thread(const char *operation_name) const
Enables operation only if it is performed on agent's working thread.
static constexpr const state_t::history_t deep_history
Short alias for so_5::state_t::history_t::deep.
bool so_was_defined() const
Is method define_agent already called?
agent_status_t
Enumeration of possible agent statuses.
@ defined
Agent is defined.
@ state_switch_in_progress
State switch operation is in progress.
void destroy_all_subscriptions_and_filters() noexcept
Destroy all agent's subscriptions.
void so_create_deadletter_subscription(const mbox_t &mbox, const std::type_index &msg_type, const event_handler_method_t &method, thread_safety_t thread_safety)
Create a subscription for a deadletter handler.
void shutdown_agent() noexcept
Agent shutdown deriver.
void ensure_binding_finished()
Ensures that all agents from cooperation are bound to dispatchers.
coop_t * m_agent_coop
Agent is belong to this cooperation.
disp_binder_shptr_t so_this_agent_disp_binder() const
Returns the dispatcher binder that is used for binding this agent.
void so_drop_subscription(const mbox_t &mbox, const state_t &target_state)
Drop subscription for the state specified.
agent_status_t m_current_status
Current agent status.
event_queue_t * m_event_queue
A pointer to event_queue.
void so_set_delivery_filter(const mbox_t &mbox, Lambda &&lambda)
Set a delivery filter.
std::enable_if< details::is_agent_method_pointer< details::method_arity::unary, Method_Pointer >::value, void >::type so_drop_subscription_for_all_states(const mbox_t &mbox, Method_Pointer)
Drop subscription for all states.
virtual void so_define_agent()
Hook on define agent for SObjectizer.
void drop_all_delivery_filters() noexcept
Drops all delivery filters.
disp_binder_shptr_t m_disp_binder
Binder for this agent.
bool do_check_subscription_presence(const mbox_t &mbox, const std::type_index &msg_type, const state_t &target_state) const noexcept
Check the presence of a subscription.
void do_state_switch(const state_t &state_to_be_set) noexcept
Actual action for switching agent state.
std::enable_if< details::is_agent_method_pointer< details::method_arity::unary, Method_Pointer >::value, bool >::type so_has_subscription(const mbox_t &mbox, const state_t &target_state, Method_Pointer) const noexcept
Check the presence of a subscription.
std::unique_ptr< impl::delivery_filter_storage_t > m_delivery_filters
Delivery filters for that agents.
void so_drop_subscription_for_all_states(const mbox_t &mbox)
Drop subscription for all states.
void return_to_default_state_if_possible() noexcept
Return agent to the default state.
subscription_bind_t so_subscribe_self()
Initiate subscription to agent's direct mbox.
agent_t(environment_t &env)
Constructor.
void do_set_delivery_filter(const mbox_t &mbox, const std::type_index &msg_type, delivery_filter_unique_ptr_t filter)
Set a delivery filter.
static void call_push_event(agent_t &agent, const message_limit::control_block_t *limit, mbox_id_t mbox_id, const std::type_index &msg_type, const message_ref_t &message)
Push an event to the agent's event queue.
mbox_t so_make_new_direct_mbox()
Create a new direct mbox for that agent.
static execution_hint_t so_create_execution_hint(execution_demand_t &demand)
Create execution hint for the specified demand.
std::enable_if< details::is_agent_method_pointer< details::method_arity::unary, Method_Pointer >::value, void >::type so_drop_subscription(const mbox_t &mbox, Method_Pointer)
Drop subscription for the default agent state.
void so_change_state(const state_t &new_state)
Change the current state of the agent.
void push_event(const message_limit::control_block_t *limit, mbox_id_t mbox_id, const std::type_index &msg_type, const message_ref_t &message)
Push event into the event queue.
static custom_direct_mbox_factory_t custom_direct_mbox_factory(Lambda &&lambda)
Helper for creation a custom direct mbox factory.
coop_handle_t so_coop() const
Get a handle of agent's coop.
void so_deregister_agent_coop_normally()
A helper method for deregistering agent's coop in case of normal deregistration.
void do_drop_delivery_filter(const mbox_t &mbox, const std::type_index &msg_type) noexcept
Drop a delivery filter.
virtual exception_reaction_t so_exception_reaction() const noexcept
A reaction from SObjectizer to an exception from agent's event.
void so_deactivate_agent()
Deactivate the agent.
disp_binder_shptr_t so_this_coop_disp_binder() const
Returns the dispatcher binder that is used as the default binder for the agent's coop.
abstract_message_sink_t & detect_sink_for_message_type(const std::type_index &msg_type)
Helper function that returns a message sink to be used for subscriptions for specified message type.
static void demand_handler_on_message(current_thread_id_t working_thread_id, execution_demand_t &d)
Calls event handler for message.
static constexpr const state_t::history_t shallow_history
Short alias for so_5::state_t::history_t::shallow.
virtual void so_evt_finish()
Hook of agent finish in SObjectizer.
static demand_handler_pfn_t get_demand_handler_on_finish_ptr() noexcept
void so_add_nondestroyable_listener(agent_state_listener_t &state_listener)
Add a state listener to the agent.
static const impl::event_handler_data_t * handler_finder_msg_tracing_disabled(execution_demand_t &demand, const char *context_marker)
Handler finder for the case when message delivery tracing is disabled.
const state_t * m_current_state_ptr
Current agent state.
const mbox_t m_direct_mbox
A direct mbox for the agent.
bool so_has_deadletter_handler(const so_5::mbox_t &mbox) const noexcept
Checks the presence of deadletter handler for a message of a specific type from a specific mbox.
const priority_t m_priority
Priority of the agent.
agent_identity_t so_agent_name() const noexcept
Get an optional name of the agent.
static const impl::event_handler_data_t * handler_finder_msg_tracing_enabled(execution_demand_t &demand, const char *context_marker)
Handler finder for the case when message delivery tracing is enabled.
void bind_to_coop(coop_t &coop)
Bind agent to the cooperation.
static const impl::event_handler_data_t * find_event_handler_for_current_state(execution_demand_t &demand)
Actual search for event handler with respect to parent-child relationship between agent states.
static void demand_handler_on_start(current_thread_id_t working_thread_id, execution_demand_t &d)
Calls so_evt_start method for agent.
const mbox_t & so_direct_mbox() const
Get the agent's direct mbox.
impl::subscription_storage_unique_ptr_t m_subscriptions
All agent's subscriptions.
void so_destroy_deadletter_subscription(const mbox_t &mbox, const std::type_index &msg_type)
Destroy a subscription for a deadletter handler.
static void demand_handler_on_finish(current_thread_id_t working_thread_id, execution_demand_t &d)
Calls so_evt_finish method for agent.
bool do_check_deadletter_presence(const mbox_t &mbox, const std::type_index &msg_type) const noexcept
Check the presence of a deadletter handler.
void do_drop_subscription_for_all_states(const mbox_t &mbox, const std::type_index &msg_type)
Remove subscription for all states.
agent_t(context_t ctx)
Constructor which simplifies agent construction with or without agent's tuning options.
static agent_tuning_options_t tuning_options()
Create tuning options object with default values.
void so_add_destroyable_listener(agent_state_listener_unique_ptr_t state_listener)
Add a state listener to the agent.
environment_t & so_environment() const noexcept
Access to the SObjectizer Environment which this agent is belong.
std::enable_if< details::is_agent_method_pointer< details::method_arity::unary, Method_Pointer >::value, void >::type so_drop_subscription(const mbox_t &mbox, const state_t &target_state, Method_Pointer)
Drop subscription for the state specified.
priority_t so_priority() const noexcept
Get the priority of the agent.
const state_t & so_default_state() const
Access to the agent's default state.
subscription_bind_t so_subscribe(const mbox_t &mbox_ref)
Initiate subscription.
void so_bind_to_dispatcher(event_queue_t &queue) noexcept
Binding agent to the dispatcher.
void so_destroy_event_subscription(const mbox_t &mbox, const std::type_index &subscription_type, const state_t &target_state)
Destroy event subscription.
void so_set_delivery_filter_for_mutable_msg(const mbox_t &mbox, Lambda &&lambda)
Set a delivery filter for a mutable message.
environment_t & m_env
SObjectizer Environment for which the agent is belong.
void so_drop_subscription(const mbox_t &mbox)
Drop subscription for the default agent state.
void so_deregister_agent_coop(int dereg_reason)
A helper method for deregistering agent's coop.
void do_drop_subscription(const mbox_t &mbox, const std::type_index &msg_type, const state_t &target_state)
Remove subscription for the state specified.
agent_t(environment_t &env, agent_tuning_options_t tuning_options)
Constructor which allows specification of agent's tuning options.
handler_finder_t m_handler_finder
Function for searching event handler.
virtual void so_evt_start()
Hook on agent start inside SObjectizer.
static demand_handler_pfn_t get_demand_handler_on_enveloped_msg_ptr() noexcept
void so_create_event_subscription(const mbox_t &mbox_ref, std::type_index type_index, const state_t &target_state, const event_handler_method_t &method, thread_safety_t thread_safety, event_handler_kind_t handler_kind)
Create a subscription for an event.
void so_set_delivery_filter(const mbox_t &mbox, delivery_filter_unique_ptr_t filter)
Set a delivery filter.
static void demand_handler_on_enveloped_msg(current_thread_id_t working_thread_id, execution_demand_t &d)
Handles the enveloped message.
A collector for agent tuning options.
name_for_agent_t m_agent_name
Optional name for an agent.
so_5::priority_t query_priority() const noexcept
Get priority value.
bool m_is_user_provided_subscription_storage_factory
Does a user provide a specific subscription_storage_factory?
agent_tuning_options_t & agent_name(name_for_agent_t name)
Set a name for agent.
subscription_storage_factory_t m_subscription_storage_factory
name_for_agent_t giveout_agent_name() noexcept
Gives away the name for an agent.
friend void swap(so_5::agent_tuning_options_t &a, so_5::agent_tuning_options_t &b) noexcept
message_limit::description_container_t m_message_limits
bool has_agent_name() const noexcept
Does a name specified for an agent?
agent_tuning_options_t()=default
agent_tuning_options_t & custom_direct_mbox_factory(custom_direct_mbox_factory_t factory)
Set custom direct mbox factory.
const custom_direct_mbox_factory_t & query_custom_direct_mbox_factory() const noexcept
Get a reference to custom direct mbox factory.
so_5::priority_t m_priority
Priority for agent.
bool is_user_provided_subscription_storage_factory() const noexcept
Does a user provide a specific subscription_storage_factory?
static subscription_storage_factory_t default_subscription_storage_factory()
Default subscription storage factory.
const subscription_storage_factory_t & query_subscription_storage_factory() const noexcept
agent_tuning_options_t & message_limits(Args &&... args)
agent_tuning_options_t & subscription_storage_factory(subscription_storage_factory_t factory) noexcept(noexcept(std::declval< subscription_storage_factory_t & >()=std::move(factory)))
Set factory for subscription storage creation.
message_limit::description_container_t giveout_message_limits()
agent_tuning_options_t & priority(so_5::priority_t v)
Set priority for agent.
custom_direct_mbox_factory_t m_custom_direct_mbox_factory
Optional factory for custom direct mboxes.
The base class for the object with a reference counting.
atomic_refcounted_t(const atomic_refcounted_t &)=delete
unsigned long dec_ref_count() noexcept
Decrement reference count.
atomic_refcounted_t() noexcept
Default constructor.
atomic_counter_t m_ref_counter
Object reference count.
void inc_ref_count() noexcept
Increments reference count.
~atomic_refcounted_t() noexcept=default
Destructor.
atomic_refcounted_t & operator=(const atomic_refcounted_t &)=delete
Container for cooperation deregistration notificators.
std::vector< coop_dereg_notificator_t > m_notificators
void call_all(environment_t &env, const coop_handle_t &coop, const coop_dereg_reason_t &reason) const noexcept
Call all notificators.
void add(coop_dereg_notificator_t notificator)
Add a notificator.
It's a kind of strong typedef for coop's deregistration reason.
coop_dereg_reason_t(int reason) noexcept
int reason() const noexcept
coop_dereg_reason_t() noexcept
Type of smart handle for a cooperation.
friend bool operator>=(const coop_handle_t &a, const coop_handle_t &b) noexcept
static constexpr const coop_id_t invalid_coop_id
friend bool operator<(const coop_handle_t &a, const coop_handle_t &b) noexcept
bool operator!() const noexcept
Is this non-empty handle?
friend bool operator==(const coop_handle_t &a, const coop_handle_t &b) noexcept
friend bool operator!=(const coop_handle_t &a, const coop_handle_t &b) noexcept
operator bool() const noexcept
Is this handle empty?
coop_handle_t(coop_id_t id, std::shared_ptr< coop_t > coop)
Initializing constructor.
friend bool operator<=(const coop_handle_t &a, const coop_handle_t &b) noexcept
coop_id_t m_id
ID of cooperation.
auto id() const noexcept
Get the ID of the coop.
std::weak_ptr< coop_t > m_coop
Pointer for cooperation.
friend bool operator>(const coop_handle_t &a, const coop_handle_t &b) noexcept
Interface for the cooperation listener.
virtual ~coop_listener_t() noexcept=default
virtual void on_registered(environment_t &so_env, const coop_handle_t &coop) noexcept=0
Hook for the cooperation registration event.
coop_listener_t()=default
coop_listener_t & operator=(const coop_listener_t &)=delete
coop_listener_t(coop_listener_t &&)=delete
coop_listener_t & operator=(coop_listener_t &&)=delete
coop_listener_t(const coop_listener_t &)=delete
virtual void on_deregistered(environment_t &so_env, const coop_handle_t &coop, const coop_dereg_reason_t &reason) noexcept=0
Hook for the cooperation deregistration event.
Container for cooperation registration notificators.
void call_all(environment_t &env, const coop_handle_t &coop) const noexcept
Call all notificators.
void add(coop_reg_notificator_t notificator)
Add a notificator.
std::vector< coop_reg_notificator_t > m_notificators
coop_shptr_t m_first_child
The head of list of children coops.
std::size_t capacity() const noexcept
Get the capacity of vector for holding agents list.
std::size_t query_agent_count() const noexcept
Get agent count in the cooperation.
environment_t & environment() const noexcept
Access to SO Environment for which cooperation is bound.
registration_status_t m_registration_status
The registration status of cooperation.
void decrement_usage_count() noexcept
Decrement usage count for the coop.
exception_reaction_t exception_reaction() const noexcept
Get the current exception rection flag for that cooperation.
resource_deleter_vector_t m_resource_deleters
Container of user resource deleters.
disp_binder_shptr_t m_coop_disp_binder
Default agent to the dispatcher binder.
void add_dereg_notificator(Lambda &¬ificator)
Add notificator about cooperation deregistration event.
void deregister(int reason) noexcept
Deregister the cooperation with the specified reason.
void for_each_child(Lambda &&lambda) const
A helper method for doing some actions with children coops.
Agent * make_agent_with_binder(so_5::disp_binder_shptr_t binder, Args &&... args)
Helper method for simplification of agents creation and binding to the specified dispatcher.
exception_reaction_t m_exception_reaction
A reaction to non-handled exception.
coop_t(const coop_t &)=delete
coop_id_t id() const noexcept
Get the ID of coop.
std::mutex m_lock
A lock for synchonization of some operations on coop.
coop_handle_t m_parent
Parent coop.
registration_status_t
Registration status.
@ deregistration_in_final_stage
Deregistration of the coop is in the final stage.
@ coop_registered
Cooperation is registered.
@ coop_deregistering
Cooperation is in deregistration process.
@ coop_not_registered
Cooperation is not registered yet.
std::size_t size() const noexcept
Get agent count in the cooperation.
coop_t & operator=(const coop_t &)=delete
disp_binder_shptr_t coop_disp_binder() const noexcept(noexcept(disp_binder_shptr_t{ this->m_coop_disp_binder }))
Return the default dispatcher binder for the coop.
atomic_counter_t m_reference_count
Count for entities.
coop_handle_t handle() noexcept
Get handle for this coop.
void set_exception_reaction(exception_reaction_t value) noexcept
Set exception reaction for that cooperation.
const coop_id_t m_id
Cooperation ID.
void remove_child(coop_t &child) noexcept
Remove a child from the parent coop.
Agent * add_agent(std::unique_ptr< Agent > agent, disp_binder_shptr_t disp_binder)
Add agent to the cooperation with the dispatcher binding.
void deregister_normally() noexcept
Deregistr the cooperation normally.
coop_t(coop_id_t id, coop_handle_t parent, disp_binder_shptr_t coop_disp_binder, outliving_reference_t< environment_t > env)
Constructor.
void reserve(std::size_t v)
Reserve a space for vector for holding agents list.
coop_dereg_reason_t m_dereg_reason
Deregistration reason.
void increment_usage_count() noexcept
Increment usage count for the coop.
coop_shptr_t m_next_in_final_dereg_chain
The next coop in the chain for final deregistration actions.
Agent * make_agent(Args &&... args)
Helper method for simplification of agents creation.
coop_reg_notificators_container_ref_t m_reg_notificators
Notificators for registration event.
void add_reg_notificator(Lambda &¬ificator)
Add notificator about cooperation registration event.
coop_shptr_t m_prev_sibling
The previous coop in sibling's chain.
void add_child(coop_shptr_t child)
Add a new child to the parent coop.
agent_array_t m_agent_array
Cooperation agents.
Agent * add_agent(std::unique_ptr< Agent > agent)
Add agent to cooperation.
outliving_reference_t< environment_t > m_env
SObjectizer Environment for which cooperation is created.
T * take_under_control(std::unique_ptr< T > resource)
Take a user resouce under cooperation control.
coop_dereg_notificators_container_ref_t m_dereg_notificators
Notificators for deregistration event.
coop_t & operator=(coop_t &&)=delete
coop_shptr_t m_next_sibling
The next coop in sibling's chain.
A special type that plays role of unique_ptr for coop.
coop_unique_holder_t(coop_unique_holder_t &&)=default
coop_unique_holder_t & operator=(const coop_unique_holder_t &)=delete
coop_shptr_t m_coop
A pointer to coop object.
bool operator!() const noexcept
operator bool() const noexcept
coop_unique_holder_t & operator=(coop_unique_holder_t &&) noexcept=default
friend void swap(coop_unique_holder_t &a, coop_unique_holder_t &b) noexcept
coop_unique_holder_t(coop_shptr_t coop)
coop_t & operator*() const noexcept
coop_shptr_t release() noexcept
coop_t * get() const noexcept
coop_unique_holder_t()=default
coop_t * operator->() const noexcept
coop_unique_holder_t(const coop_unique_holder_t &)=delete
Interface for creator of new mbox in OOP style.
virtual mbox_t create(const mbox_creation_data_t &data)=0
Creation of custom mbox.
~creator_iface_t()=default
Template-based implementation of creator interface.
creator_template_t(Lambda &&lambda)
virtual mbox_t create(const mbox_creation_data_t &data) override
Creation of custom mbox.
Lambda m_lambda
Lambda or functional object to be used for custom mbox creation.
~creator_template_t()=default
An interface of delivery filter object.
delivery_filter_t(delivery_filter_t &&)=delete
virtual bool check(const abstract_message_sink_t &receiver, message_t &msg) const noexcept=0
Checker for a message instance.
delivery_filter_t & operator=(delivery_filter_t &&)=delete
delivery_filter_t(const delivery_filter_t &)=delete
virtual ~delivery_filter_t() noexcept=default
delivery_filter_t()=default
delivery_filter_t & operator=(const delivery_filter_t &)=delete
bool handle(const std::type_index &, message_ref_t &) const
Template class for storing bunch of message handlers.
bool handle(const std::type_index &msg_type, message_ref_t &message) const
Find handler for a message and execute it.
msg_type_and_handler_pair_t m_handlers[N]
Vector of message handlers.
void prepare()
Prepare bunch to use with actual messages.
void add_handler(std::size_t index, msg_type_and_handler_pair_t &&handler)
Add another handler to the specified index.
Helper class for building and registering new cooperation.
decltype(auto) build_and_register_coop(disp_binder_shptr_t binder, Lambda &&lambda)
introduce_coop_helper_t(environment_t &env)
Constructor for the case of creation a cooperation without parent.
coop_handle_t m_parent
Optional parent coop.
introduce_coop_helper_t(environment_t &env, coop_handle_t parent)
Constructor for the case of creation a cooperation with parent.
decltype(auto) introduce(disp_binder_shptr_t binder, L &&lambda)
environment_t & m_env
Environment for creation of cooperation.
decltype(auto) introduce(L &&lambda)
Basic part of message_holder implementations.
basic_message_holder_impl_t(intrusive_ptr_t< Envelope > msg) noexcept
basic_message_holder_impl_t() noexcept=default
operator bool() const noexcept
Check for the non-emptiness of message_holder.
intrusive_ptr_t< Envelope > m_msg
Message instance.
bool operator!() const noexcept
Check for the emptiness of message_holder.
bool empty() const noexcept
Check for the emptiness of message_holder.
void reset() noexcept
Drops to pointer to the message instance.
An of mixin with getters for message_holder.
Return_Type & operator*() const noexcept
Get a reference to the message inside message_holder.
Return_Type * get() const noexcept
Get a pointer to the message inside message_holder.
Return_Type * operator->() const noexcept
Get a pointer to the message inside message_holder.
A part of implementation of message_holder to be used for shared ownership of message instances.
intrusive_ptr_t< Envelope > make_reference() const noexcept
Make an another reference to the message.
A part of implementation of message_holder to be used for unique ownership of message instances.
unique_message_holder_impl_t(const unique_message_holder_impl_t &)=delete
unique_message_holder_impl_t & operator=(const unique_message_holder_impl_t &)=delete
intrusive_ptr_t< Envelope > make_reference() noexcept
Extracts the smart pointer to the message.
unique_message_holder_impl_t & operator=(unique_message_holder_impl_t &&) noexcept=default
unique_message_holder_impl_t(unique_message_holder_impl_t &&)=default
mhood_base_t(const mhood_base_t &)=delete
payload_type * get() const noexcept
Access to the message.
message_holder_t< M, Ownership > make_holder() noexcept
Create a holder for this message.
mhood_base_t & operator=(const mhood_base_t &)=delete
payload_type & operator*() noexcept
Access to the message.
mhood_base_t(mhood_base_t &&other) noexcept
intrusive_ptr_t< envelope_type > make_reference() noexcept
Create a smart pointer for the message envelope.
mhood_base_t & operator=(mhood_base_t &&other) noexcept
mhood_base_t(message_ref_t &mf) noexcept
payload_type * operator->() noexcept
Access to the message via pointer.
friend void swap(mhood_base_t &a, mhood_base_t &b) noexcept
message_holder_t< M, Ownership > make_holder() const noexcept
Create a holder for this message.
const payload_type & operator*() const noexcept
Access to the message.
mhood_base_t(message_ref_t &mf) noexcept
intrusive_ptr_t< envelope_type > make_reference() const noexcept
Create a smart pointer for the message envelope.
const payload_type * get() const noexcept
Access to the message.
const payload_type * operator->() const noexcept
Access to the message via pointer.
mhood_base_t(message_ref_t &)
mhood_base_t(message_ref_t &)
mhood_base_t(mhood_base_t &&other) noexcept
payload_type & operator*() noexcept
Access to the message.
mhood_base_t & operator=(const mhood_base_t &)=delete
intrusive_ptr_t< envelope_type > make_reference() noexcept
Create a smart pointer for the message envelope.
envelope_type * m_envelope
mhood_base_t(const mhood_base_t &)=delete
mhood_base_t(message_ref_t &mf) noexcept
payload_type * operator->() noexcept
Access to the message via pointer.
message_holder_t< M, Ownership > make_holder() noexcept
Create a holder for this message.
mhood_base_t & operator=(mhood_base_t &&other) noexcept
payload_type * get() noexcept
Access to the message.
friend void swap(mhood_base_t &a, mhood_base_t &b) noexcept
mhood_base_t(message_ref_t &mf) noexcept
const payload_type * m_payload
const payload_type * get() const noexcept
Access to the message.
const payload_type & operator*() const noexcept
Access to the message.
envelope_type * m_envelope
message_holder_t< M, Ownership > make_holder() const noexcept
Create a holder for this message.
const payload_type * operator->() const noexcept
Access to the message via pointer.
intrusive_ptr_t< envelope_type > make_reference() const noexcept
Create a smart pointer for the message envelope.
A type to be used as a base for mhood_t implementation.
Helper class for calculating remaining time.
duration remaining() const
remaining_time_counter_t(duration remaining)
Helper template class for do rollback actions automatically in the destructor.
Helper class for scope exit implementation.
An interface of factory for management of worker threads.
abstract_work_thread_factory_t & operator=(const abstract_work_thread_factory_t &)=delete
virtual abstract_work_thread_t & acquire(so_5::environment_t &env)=0
Get a new worker thread from factory.
virtual ~abstract_work_thread_factory_t()
abstract_work_thread_factory_t & operator=(abstract_work_thread_factory_t &&)=delete
abstract_work_thread_factory_t(const abstract_work_thread_factory_t &)=delete
abstract_work_thread_factory_t(abstract_work_thread_factory_t &&)=delete
virtual void release(abstract_work_thread_t &thread) noexcept=0
Return a worker thread back to the factory.
abstract_work_thread_factory_t()
An interface for one worker thread.
abstract_work_thread_t(abstract_work_thread_t &&)=delete
abstract_work_thread_t(const abstract_work_thread_t &)=delete
virtual void join()=0
Stops the current thread until worker thread completes execution of thread_body passed to previous ca...
abstract_work_thread_t & operator=(const abstract_work_thread_t &)=delete
abstract_work_thread_t & operator=(abstract_work_thread_t &&)=delete
virtual void start(body_func_t thread_body)=0
Start a new thread and execute specified functor on it.
virtual ~abstract_work_thread_t()
An interface for somethine like condition variable for waiting on MPMC queue lock.
condition_t(condition_t &&)=delete
virtual void notify() noexcept=0
Notification for waiting customer.
condition_t(const condition_t &)=delete
virtual ~condition_t() noexcept=default
condition_t & operator=(const condition_t &)=delete
virtual void wait() noexcept=0
Waiting on condition.
condition_t & operator=(condition_t &&)=delete
An interface for lock for MPMC queue.
lock_t & operator=(const lock_t &)=delete
virtual void unlock() noexcept=0
Unlock object locked in exclusive mode.
virtual void lock() noexcept=0
Lock object in exclusive mode.
virtual condition_unique_ptr_t allocate_condition()=0
Create condition object for another MPMC queue's customer.
lock_t(const lock_t &)=delete
lock_t & operator=(lock_t &&)=delete
virtual ~lock_t() noexcept=default
Container for storing parameters for MPMC queue.
queue_params_t & operator=(queue_params_t &&o) noexcept
Move operator.
queue_params_t & lock_factory(lock_factory_t factory)
Setter for lock factory.
queue_params_t()
Default constructor.
queue_params_t(const queue_params_t &o)
Copy constructor.
lock_factory_t m_lock_factory
Lock factory to be used during queue creation.
queue_params_t & operator=(const queue_params_t &o)
Copy operator.
friend void swap(queue_params_t &a, queue_params_t &b) noexcept
std::size_t m_next_thread_wakeup_threshold
Threshold for wake up next working thread if there are non-empty queues.
queue_params_t(queue_params_t &&o)
Move constructor.
std::size_t next_thread_wakeup_threshold() const
Getter for thread wakeup threshold value.
queue_params_t & next_thread_wakeup_threshold(std::size_t value)
Setter for thread wakeup threshold.
const lock_factory_t & lock_factory() const
Getter for lock factory.
An analog of std::lock_guard for MPSC queue lock.
void notify_one() noexcept
lock_guard_t(lock_t &lock)
lock_guard_t(const lock_guard_t &)=delete
lock_guard_t(lock_guard_t &&)=delete
An interface for lock for MPSC queue.
virtual void unlock() noexcept=0
Unlock object locked in exclusive mode.
lock_t(const lock_t &)=delete
virtual void notify_one() noexcept=0
Notify one waiting thread if it exists.
virtual void wait_for_notify() noexcept=0
Waiting for nofication.
lock_t & operator=(lock_t &&)=delete
lock_t & operator=(const lock_t &)=delete
virtual void lock() noexcept=0
Lock object in exclusive mode.
virtual ~lock_t() noexcept=default
Container for storing parameters for MPSC queue.
queue_params_t()
Default constructor.
queue_params_t(const queue_params_t &o)
Copy constructor.
const lock_factory_t & lock_factory() const
Getter for lock factory.
queue_params_t(queue_params_t &&o) noexcept
Move constructor.
queue_params_t & lock_factory(lock_factory_t factory)
Setter for lock factory.
queue_params_t & operator=(queue_params_t &&o) noexcept
Move operator.
friend void swap(queue_params_t &a, queue_params_t &b) noexcept
queue_params_t & operator=(const queue_params_t &o)
Copy operator.
lock_factory_t m_lock_factory
Lock factory to be used during queue creation.
An analog of std::unique_lock for MPSC queue lock.
void wait_for_notify() noexcept
unique_lock_t(const unique_lock_t &)=delete
unique_lock_t(unique_lock_t &&)=delete
unique_lock_t(lock_t &lock)
Alias for namespace with traits of event queue.
disp_params_t & set_queue_params(queue_traits::queue_params_t p)
Setter for queue parameters.
const queue_traits::queue_params_t & queue_params() const noexcept
Getter for queue parameters.
disp_params_t()=default
Default constructor.
disp_params_t & tune_queue_params(L tunner)
Tuner for queue parameters.
queue_traits::queue_params_t m_queue_params
Queue parameters.
friend void swap(disp_params_t &a, disp_params_t &b) noexcept
Alias for namespace with traits of event queue.
disp_params_t & tune_queue_params(L tunner)
Tuner for queue parameters.
disp_params_t()=default
Default constructor.
disp_params_t & set_queue_params(queue_traits::queue_params_t p)
Setter for queue parameters.
const queue_traits::queue_params_t & queue_params() const
Getter for queue parameters.
friend void swap(disp_params_t &a, disp_params_t &b) noexcept
queue_traits::queue_params_t m_queue_params
Queue parameters.
Mixin with thread activity tracking flag.
work_thread_activity_tracking_t m_flag
Params & work_thread_activity_tracking(work_thread_activity_tracking_t v) noexcept
Setter for work thread activity tracking.
friend void swap(work_thread_activity_tracking_flag_mixin_t &a, work_thread_activity_tracking_flag_mixin_t &b) noexcept
Params & turn_work_thread_activity_tracking_on() noexcept
Helper for turning work thread activity tracking on.
Params & turn_work_thread_activity_tracking_off() noexcept
Helper for turning work thread activity tracking off.
work_thread_activity_tracking_t work_thread_activity_tracking() const noexcept
Getter for work thread activity tracking.
Mixin that holds optional work thread factory.
abstract_work_thread_factory_shptr_t work_thread_factory() const noexcept
Getter for work thread factory.
friend void swap(work_thread_factory_mixin_t &a, work_thread_factory_mixin_t &b) noexcept
Params & work_thread_factory(abstract_work_thread_factory_shptr_t v) noexcept
Setter for work thread factory.
abstract_work_thread_factory_shptr_t m_factory
An analog of unique_ptr for abstract_work_thread.
abstract_work_thread_t & unchecked_get() const noexcept
Unsafe method for getting a reference to holding abstract_work_thread instance.
work_thread_holder_t(work_thread_holder_t &&o) noexcept
abstract_work_thread_factory_shptr_t m_factory
work_thread_holder_t & operator=(const work_thread_holder_t &)=delete
bool operator!() const noexcept
work_thread_holder_t(abstract_work_thread_t &thread, abstract_work_thread_factory_shptr_t factory) noexcept
work_thread_holder_t & operator=(work_thread_holder_t &&o) noexcept
operator bool() const noexcept
work_thread_holder_t(const work_thread_holder_t &)=delete
bool empty() const noexcept
abstract_work_thread_t * m_thread
friend void swap(work_thread_holder_t &a, work_thread_holder_t &b) noexcept
~work_thread_holder_t() noexcept
work_thread_holder_t() noexcept=default
Interface for dispatcher binders.
disp_binder_t(const disp_binder_t &)=delete
virtual void bind(agent_t &agent) noexcept=0
Bind agent to dispatcher.
virtual void unbind(agent_t &agent) noexcept=0
Unbind agent from dispatcher.
disp_binder_t & operator=(const disp_binder_t &)=delete
disp_binder_t(disp_binder_t &&)=delete
virtual void preallocate_resources(agent_t &agent)=0
Allocate resources in dispatcher for new agent.
disp_binder_t & operator=(disp_binder_t &&)=delete
virtual void undo_preallocation(agent_t &agent) noexcept=0
Undo resources allocation.
virtual ~disp_binder_t() noexcept=default
An interface of envelope with some message/signal inside.
virtual ~envelope_t() override=default
envelope_t(const envelope_t &)=default
envelope_t & operator=(envelope_t &&) noexcept=default
envelope_t & operator=(const envelope_t &)=default
kind_t so5_message_kind() const noexcept override
Detect the kind of the message.
virtual void access_hook(access_context_t context, handler_invoker_t &invoker) noexcept=0
envelope_t(envelope_t &&)=default
An extended version of handling_context which can be used for calling event handler.
handler_invoker_t(const handler_invoker_t &)=default
handler_invoker_t(handler_invoker_t &&)=default
~handler_invoker_t()=default
handler_invoker_t & operator=(const handler_invoker_t &)=default
handler_invoker_t & operator=(handler_invoker_t &&) noexcept=default
virtual void invoke(const payload_info_t &payload) noexcept=0
Call an actual handler for the enveloped message/signal.
handler_invoker_t()=default
An implementation of handler_invoker interface.
agent_demand_handler_invoker_t(current_thread_id_t work_thread_id, execution_demand_t &demand, const so_5::impl::event_handler_data_t &handler_data)
Initializing constructor.
An information about payload inside envelope.
message_ref_t m_message
Actual enveloped message.
message_ref_t & message() const noexcept
payload_info_t(message_ref_t message)
Initializing constructor.
An interface for environment_infrastructure entity.
environment_infrastructure_t(const environment_infrastructure_t &)=delete
virtual::so_5::stats::repository_t & stats_repository() noexcept=0
Get stats repository for the environment.
virtual ~environment_infrastructure_t() noexcept=default
virtual coop_unique_holder_t make_coop(coop_handle_t parent, disp_binder_shptr_t default_binder)=0
Create an instance of a new coop.
virtual bool final_deregister_coop(coop_shptr_t coop) noexcept=0
Do final actions of the cooperation deregistration.
virtual void launch(env_init_t init_fn)=0
Do actual launch of SObjectizer's Environment.
virtual void ready_to_deregister_notify(coop_shptr_t coop) noexcept=0
virtual::so_5::stats::controller_t & stats_controller() noexcept=0
Get stats controller for the environment.
virtual so_5::timer_id_t schedule_timer(const std::type_index &type_wrapper, const message_ref_t &msg, const mbox_t &mbox, std::chrono::steady_clock::duration pause, std::chrono::steady_clock::duration period)=0
Initiate a timer (delayed or periodic message).
virtual void stop() noexcept=0
Initiate a signal for shutdown of Environment.
static environment_infrastructure_deleter_fnptr_t default_deleter()
Default deleter for environment_infrastructure object.
virtual coop_handle_t register_coop(coop_unique_holder_t coop)=0
Register new cooperation.
environment_infrastructure_t(environment_infrastructure_t &&)=delete
virtual disp_binder_shptr_t make_default_disp_binder()=0
Create a binder for the default dispatcher.
virtual void single_timer(const std::type_index &type_wrapper, const message_ref_t &msg, const mbox_t &mbox, std::chrono::steady_clock::duration pause)=0
Initiate a delayed message.
environment_infrastructure_t & operator=(const environment_infrastructure_t &)=delete
environment_infrastructure_t()=default
virtual timer_thread_stats_t query_timer_thread_stats()=0
Query run-time statistics for timer (thread or manager).
virtual coop_repository_stats_t query_coop_repository_stats()=0
Query run-time statistics for cooperation repository.
environment_infrastructure_t & operator=(environment_infrastructure_t &&)=delete
Parameters for the SObjectizer Environment initialization.
event_queue_hook_unique_ptr_t m_event_queue_hook
An event_queue_hook object.
layer_map_t m_so_layers
Additional layers.
so_5::disp::abstract_work_thread_factory_shptr_t so5_giveout_work_thread_factory()
Take out work_thread_factory object.
environment_infrastructure_factory_t m_infrastructure_factory
A factory for environment infrastructure entity.
environment_params_t & event_exception_logger(event_exception_logger_unique_ptr_t logger)
Set exception logger object.
bool m_autoshutdown_disabled
Is autoshutdown when there is no more cooperation disabled?
queue_locks_defaults_manager_unique_ptr_t so5_giveout_queue_locks_defaults_manager()
Take out queue locks defaults manager.
environment_params_t & default_subscription_storage_factory(subscription_storage_factory_t factory)
Set subscription storage factory to be used by default.
environment_params_t & infrastructure_factory(environment_infrastructure_factory_t factory)
Set new environment infrastructure factory.
environment_params_t & work_thread_factory(so_5::disp::abstract_work_thread_factory_shptr_t factory)
Set work thread factory to be used by default.
environment_params_t & default_disp_params(so_5::disp::nef_one_thread::disp_params_t params)
Set parameters for a case when nef_one_thread-disp must be used as the default dispatcher.
default_disp_params_t m_default_disp_params
Parameters for the default dispatcher.
void add_layer(const std::type_index &type, layer_unique_ptr_t layer_ptr)
Add an additional layer.
bool autoshutdown_disabled() const
Is autoshutdown disabled?
coop_listener_unique_ptr_t so5_giveout_coop_listener()
Get cooperation listener.
environment_params_t & turn_work_thread_activity_tracking_off()
Helper for turning work thread activity tracking off.
environment_params_t & disable_autoshutdown()
Do not shutdown SO Environment when it is becomes empty.
so_5::msg_tracing::tracer_unique_ptr_t so5_giveout_message_delivery_tracer()
Get message delivery tracer for the environment.
environment_params_t & message_delivery_tracer(so_5::msg_tracing::tracer_unique_ptr_t tracer)
Set message delivery tracer for the environment.
environment_params_t & queue_locks_defaults_manager(queue_locks_defaults_manager_unique_ptr_t manager)
Set manager for queue locks defaults.
environment_params_t & error_logger(error_logger_shptr_t logger)
Set error logger for the environment.
environment_params_t & default_disp_params(so_5::disp::one_thread::disp_params_t params)
Set parameters for a case when one_thread-disp must be used as the default dispatcher.
environment_params_t & work_thread_activity_tracking(work_thread_activity_tracking_t flag)
Set activity tracking flag for the whole SObjectizer Environment.
void event_queue_hook(event_queue_hook_unique_ptr_t hook)
Set event_queue_hook object.
environment_params_t & add_layer(std::unique_ptr< SO_Layer > layer_ptr)
Add an additional layer to the SObjectizer Environment.
so_5::msg_tracing::filter_shptr_t so5_giveout_message_delivery_tracer_filter()
Get message delivery tracer filter for the environment.
queue_locks_defaults_manager_unique_ptr_t m_queue_locks_defaults_manager
Manager for defaults of queue locks.
environment_params_t(environment_params_t &&other)
Move constructor.
so_5::timer_thread_factory_t so5_giveout_timer_thread_factory()
Get the timer_thread factory.
const environment_infrastructure_factory_t & infrastructure_factory() const
Get the current environment infrastructure factory.
friend SO_5_FUNC void swap(environment_params_t &a, environment_params_t &b) noexcept
Swap operation.
environment_params_t & coop_listener(coop_listener_unique_ptr_t coop_listener)
Set cooperation listener object.
environment_params_t & turn_work_thread_activity_tracking_on()
Helper for turning work thread activity tracking on.
layer_map_t so5_giveout_layers_map()
Get map of default SObjectizer's layers.
so_5::msg_tracing::tracer_unique_ptr_t m_message_delivery_tracer
Tracer for message delivery.
exception_reaction_t exception_reaction() const noexcept
Get exception reaction flag value.
error_logger_shptr_t m_error_logger
Error logger for the environment.
environment_params_t & message_delivery_tracer_filter(so_5::msg_tracing::filter_shptr_t filter)
Set message tracer filter for the environment.
environment_params_t & exception_reaction(exception_reaction_t value) noexcept
Set exception reaction flag value.
subscription_storage_factory_t m_default_subscription_storage_factory
Default subscription storage factory.
const default_disp_params_t & default_disp_params() const
Get the parameters for the default dispatcher.
so_5::disp::abstract_work_thread_factory_shptr_t m_work_thread_factory
Global factory for work threads.
environment_params_t()
Constructor.
event_exception_logger_unique_ptr_t m_event_exception_logger
Exception logger.
event_queue_hook_unique_ptr_t so5_giveout_event_queue_hook()
Take out event_queue_hook object.
so_5::msg_tracing::filter_shptr_t m_message_delivery_tracer_filter
Message delivery tracer filter to be used with environment.
work_thread_activity_tracking_t work_thread_activity_tracking() const
Get activity tracking flag for the whole SObjectizer Environment.
const error_logger_shptr_t & so5_error_logger() const
Get error logger for the environment.
environment_params_t & operator=(environment_params_t &&other) noexcept
Move operator.
event_exception_logger_unique_ptr_t so5_giveout_event_exception_logger()
Get exception logger.
coop_listener_unique_ptr_t m_coop_listener
Cooperation listener.
environment_params_t & timer_thread(so_5::timer_thread_factory_t factory)
Set the timer_thread factory.
exception_reaction_t m_exception_reaction
Exception reaction flag for the whole SO Environment.
work_thread_activity_tracking_t m_work_thread_activity_tracking
Work thread activity tracking for the whole Environment.
const subscription_storage_factory_t & default_subscription_storage_factory() const noexcept
Get the current default subscription storage factory.
so_5::timer_thread_factory_t m_timer_thread_factory
Timer thread factory.
disp_binder_shptr_t so_make_default_disp_binder()
Get binding to the default dispatcher.
mbox_t create_mbox()
Create an anonymous MPMC mbox.
error_logger_t & error_logger() const
Get the error_logger object.
void imp_run_layers_and_go_further()
Run layers and call next run stage.
void add_extra_layer(const std::type_index &type, const layer_ref_t &layer)
Add an additional layer.
so_5::timer_id_t so_schedule_timer(const low_level_api::schedule_timer_params_t params)
Schedule timer event.
stats::repository_t & stats_repository()
Access to repository of data sources for run-time monitoring.
void add_extra_layer(std::unique_ptr< SO_Layer > layer_ptr)
Add an additional layer.
void change_message_delivery_tracer_filter(so_5::msg_tracing::filter_shptr_t filter)
Change the current msg_tracing's filter to a new one.
coop_handle_t register_agent_as_coop(std::unique_ptr< A > agent)
Register single agent as a cooperation.
void install_exception_logger(event_exception_logger_unique_ptr_t logger)
Set up an exception logger.
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.
SO_Layer * query_layer_noexcept() const
void run()
Run the SObjectizer Run-Time.
environment_t & operator=(const environment_t &)=delete
void remove_extra_layer(const std::type_index &type)
Remove an additional layer.
mchain_t create_mchain(const mchain_params_t ¶ms)
Create message chain.
exception_reaction_t exception_reaction() const noexcept
An exception reaction for the whole SO Environment.
std::unique_ptr< internals_t > m_impl
SObjectizer Environment internals.
environment_t & self_ref()
Auxiliary methods for getting reference to itself.
std::unique_ptr< Agent > make_agent(Args &&... args)
Helper method for simplification of agents creation.
coop_handle_t register_agent_as_coop(std::unique_ptr< A > agent, disp_binder_shptr_t disp_binder)
Register single agent as a cooperation with specified dispatcher binder.
coop_unique_holder_t make_coop(coop_handle_t parent)
Create a new cooperation that will be a child for specified parent coop.
so_5::disp::abstract_work_thread_factory_shptr_t work_thread_factory() const noexcept
Access to the global work thread factory.
void call_exception_logger(const std::exception &event_exception, const coop_handle_t &coop) noexcept
Call event exception logger for logging an exception.
environment_t(environment_params_t &&so_environment_params)
stats::controller_t & stats_controller()
Access to controller of run-time monitoring.
layer_t * query_layer(const std::type_index &type) const
Access to an additional layer.
mbox_t make_custom_mbox(Lambda &&lambda)
Create a custom mbox.
void imp_run_infrastructure()
Launch environment infrastructure and wait for finish.
void imp_run_stats_controller_and_go_further()
Run controller for run-time monitoring and call next run stage.
coop_unique_holder_t make_coop()
Create a cooperation.
void stop() noexcept
Send a shutdown signal to the Run-Time.
work_thread_activity_tracking_t work_thread_activity_tracking() const
Get activity tracking flag for the whole SObjectizer Environment.
decltype(auto) introduce_coop(Args &&... args)
Helper method for simplification of cooperation creation and registration.
mbox_t do_make_custom_mbox(custom_mbox_details::creator_iface_t &creator)
Actual creation of a custom mbox.
void remove_stop_guard(stop_guard_shptr_t guard)
Remove stop_guard and complete the stop operation if necessary.
environment_t(const environment_t &)=delete
coop_handle_t register_coop(coop_unique_holder_t agent_coop)
Register a cooperation.
void deregister_coop(coop_handle_t coop, int reason) noexcept
Deregister the cooperation.
SO_Layer * query_layer() const
Get access to the layer with exception if layer is not found.
coop_unique_holder_t make_coop(disp_binder_shptr_t disp_binder)
Create a cooperation with specified dispatcher binder.
virtual void init()=0
Initialization hook.
mbox_t create_mbox(nonempty_name_t mbox_name)
Create named MPMC mbox.
void so_single_timer(const low_level_api::single_timer_params_t params)
Schedule a single shot timer event.
stop_guard_t::setup_result_t setup_stop_guard(stop_guard_shptr_t guard, stop_guard_t::what_if_stop_in_progress_t reaction_on_stop_in_progress=stop_guard_t::what_if_stop_in_progress_t::throw_exception)
Set up a new stop_guard.
bool autoshutdown_disabled() const
Get autoshutdown_disabled flag.
coop_unique_holder_t make_coop(coop_handle_t parent, disp_binder_shptr_t disp_binder)
Create a new cooperation that will be a child for specified parent coop.
An interface for logging error messages.
error_logger_t & operator=(error_logger_t &)=delete
virtual ~error_logger_t() noexcept=default
error_logger_t(const error_logger_t &)=delete
virtual void log(const char *file_name, unsigned int line, const std::string &message)=0
A method for logging message.
An interface for the exception logging.
event_exception_logger_t & operator=(const event_exception_logger_t &)=delete
virtual void on_install(event_exception_logger_unique_ptr_t previous_logger) noexcept
Installation hook.
event_exception_logger_t & operator=(event_exception_logger_t &&)=delete
event_exception_logger_t(const event_exception_logger_t &)=delete
virtual void log_exception(const std::exception &event_exception, const coop_handle_t &coop) noexcept=0
Log the exception caught.
event_exception_logger_t(event_exception_logger_t &&)=delete
virtual ~event_exception_logger_t() noexcept=default
event_exception_logger_t()=default
Interface of event_queue_hook object.
virtual event_queue_t * on_bind(agent_t *agent, event_queue_t *original_queue) noexcept=0
A reaction to binding of an agent to some event_queue.
static void default_deleter(event_queue_hook_t *what) noexcept
An implementation of deleter that use operator delete for destroying object of type event_queue_hook.
event_queue_hook_t & operator=(const event_queue_hook_t &)=delete
event_queue_hook_t(event_queue_hook_t &&)=delete
event_queue_hook_t(const event_queue_hook_t &)=delete
event_queue_hook_t & operator=(event_queue_hook_t &&)=delete
event_queue_hook_t()=default
static void noop_deleter(event_queue_hook_t *) noexcept
An implementation of no-op deleter.
virtual ~event_queue_hook_t()=default
virtual void on_unbind(agent_t *agent, event_queue_t *queue) noexcept=0
A reaction to unbinding of an agent from some event_queue.
An interface of event queue for agent.
event_queue_t & operator=(const event_queue_t &)=delete
event_queue_t & operator=(event_queue_t &&)=delete
virtual void push(execution_demand_t demand)=0
Enqueue new event to the queue.
virtual ~event_queue_t() noexcept=default
virtual void push_evt_finish(execution_demand_t demand) noexcept=0
Enqueue a demand for evt_finish event.
virtual void push_evt_start(execution_demand_t demand)=0
Enqueue a demand for evt_start event.
event_queue_t(event_queue_t &&)=delete
event_queue_t(const event_queue_t &)=delete
The base class for all SObjectizer exceptions.
int error_code() const noexcept
Error code getter.
exception_t(const exception_t &)=default
exception_t(exception_t &&)=default
int m_error_code
Error code.
exception_t(const std::string &error_descr, int error_code)
exception_t & operator=(exception_t &&o) noexcept=default
exception_t & operator=(exception_t &o)=default
static void raise(const char *file_name, unsigned int line_number, std::string_view error_descr, int error_code)
A hint for a dispatcher for execution of event for the concrete execution_demand.
bool is_thread_safe() const
Is thread safe handler?
execution_hint_t(execution_demand_t &demand)
execution_hint_t(execution_demand_t &demand, direct_func_t direct_func, thread_safety_t thread_safety)
Initializing constructor.
thread_safety_t m_thread_safety
Thread safety for event handler.
void exec(current_thread_id_t working_thread_id) const
Call event handler directly.
direct_func_t m_direct_func
Function for call event handler directly.
static execution_hint_t create_empty_execution_hint(execution_demand_t &demand)
execution_demand_t & m_demand
A reference to demand for which that hint has been created.
An internal class with real implementation of coop's logic.
static void destroy_content(coop_t &coop) noexcept
Perform all necessary cleanup actions for coop.
static void do_add_agent(coop_t &coop, agent_ref_t agent_ref, disp_binder_shptr_t disp_binder)
Add agent to the cooperation with the dispatcher binding.
static void do_final_deregistration_actions(coop_t &coop)
Perform final deregistration actions for an coop.
static void do_add_child(coop_t &parent, coop_shptr_t child)
Perform addition of a new child coop.
static void add_dereg_notificator(coop_t &coop, coop_dereg_notificator_t notificator)
Add notificator about cooperation deregistration event.
static exception_reaction_t exception_reaction(const coop_t &coop) noexcept
Get exception reaction for coop.
static void do_remove_child(coop_t &parent, coop_t &child) noexcept
Perform removement of a child coop.
static void add_reg_notificator(coop_t &coop, coop_reg_notificator_t notificator)
Add notificator about cooperation registration event.
static void do_decrement_reference_count(coop_t &coop) noexcept
Do decrement reference count for a coop.
static void do_deregistration_specific_actions(coop_t &coop, coop_dereg_reason_t reason) noexcept
Perform actions related to the deregistration of coop.
static void do_registration_specific_actions(coop_t &coop)
Perform actions related to the registration of coop.
static void do_add_agent(coop_t &coop, agent_ref_t agent_ref)
Add agent to cooperation.
A special class for accessing private members of agent_coop.
static coop_unique_holder_t make_coop(coop_id_t id, coop_handle_t parent, disp_binder_shptr_t default_binder, outliving_reference_t< environment_t > env)
static void set_next_in_final_dereg_chain(coop_t &coop, coop_shptr_t next_in_chain) noexcept
Set the next coop in the chain of coops for the final deregistration.
static coop_reg_notificators_container_ref_t giveout_reg_notificators(coop_t &coop) noexcept
static void do_final_deregistration_actions(coop_t &coop)
static coop_dereg_reason_t dereg_reason(const coop_t &coop) noexcept
static coop_shptr_t giveout_next_in_final_dereg_chain(coop_t &coop) noexcept
Extract a smart pointer to the next coop in the chain of coops for the final deregistration.
static void decrement_usage_count(coop_t &coop)
static void destroy_content(coop_t &coop)
static coop_dereg_notificators_container_ref_t giveout_dereg_notificators(coop_t &coop) noexcept
static void increment_usage_count(coop_t &coop) noexcept
static void do_registration_specific_actions(coop_t &coop)
static coop_shptr_t make_from(coop_unique_holder_t holder) noexcept
Storage for message delivery filters.
void drop_all() noexcept
Drop all defined filters.
map_t m_filters
Information about defined filters.
void set_delivery_filter(const mbox_t &mbox, const std::type_index &msg_type, delivery_filter_unique_ptr_t filter, so_5::outliving_reference_t< abstract_message_sink_t > owner)
Set a delivery filter.
void drop_delivery_filter(const mbox_t &mbox, const std::type_index &msg_type) noexcept
Remove delivery filter.
message_sinks_with_limits_holder_t m_holder
All sinks.
fixed_sinks_storage_t(partially_constructed_agent_ptr_t owner_ptr, so_5::message_limit::description_container_t &&descriptions)
Initializing constructor.
abstract_message_sink_t * find_or_create(const std::type_index &msg_type) override
growable_sinks_storage_t(partially_constructed_agent_ptr_t owner_ptr, so_5::message_limit::description_t &&default_limit_description, so_5::message_limit::description_container_t &&descriptions)
Initializing constructor.
const so_5::message_limit::description_t m_default_limit_description
Description of the default limit.
abstract_message_sink_t * find_or_create(const std::type_index &msg_type) override
message_sinks_with_limits_holder_t m_holder
All sinks and limits.
const partially_constructed_agent_ptr_t m_owner_ptr
Owner of sinks and limits.
A helper class for accessing the functionality of environment-class which is specific for SObjectizer...
mbox_id_t allocate_mbox_id() noexcept
Allocate a new ID for a new custom mbox or mchain.
event_queue_t * event_queue_on_bind(agent_t *agent, event_queue_t *original_queue) noexcept
Call the event_queue_hook when an agent is being bound to a particular event_queue.
so_5::disp::mpmc_queue_traits::lock_factory_t default_mpmc_queue_lock_factory() const
Get default lock_factory for MPMC queues.
so_5::msg_tracing::holder_t & msg_tracing_stuff() const
Get access to message delivery tracer stuff holder.
subscription_storage_factory_t default_subscription_storage_factory() const noexcept(noexcept(subscription_storage_factory_t{}=subscription_storage_factory_t{}))
Get the default storage subscription factory.
environment_t & m_env
Environment instance to work with.
void event_queue_on_unbind(agent_t *agent, event_queue_t *queue) noexcept
Call the event_queue_hook when an agent is being unbound from its event_queue.
mbox_t create_ordinary_mpsc_mbox(agent_t &single_consumer)
Create multi-producer/single-consumer mbox that handles message limits.
bool is_msg_tracing_enabled() const
Is message delivery tracing enabled?
so_5::msg_tracing::holder_t & msg_tracing_stuff_nonchecked() const noexcept
Get access to message delivery tracer stuff holder.
so_5::disp::mpsc_queue_traits::lock_factory_t default_mpsc_queue_lock_factory() const
Get default lock_factory for MPSC queues.
void final_deregister_coop(coop_shptr_t coop) noexcept
Do the final actions of a cooperation deregistration.
internal_env_iface_t(environment_t &env)
Initializing constructor.
mbox_t create_limitless_mpsc_mbox(agent_t &single_consumer)
Create multi-producer/single-consumer mbox that ignores message limits.
void ready_to_deregister_notify(coop_shptr_t coop) noexcept
Notification about readiness to the deregistration.
An utility class for working with layers.
Helper class for accessing protected members from mbox interface.
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.
Type that holds message_sink_with_message_limit objects.
message_sinks_with_limits_holder_t(partially_constructed_agent_ptr_t owner_ptr, so_5::message_limit::description_container_t &&descriptions)
Initializing constructor.
abstract_message_sink_t * find_or_create(const std::type_index &msg_type, partially_constructed_agent_ptr_t owner_ptr, const so_5::message_limit::description_t &limit_description)
static storage_t build_sinks(partially_constructed_agent_ptr_t owner_ptr, so_5::message_limit::description_container_t &&descriptions)
Helper for build an initial storage.
storage_t m_sinks
All created message_sinks.
abstract_message_sink_t * find(const std::type_index &msg_type)
An actual implementation of trace data interface.
optional< const agent_t * > m_agent
void set_event_handler_data_ptr(const so_5::impl::event_handler_data_t *ptr) noexcept
optional< so_5::msg_tracing::msg_source_t > m_msg_source
void set_msg_type(const std::type_index &msg_type) noexcept
virtual optional< std::type_index > msg_type() const noexcept override
Get the information about message type.
void set_msg_source(so_5::msg_tracing::msg_source_t info) noexcept
virtual optional< const so_5::impl::event_handler_data_t * > event_handler_data_ptr() const noexcept override
Get pointer to event handler.
void set_compound_action(so_5::msg_tracing::compound_action_description_t desc) noexcept
optional< so_5::msg_tracing::message_instance_info_t > m_message_instance_info
optional< current_thread_id_t > m_tid
optional< so_5::msg_tracing::compound_action_description_t > m_compound_action
optional< std::type_index > m_msg_type
void set_message_instance_info(so_5::msg_tracing::message_instance_info_t info) noexcept
virtual optional< so_5::msg_tracing::compound_action_description_t > compound_action() const noexcept override
Get the description of a compound action.
void set_tid(current_thread_id_t tid) noexcept
optional< const abstract_message_sink_t * > m_message_sink
virtual optional< so_5::msg_tracing::message_instance_info_t > message_instance_info() const noexcept override
Get message instance information.
virtual optional< so_5::msg_tracing::msg_source_t > msg_source() const noexcept override
Get the information about message source.
optional< so_5::msg_tracing::message_or_signal_flag_t > m_message_or_signal
void set_message_or_signal(so_5::msg_tracing::message_or_signal_flag_t flag) noexcept
virtual optional< const agent_t * > agent() const noexcept override
Get a pointer to agent from trace message.
void set_agent(const agent_t *agent) noexcept
virtual optional< const abstract_message_sink_t * > message_sink() const noexcept override
Get a pointer to message_sink from trace message.
virtual optional< so_5::msg_tracing::message_or_signal_flag_t > message_or_signal() const noexcept override
Get message or signal information.
void set_message_sink(const abstract_message_sink_t *message_sink) noexcept
optional< const so_5::impl::event_handler_data_t * > m_event_handler_data_ptr
virtual optional< current_thread_id_t > tid() const noexcept override
Get the Thread ID from trace message.
void overflow_drop_newest()
void overflow_remove_oldest(const so_5::mchain_props::demand_t &)
void overflow_abort_app()
void overflow_throw_exception()
void stored(const Queue &)
deliver_op_tracer(const mchain_tracing_disabled_base &, const abstract_message_chain_t &, const std::type_index &, const message_ref_t &)
void stored(const Queue &queue)
void overflow_throw_exception()
so_5::msg_tracing::holder_t & m_tracer
void overflow_remove_oldest(const so_5::mchain_props::demand_t &d)
void make_trace(const char *action_name_suffix, Args &&... args) const
const abstract_message_chain_t & m_chain
const message_ref_t & m_message
void overflow_drop_newest()
deliver_op_tracer(const mchain_tracing_enabled_base &tracing_base, const abstract_message_chain_t &chain, const std::type_index &msg_type, const message_ref_t &message)
const std::type_index & m_msg_type
void overflow_abort_app()
Base class for a mchain for the case when message delivery tracing is enabled.
so_5::msg_tracing::holder_t & tracer() const
static const char * message_kind_to_string(const message_ref_t &what)
mchain_tracing_enabled_base(outliving_reference_t< so_5::msg_tracing::holder_t > tracer)
void trace_demand_drop_on_close(const abstract_message_chain_t &chain, const mchain_props::demand_t &d)
void trace_extracted_demand(const abstract_message_chain_t &chain, const mchain_props::demand_t &d)
so_5::msg_tracing::holder_t & m_tracer
void no_subscribers() const
const so_5::message_limit::impl::action_msg_tracer_t * overlimit_tracer() const
void message_rejected(const abstract_message_sink_t *, const delivery_possibility_t) const
void make_trace(const char *, Args &&...) const
deliver_op_tracer(const tracing_disabled_base &, const abstract_message_box_t &, const char *, message_delivery_mode_t, const std::type_index &, const message_ref_t &, const unsigned int)
so_5::msg_tracing::holder_t & m_tracer
void make_trace(const char *action_name_suffix, Args &&... args) const
const abstract_message_box_t & m_mbox
const message_delivery_mode_t m_delivery_mode
void reaction_transform(const agent_t *subscriber, const mbox_t &target, const std::type_index &msg_type, const message_ref_t &transformed) const noexcept override
Message will be transformed and redirected.
void push_to_queue(const abstract_message_sink_t *sink, const agent_t *sink_owner) const noexcept override
Execution demand for agent will be pushed to the queue by a sink.
deliver_op_tracer(const tracing_enabled_base &tracing_base, const abstract_message_box_t &mbox, const char *op_name, message_delivery_mode_t delivery_mode, const std::type_index &msg_type, const message_ref_t &message, const unsigned int redirection_deep)
const details::redirection_deep m_redirection_deep
void reaction_redirect_message(const agent_t *subscriber, const mbox_t &target) const noexcept override
Message will be redirected to another mbox.
const message_ref_t & m_message
void no_subscribers() const
void reaction_abort_app(const agent_t *subscriber) const noexcept override
Application will be aborted as result of overlimit.
const so_5::message_limit::impl::action_msg_tracer_t * overlimit_tracer() const
void message_rejected(const abstract_message_sink_t *subscriber, const delivery_possibility_t status) const
void reaction_drop_message(const agent_t *subscriber) const noexcept override
Message will be dropped as result of overlimit.
const std::type_index & m_msg_type
Base class for a mbox for the case when message delivery tracing is enabled.
tracing_enabled_base(outliving_reference_t< so_5::msg_tracing::holder_t > tracer)
so_5::msg_tracing::holder_t & tracer() const
so_5::msg_tracing::holder_t & m_tracer
An interface for storage of message_sinks for one agent.
sinks_storage_t(const sinks_storage_t &)=delete
sinks_storage_t()=default
sinks_storage_t & operator=(const sinks_storage_t &)=delete
virtual abstract_message_sink_t * find_or_create(const std::type_index &msg_type)=0
virtual ~sinks_storage_t()=default
void add(internal_state_listener_unique_ptr_t listener)
Add a new listener.
static auto wrap_nondestroyable(agent_state_listener_t &listener)
static void actual_deleter(agent_state_listener_t *listener)
static void noop_deleter(agent_state_listener_t *)
container_t m_listeners
All listeners.
void changed(agent_t &agent, const state_t &state) noexcept
Handle state change.
static auto wrap_destroyable(agent_state_listener_unique_ptr_t listener)
agent_t::agent_status_t m_previous_status
state_switch_guard_t(agent_t &agent)
abstract_message_sink_t * find_or_create(const std::type_index &) override
storage_without_limits_t(partially_constructed_agent_ptr_t owner_ptr)
message_sink_without_message_limit_t m_sink
The single sinks that is needed if message limits are not used.
An interface of subscription storage.
virtual const event_handler_data_t * find_handler(mbox_id_t mbox_id, const std::type_index &msg_type, const state_t ¤t_state) const noexcept=0
virtual void drop_subscription(const mbox_t &mbox, const std::type_index &msg_type, const state_t &target_state) noexcept=0
virtual void drop_subscription_for_all_states(const mbox_t &mbox, const std::type_index &msg_type) noexcept=0
virtual void create_event_subscription(const mbox_t &mbox, const std::type_index &msg_type, abstract_message_sink_t &message_sink, const state_t &target_state, const event_handler_method_t &method, thread_safety_t thread_safety, event_handler_kind_t handler_kind)=0
virtual void drop_all_subscriptions() noexcept=0
Drop all subscriptions.
Template class for smart reference wrapper on the atomic_refcounted_t.
bool operator==(const intrusive_ptr_t &o) const
intrusive_ptr_t(T *obj) noexcept
Constructor for a raw pointer.
T * m_obj
Object controlled by a smart reference.
void dismiss_object() noexcept
Decrement reference count to object and delete it if needed.
void reset() noexcept
Drop controlled object.
intrusive_ptr_t(const intrusive_ptr_t< Y > &o) noexcept
Constructor from another smart reference.
intrusive_ptr_t(std::unique_ptr< Y > o) noexcept
Constructor from unique_ptr instance.
intrusive_ptr_t(intrusive_ptr_t &&o) noexcept
Move constructor.
bool operator<(const intrusive_ptr_t &o) const
T * operator->() const noexcept
intrusive_ptr_t(const intrusive_ptr_t &o) noexcept
Copy constructor.
intrusive_ptr_t & operator=(const intrusive_ptr_t &o) noexcept
Copy operator.
intrusive_ptr_t & operator=(intrusive_ptr_t &&o) noexcept
Move operator.
intrusive_ptr_t< Y > make_reference() const noexcept
Make reference with casing to different type.
T & operator*() const noexcept
void take_object() noexcept
Increment reference count to object if it's not null.
static void ensure_right_T()
friend void swap(intrusive_ptr_t &a, intrusive_ptr_t &b) noexcept
Swap values.
intrusive_ptr_t() noexcept
Default constructor.
~intrusive_ptr_t() noexcept
Destructor.
operator bool() const noexcept
Is this a null reference?
An interface of the additional SObjectizer Environment layer.
layer_t(layer_t &&)=delete
environment_t * m_env
SObjectizer Environment to which layer is bound.
layer_t(const layer_t &)=delete
layer_t & operator=(layer_t &&)=delete
virtual void start()
Start hook.
virtual void shutdown()
Shutdown signal hook.
virtual void wait()
Waiting for the complete shutdown of a layer.
layer_t & operator=(const layer_t &)=delete
environment_t & so_environment() const
Access to the SObjectizer Environment.
virtual ~layer_t() noexcept=default
void bind_to_environment(environment_t *env)
Bind layer to the SObjectizer Environment.
error_logger_t & m_logger
std::ostringstream & stream()
std::ostringstream m_stream
conductor_t(const Env &env, const char *file, unsigned int line)
conductor_t(error_logger_t &logger, const char *file, unsigned int line)
An implementation of delivery filter represented by lambda-function like object.
lambda_as_filter_t(Lambda &&filter)
bool check(const abstract_message_sink_t &, message_t &msg) const noexcept override
Checker for a message instance.
A class for the name of mbox_namespace.
std::string_view m_name
The name.
mbox_namespace_name_t(std::string_view name)
Constructor with check for the empty value.
mbox_namespace_name_t()=delete
std::string_view query_name() const noexcept(noexcept(std::string_view{m_name}))
Get the value.
Basic parameters for advanced receive from mchain and for multi chain select.
actual_type & no_wait_on_empty() noexcept
Disable waiting on the empty queue.
actual_type & on_close(typename basic_t::chain_closed_handler_t handler) noexcept
Set handler for chain-closed event.
actual_type & stop_on(typename basic_t::stop_predicate_t predicate) noexcept
Set user condition for stopping receive operation.
mchain_bulk_processing_params_t(Data data)
Initializing constructor.
mchain_bulk_processing_params_t()=default
Default constructor.
decltype(auto) extract_n(std::size_t v) noexcept
Set limit for count of messages to be extracted.
actual_type & self_reference()
actual_type & empty_timeout(Timeout v) noexcept
Set timeout for waiting on empty chain.
decltype(auto) handle_n(std::size_t v) noexcept
Set limit for count of messages to be handled.
decltype(auto) handle_all() noexcept
actual_type & total_time(Timeout v) noexcept
Set total time for the whole receive operation.
decltype(auto) clone_as_defined() noexcept
Parameters for message chain.
mchain_props::not_empty_notification_func_t m_not_empty_notificator
An optional notificator for 'not_empty' condition.
mchain_params_t(mchain_props::capacity_t capacity)
Initializing constructor.
mchain_params_t & disable_msg_tracing()
Disable message delivery tracing explicitly.
mchain_props::capacity_t m_capacity
Chain's capacity.
mchain_params_t & capacity(mchain_props::capacity_t capacity)
Set chain's capacity and related params.
bool msg_tracing_disabled() const
Is message delivery tracing disabled explicitly?
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.
bool m_msg_tracing_disabled
Is message delivery tracing disabled explicitly?
mchain_params_t & not_empty_notificator(mchain_props::not_empty_notification_func_t notificator)
Set chain's notificator for 'not_empty' condition.
Parameters for defining chain size.
memory_usage_t memory_usage() const
Memory allocation type for size-limited chain.
capacity_t(std::size_t max_size, memory_usage_t memory_usage, overflow_reaction_t overflow_reaction, duration_t overflow_timeout)
Initializing constructor for size-limited message chain.
bool unlimited() const
Is message chain have no size limit?
std::size_t m_max_size
Max size of the chain with limited size.
overflow_reaction_t overflow_reaction() const
Overflow reaction for size-limited chain.
overflow_reaction_t m_overflow_reaction
Type of reaction for chain overflow.
capacity_t()
Default constructor.
bool m_unlimited
Has chain unlimited size?
static capacity_t make_unlimited()
Create capacity description for size-unlimited message chain.
duration_t overflow_timeout() const
Get the value of waiting timeout for overflow case.
static capacity_t make_limited_with_waiting(std::size_t max_size, memory_usage_t memory_usage, overflow_reaction_t overflow_reaction, duration_t wait_timeout)
bool is_overflow_timeout_defined() const
Is waiting timeout for overflow case defined?
static capacity_t make_limited_without_waiting(std::size_t max_size, memory_usage_t memory_usage, overflow_reaction_t overflow_reaction)
memory_usage_t m_memory
Type of the storage for size-limited chain.
duration_t m_overflow_timeout
Timeout for waiting on full chain during 'message push' operation.
std::size_t max_size() const
Max size for size-limited chain.
mchain_bulk_processing_basic_params_t()=default
Default constructor.
void set_on_close(chain_closed_handler_t handler) noexcept
Set handler for chain-closed event.
std::size_t to_handle() const noexcept
Get limit for count of message to be handled.
void set_extract_n(std::size_t v) noexcept
Set limit for count of messages to be extracted.
mchain_bulk_processing_basic_params_t(Basic_Data data)
Initializing constructor.
const mchain_props::duration_t & total_time() const noexcept
Get total time for the whole receive operation.
const stop_predicate_t & stop_on() const noexcept
Get user condition for stopping receive operation.
std::size_t to_extract() const noexcept
Get limit for count of messages to be extracted.
const chain_closed_handler_t & closed_handler() const noexcept
Get handler for chain-closed event.
void set_handle_n(std::size_t v) noexcept
Set limit for count of messages to be handled.
const mchain_props::duration_t & empty_timeout() const noexcept
Get timeout for waiting on empty chain.
void set_total_time(Timeout v) noexcept
Set total time for the whole receive operation.
const auto & so5_data() const noexcept
Access to internal data.
void set_stop_on(stop_predicate_t predicate) noexcept
Set user condition for stopping receive operation.
void set_empty_timeout(Timeout v) noexcept
Set timeout for waiting on empty chain.
Base class for representation of one case in multi chain select.
mchain_receive_params_t(typename base_type::data_type data)
Initializing constructor for the case of cloning.
const mchain_t & chain() const
Chain from which messages must be extracted and handled.
decltype(auto) so5_clone_if_necessary() noexcept
mchain_receive_params_t(mchain_t chain)
Initializing constructor.
A result of receive from mchain.
std::size_t extracted() const noexcept
Count of extracted messages.
std::size_t m_extracted
Count of extracted messages.
mchain_props::extraction_status_t m_status
Extraction status (e.g. no messages, chain closed and so on).
mchain_props::extraction_status_t status() const noexcept
Extraction status (e.g. no messages, chain closed and so on).
std::size_t m_handled
Count of handled messages.
std::size_t handled() const noexcept
Count of handled messages.
mchain_receive_result_t(std::size_t extracted, std::size_t handled, mchain_props::extraction_status_t status) noexcept
Initializing constructor.
mchain_receive_result_t() noexcept
Default constructor.
A result of attempt of sending messages to a message chain.
mchain_props::push_status_t status() const noexcept
Status of send operation.
mchain_props::push_status_t m_status
The status of send operation.
mchain_send_result_t(std::size_t sent, mchain_props::push_status_t status)
Initializing constructor.
mchain_send_result_t() noexcept
Default constructor.
std::size_t m_sent
Count of messages sent.
std::size_t sent() const noexcept
Count of messages sent.
A class for holding an instance of a message.
static message_holder_t make(Args &&...args)
Create a new instance of message_holder with a new message inside.
friend void swap(message_holder_t &a, message_holder_t &b) noexcept
message_holder_t(std::piecewise_construct_t, Args &&...args)
static intrusive_ptr_t< envelope_type > make_msg_instance(Args &&...args)
Create a new instance of message.
any_unspecified_message()
~any_unspecified_message()
An interface of tracer for message delivery tracing.
virtual void reaction_redirect_message(const agent_t *subscriber, const mbox_t &target) const noexcept=0
Message will be redirected to another mbox.
virtual void push_to_queue(const abstract_message_sink_t *sink, const agent_t *sink_owner) const noexcept=0
Execution demand for agent will be pushed to the queue by a sink.
virtual void reaction_transform(const agent_t *subscriber, const mbox_t &target, const std::type_index &msg_type, const message_ref_t &transformed) const noexcept=0
Message will be transformed and redirected.
virtual void reaction_abort_app(const agent_t *subscriber) const noexcept=0
Application will be aborted as result of overlimit.
virtual void reaction_drop_message(const agent_t *subscriber) const noexcept=0
Message will be dropped as result of overlimit.
A base class for agent messages.
message_t(const message_t &other)
virtual void so5_change_mutability(message_mutability_t mutability)
Change message mutabilty flag.
message_t & operator=(message_t &&other) noexcept
friend message_mutability_t message_mutability(const message_t &what) noexcept
Helper method for get message mutability flag.
virtual kind_t so5_message_kind() const noexcept
Detect the kind of the message.
virtual ~message_t() noexcept=default
friend message_kind_t message_kind(const message_t &what)
Helper method for quering kind of the message.
message_t & operator=(const message_t &other)
message_mutability_t m_mutability
Is message mutable or immutable?
friend message_mutability_t message_mutability(const intrusive_ptr_t< message_t > &what) noexcept
Helper method for safe get of message mutability flag.
virtual message_mutability_t so5_message_mutability() const noexcept
Get message mutability flag.
message_t(message_t &&other)
friend void change_message_mutability(message_t &what, message_mutability_t mutability)
Helper method for change message mutability flag.
friend message_kind_t message_kind(const so_5::intrusive_ptr_t< message_t > &what)
Helper method for quering kind of the message.
friend void change_message_mutability(intrusive_ptr_t< message_t > &what, message_mutability_t mutability)
Helper method for safe change message mutability flag.
A message wrapped to be used as type of argument for event handlers.
mhood_t(message_ref_t &mf)
An interface of filter for trace messages.
virtual ~filter_t() noexcept=default
virtual bool filter(const trace_data_t &data) noexcept=0
Filter the current message.
Interface of holder of message tracer and message trace filter objects.
holder_t & operator=(const holder_t &)=delete
virtual tracer_t & tracer() const noexcept=0
Get pointer to the message tracer object.
virtual bool is_msg_tracing_enabled() const noexcept=0
Is message tracing enabled?
virtual ~holder_t() noexcept=default
holder_t(const holder_t &)=delete
virtual filter_shptr_t take_filter() noexcept=0
Get access to the current message trace filter object.
A type of implementation of filters created from lambda function.
filter_from_lambda_t(L lambda)
bool filter(const trace_data_t &data) noexcept override
Filter the current message.
An interface of object for accessing trace details.
virtual optional< std::type_index > msg_type() const noexcept=0
Get the information about message type.
virtual optional< message_or_signal_flag_t > message_or_signal() const noexcept=0
Get message or signal information.
virtual optional< msg_source_t > msg_source() const noexcept=0
Get the information about message source.
virtual ~trace_data_t() noexcept=default
virtual optional< message_instance_info_t > message_instance_info() const noexcept=0
Get message instance information.
virtual optional< compound_action_description_t > compound_action() const noexcept=0
Get the description of a compound action.
virtual optional< const so_5::agent_t * > agent() const noexcept=0
Get a pointer to agent from trace message.
trace_data_t(const trace_data_t &)=delete
virtual optional< current_thread_id_t > tid() const noexcept=0
Get the Thread ID from trace message.
trace_data_t & operator=(const trace_data_t &)=delete
virtual optional< const so_5::impl::event_handler_data_t * > event_handler_data_ptr() const noexcept=0
Get pointer to event handler.
virtual optional< const so_5::abstract_message_sink_t * > message_sink() const noexcept=0
Get a pointer to message_sink from trace message.
Interface of tracer object.
tracer_t & operator=(const tracer_t &)=delete
virtual void trace(const std::string &what) noexcept=0
tracer_t(const tracer_t &)=delete
tracer_t(tracer_t &&)=delete
virtual ~tracer_t() noexcept=default
tracer_t & operator=(tracer_t &&)=delete
Type for holding agent name.
unsigned int m_length
Name length.
name_for_agent_t & operator=(name_for_agent_t &&other) noexcept
name_for_agent_t(const name_for_agent_t &)
name_for_agent_t(name_for_agent_t &&other) noexcept
std::unique_ptr< char[] > m_value
Name storage.
bool has_value() const noexcept
Does this object have a value?
name_for_agent_t & operator=(const name_for_agent_t &)
std::string_view as_string_view() const
Get the value as a string_view.
name_for_agent_t()
Default constructor makes an null value.
operator bool() const noexcept
Does this object have a value?
name_for_agent_t(std::string_view value)
Initializing constructor.
A class for the name which cannot be empty.
nonempty_name_t(std::string name)
Constructor with check for the empty value.
const std::string & query_name() const noexcept
Get the value.
friend void swap(nonempty_name_t &a, nonempty_name_t &b) noexcept
nonempty_name_t(nonempty_name_t &&o) noexcept
std::string giveout_value() noexcept(noexcept(std::string{ std::move(m_nonempty_name) }))
Get the value away from the object.
nonempty_name_t(const char *name)
Constructor with check for the empty value.
nonempty_name_t & operator=(nonempty_name_t &&o) noexcept
nonempty_name_t(const nonempty_name_t &)=delete
nonempty_name_t & operator=(const nonempty_name_t &)=delete
std::string m_nonempty_name
Value.
Helper class for indication of long-lived reference via its type.
outliving_reference_t(T &r) noexcept
outliving_reference_t & operator=(outliving_reference_t const &o)=delete
outliving_reference_t(outliving_reference_t< U > const &o) noexcept
outliving_reference_t(T &&)=delete
outliving_reference_t(outliving_reference_t const &o) noexcept
Wrapper around a pointer to partially constructed agent.
partially_constructed_agent_ptr_t(agent_t *ptr)
agent_t * ptr() const noexcept
An implementation of backoff object using assembly instruction.
Special container for holding receive parameters and receive cases.
prepared_receive_t(const prepared_receive_t &)=delete
prepared_receive_t(prepared_receive_t &&other)
Move constructor.
mchain_receive_params_t< mchain_props::msg_count_status_t::defined > m_params
Parameters for receive.
prepared_receive_t & operator=(const prepared_receive_t &)=delete
friend void swap(prepared_receive_t &a, prepared_receive_t &b) noexcept
Swap operation.
so_5::details::handlers_bunch_t< Handlers_Count > m_bunch
Cases for receive.
prepared_receive_t(mchain_receive_params_t< mchain_props::msg_count_status_t::defined > params, Handlers &&... cases)
Initializing constructor.
const auto & handlers() const noexcept
const auto & params() const noexcept
prepared_receive_t & operator=(prepared_receive_t &&other) noexcept
Move operator.
A base class for manager of default locks for event queues.
virtual ~queue_locks_defaults_manager_t() noexcept=default
virtual so_5::disp::mpsc_queue_traits::lock_factory_t mpsc_queue_lock_factory()=0
Get default lock_factory for MPSC queues.
queue_locks_defaults_manager_t & operator=(queue_locks_defaults_manager_t &&)=delete
virtual so_5::disp::mpmc_queue_traits::lock_factory_t mpmc_queue_lock_factory()=0
Get default lock_factory for MPMC queues.
queue_locks_defaults_manager_t & operator=(const queue_locks_defaults_manager_t &)=delete
queue_locks_defaults_manager_t(queue_locks_defaults_manager_t &&)=delete
queue_locks_defaults_manager_t()=default
queue_locks_defaults_manager_t(const queue_locks_defaults_manager_t &)=delete
Scoped guard for shared locks.
read_lock_guard_t(const read_lock_guard_t &)=delete
read_lock_guard_t & operator=(const read_lock_guard_t &)=delete
read_lock_guard_t(Lock &l)
A simple multi-readers/single-writer spinlock (analog of std::shared_mutex).
void lock()
Lock object in exclusive mode.
static constexpr const std::uint_fast32_t unlocked
void unlock()
Unlock object locked in exclusive mode.
void unlock_shared()
Unlock object locked in shared mode.
std::atomic_uint_fast32_t m_counters
void lock_shared()
Lock object in shared mode.
static constexpr const std::uint_fast32_t write_lock
static constexpr const std::uint_fast32_t read_lock
rw_spinlock_t & operator=(const rw_spinlock_t &)=delete
rw_spinlock_t(const rw_spinlock_t &)=delete
A base class for agent signals.
signal_t(const signal_t &)=delete
signal_t(signal_t &&)=delete
signal_t & operator=(signal_t &&)=delete
kind_t so5_message_kind() const noexcept override
Detect the kind of the message.
signal_t & operator=(const signal_t &)=delete
~signal_t() noexcept override=default
abstract_message_sink_t & sink() noexcept override
Get a reference to the underlying message sink.
simple_sink_owner_t(Args &&...args)
Initializing constructor.
const abstract_message_sink_t & sink() const noexcept override
Get a const reference to the underlying message sink.
A simple spinlock (analog of std::mutex).
void unlock()
Unlock object.
spinlock_t(const spinlock_t &)=delete
std::atomic_bool m_flag
Atomic flag which is used as actual lock.
spinlock_t & operator=(spinlock_t &&)=delete
spinlock_t & operator=(const spinlock_t &)=delete
spinlock_t(spinlock_t &&)=delete
bool is_target(const agent_t *agent) const noexcept
Is agent owner of this state?
state_t & time_limit(duration_t timeout, const state_t &state_to_switch)
Set up a time limit for the state.
std::enable_if< details::is_agent_method_pointer< details::method_arity::nullary, Method_Pointer >::value, state_t & >::type on_enter(Method_Pointer pfn)
Set on enter handler.
bool has_subscription(const mbox_t &from, Method_Pointer &&pfn) const
Check the presence of a subscription.
const state_t & just_switch_to(mbox_t from, const state_t &target_state) const
Define handler which only switches agent to the specified state.
state_t & drop_time_limit()
Drop time limit for the state if defined.
on_exit_handler_t m_on_exit
Handler for the exit from the state.
const state_t & suppress(mbox_t from) const
Suppress processing of event in this state.
state_t & transfer_to_state(mbox_t from, const state_t &target_state)
An instruction for switching agent to the specified state and transfering event proceessing to new st...
history_t m_state_history
Type of state history.
const state_t * parent_state() const noexcept
Get a parent state if exists.
void fill_path(path_t &path) const noexcept
A helper method for building a path from top-level state to this state.
state_t(substate_of parent, history_t state_history)
Constructor for the case when state is a substate of some parent state.
state_t & on_exit(on_exit_handler_t handler)
Set on exit handler.
state_t(initial_substate_of parent, std::string state_name, history_t state_history)
Constructor for the case when state is the initial substate of some parent state.
state_t(substate_of parent)
Constructor for the case when state is a substate of some parent state.
state_t & just_switch_to(mbox_t from, const state_t &target_state)
Define handler which only switches agent to the specified state.
std::size_t nested_level() const noexcept
Query nested level for the state.
bool is_active() const noexcept
Is this state or any of its substates activated?
state_t(state_t &&other)
Move constructor.
state_t(agent_t *target_agent, std::string state_name, state_t *parent_state, std::size_t nested_level, history_t state_history)
Fully initialized constructor.
const state_t & subscribe_message_handler(const mbox_t &from, Args &&... args) const
A helper for handle-methods implementation.
const state_t & event(Args &&... args) const
Helper for subscription of event handler in this state.
std::enable_if< details::is_agent_method_pointer< details::method_arity::nullary, Method_Pointer >::value, state_t & >::type on_exit(Method_Pointer pfn)
Set on exit handler.
const state_t & suppress() const
Suppress processing of event in this state.
std::string m_state_name
State name.
state_t(agent_t *agent, std::string state_name, history_t state_history)
bool has_subscription(const mbox_t &from) const
Check the presence of a subscription.
state_t * m_parent_state
Parent state.
state_t(substate_of parent, std::string state_name, history_t state_history)
Constructor for the case when state is a substate of some parent state.
const state_t * actual_state_to_enter() const
Find actual state to be activated for agent.
void drop_subscription(const mbox_t &from, Method_Pointer &&pfn) const
Drop subscription.
state_t & on_enter(on_enter_handler_t handler)
Set on enter handler.
state_t(initial_substate_of parent)
Constructor for the case when state is the initial substate of some parent state.
state_t & transfer_to_state(const state_t &target_state)
An instruction for switching agent to the specified state and transfering event proceessing to new st...
const state_t * m_initial_substate
The initial substate.
bool operator==(const state_t &state) const noexcept
void clear_history() noexcept
Clear state history.
state_t(initial_substate_of parent, std::string state_name)
Constructor for the case when state is the initial substate of some parent state.
state_t & event(mbox_t from, Args &&... args)
const state_t & just_switch_to(const state_t &target_state) const
Define handler which only switches agent to the specified state.
size_t m_substate_count
Number of substates.
state_t(agent_t *agent, history_t state_history)
const on_exit_handler_t & on_exit() const
Query on enter handler.
void call_on_enter() const noexcept
Call for on enter handler if defined.
bool operator!=(const state_t &state) const noexcept
void call_on_exit() const noexcept
Call for on exit handler if defined.
agent_t *const m_target_agent
Owner of this state.
const state_t & transfer_to_state(mbox_t from, const state_t &target_state) const
An instruction for switching agent to the specified state and transfering event proceessing to new st...
std::string query_name() const
Get textual name of the state.
state_t & operator=(const state_t &)=delete
const state_t & transfer_to_state(const state_t &target_state) const
An instruction for switching agent to the specified state and transfering event proceessing to new st...
static constexpr const std::size_t max_deep
Max deep of nested states.
state_t(substate_of parent, std::string state_name)
Constructor for the case when state is a substate of some parent state.
const state_t * m_last_active_substate
Last active substate.
void handle_time_limit_on_enter() const
A special handler of time limit to be used on entering into state.
state_t(agent_t *agent, std::string state_name)
state_t & suppress(mbox_t from)
Suppress processing of event in this state.
state_t(const state_t &)=delete
const state_t & event(mbox_t from, Args &&... args) const
Helper for subscription of event handler in this state.
void activate() const
Switch agent to that state.
void drop_subscription(const mbox_t &from) const
Drop subscription.
history_t
Type of history for state.
@ none
State has no history.
@ deep
State has deep history.
@ shallow
State has shallow history.
on_enter_handler_t m_on_enter
Handler for the enter to the state.
const on_enter_handler_t & on_enter() const
Query on enter handler.
state_t & event(Args &&... args)
std::unique_ptr< time_limit_t > m_time_limit
A definition of time limit for the state.
state_t & suppress()
Suppress processing of event in this state.
std::size_t m_nested_level
Nesting level for state.
void update_history_in_parent_states() const
A helper method which is used during state change for update state with history.
void handle_time_limit_on_exit() const
A special handler of time limit to be used on exiting from state.
state_t & just_switch_to(const state_t &target_state)
Define handler which only switches agent to the specified state.
state_t(initial_substate_of parent, history_t state_history)
Constructor for the case when state is the initial substate of some parent state.
A holder for data-souce that should be automatically registered and deregistered in registry.
outliving_reference_t< repository_t > m_repo
Repository for data source.
auto_registered_source_holder_t(outliving_reference_t< repository_t > repo, Args &&...args)
Initializing constructor.
Data_Source m_ds
Data source itself.
~auto_registered_source_holder_t() noexcept
const Data_Source & get() const noexcept
auto_registered_source_holder_t(const auto_registered_source_holder_t &)=delete
auto_registered_source_holder_t(auto_registered_source_holder_t &&)=delete
Data_Source & get() noexcept
A public interface for control SObjectizer monitoring options.
static std::chrono::steady_clock::duration default_distribution_period()
Default distribution period.
controller_t & operator=(const controller_t &)=delete
virtual void turn_on()=0
Turn the monitoring on.
controller_t(const controller_t &)=delete
virtual std::chrono::steady_clock::duration set_distribution_period(std::chrono::steady_clock::duration period)=0
Set distribution period.
controller_t & operator=(controller_t &&)=delete
controller_t(controller_t &&)=delete
virtual void turn_off()=0
Turn the monitoring off.
virtual const mbox_t & mbox() const =0
Get the mbox for receiving monitoring information.
An addition to auto_registered_source_holder for the cases where manual registration of data_source s...
manually_registered_source_holder_t(Args &&...args)
Initializing constructor.
Data_Source & get() noexcept
Data_Source m_ds
Data source itself.
~manually_registered_source_holder_t() noexcept
void start(outliving_reference_t< repository_t > repo)
manually_registered_source_holder_t(const manually_registered_source_holder_t &)=delete
const Data_Source & get() const noexcept
repository_t * m_repo
Repository for data source.
manually_registered_source_holder_t(manually_registered_source_holder_t &&)=delete
An interface of data sources repository.
virtual void remove(source_t &what) noexcept=0
Deregistration of previously registered data source.
repository_t(repository_t &&)=delete
virtual void add(source_t &what)=0
Registration of new data source.
virtual ~repository_t() noexcept=default
static source_t * source_list_next(const source_t &what) noexcept
Helper method for accessing next data source in the list.
static void source_list_add(source_t &what, source_t *&head, source_t *&tail) noexcept
Helper method for adding data source to existing list.
static void source_list_remove(source_t &what, source_t *&head, source_t *&tail) noexcept
Helper method for removing data source from existing list.
repository_t(const repository_t &)=delete
repository_t & operator=(const repository_t &)=delete
repository_t & operator=(repository_t &&)=delete
An interface of data source.
virtual ~source_t() noexcept=default
source_t * m_prev
Previous item in the data sources list.
virtual void distribute(const mbox_t &)=0
Send appropriate notification about the current value.
source_t & operator=(source_t &&)=delete
source_t * m_next
Next item in the data sources list.
source_t & operator=(const source_t &)=delete
source_t(source_t &&)=delete
source_t(const source_t &)=delete
An interface of stop_guard entity.
setup_result_t
Type for result of setting up a new stop_guard.
@ ok
New stop_guard has be set successfully.
@ stop_already_in_progress
virtual void stop() noexcept=0
Perform stop-related actions.
stop_guard_t & operator=(stop_guard_t &&)=delete
stop_guard_t & operator=(const stop_guard_t &)=delete
what_if_stop_in_progress_t
@ throw_exception
An exception must be thrown.
@ return_negative_result
Return negative setup result.
stop_guard_t(const stop_guard_t &)=delete
stop_guard_t(stop_guard_t &&)=delete
virtual ~stop_guard_t() noexcept=default
A class for creating a subscription to messages from the mbox.
std::enable_if< details::lambda_traits::is_lambda< Lambda >::value, subscription_bind_t & >::type event(Lambda &&lambda, thread_safety_t thread_safety=not_thread_safe)
Make subscription to the message by lambda-function.
std::enable_if< details::is_agent_method_pointer< details::method_arity::unary, Method_Pointer >::value, subscription_bind_t & >::type event(Method_Pointer pfn, thread_safety_t thread_safety=not_thread_safe)
Make subscription to the message.
std::vector< const state_t * > state_vector_t
Type of vector of states.
mbox_t m_mbox_ref
Mbox for messages to subscribe.
subscription_bind_t & just_switch_to(const state_t &target_state)
Define handler which only switches agent to the specified state.
void create_subscription_for_states(const std::type_index &msg_type, const event_handler_method_t &method, thread_safety_t thread_safety, event_handler_kind_t handler_kind) const
Create subscription of event for all states.
subscription_bind_t(agent_t &agent, const mbox_t &mbox_ref)
subscription_bind_t & in(const state_t &state)
Set up a state in which events are allowed be processed.
subscription_bind_t & suppress()
Suppress processing of event in this state.
subscription_bind_t & transfer_to_state(const state_t &target_state)
An instruction for switching agent to the specified state and transfering event proceessing to new st...
state_vector_t m_states
States of agents the event to be subscribed in.
void ensure_handler_can_be_used_with_mbox(const so_5::details::msg_type_and_handler_pair_t &handler) const
Additional check for subscription to a mutable message from MPMC mbox.
agent_t * m_agent
Agent to which we are subscribing.
An indentificator for the timer.
timer_id_t() noexcept=default
Default constructor.
void release() noexcept
Release the timer event.
timer_id_t(so_5::intrusive_ptr_t< timer_t > &&timer) noexcept
Initializing constructor.
friend void swap(timer_id_t &a, timer_id_t &b) noexcept
Swapping.
bool is_active() const noexcept
Is this timer event is active?
so_5::intrusive_ptr_t< timer_t > m_timer
Actual timer.
An interface for collector of elapsed timers.
elapsed_timers_collector_t() noexcept=default
elapsed_timers_collector_t & operator=(const elapsed_timers_collector_t &)=delete
elapsed_timers_collector_t(const elapsed_timers_collector_t &)=delete
virtual void accept(std::type_index type_index, mbox_t mbox, message_ref_t msg)=0
Accept and store info about elapsed timer.
virtual ~elapsed_timers_collector_t() noexcept=default
virtual void schedule_anonymous(const std::type_index &type_index, const mbox_t &mbox, const message_ref_t &msg, std::chrono::steady_clock::duration pause, std::chrono::steady_clock::duration period)=0
Push anonymous delayed/periodic message to the timer queue.
virtual std::chrono::steady_clock::duration timeout_before_nearest_timer(std::chrono::steady_clock::duration default_timer)=0
Calculate time before the nearest timer (if any).
virtual void process_expired_timers()=0
Translation of expired timers into message sends.
virtual ~timer_manager_t() noexcept=default
virtual timer_id_t schedule(const std::type_index &type_index, const mbox_t &mbox, const message_ref_t &msg, std::chrono::steady_clock::duration pause, std::chrono::steady_clock::duration period)=0
Push delayed/periodic message to the timer queue.
timer_manager_t() noexcept=default
virtual timer_thread_stats_t query_stats()=0
Get statistics for run-time monitoring.
timer_manager_t(const timer_manager_t &)=delete
timer_manager_t & operator=(const timer_manager_t &)=delete
A base class for timer identificator.
virtual ~timer_t() noexcept=default
virtual void release() noexcept=0
Release the timer event.
virtual bool is_active() const noexcept=0
Is this timer event is active?
virtual void finish()=0
Finish timer and wait for full stop.
virtual void schedule_anonymous(const std::type_index &type_index, const mbox_t &mbox, const message_ref_t &msg, std::chrono::steady_clock::duration pause, std::chrono::steady_clock::duration period)=0
Push anonymous delayed/periodic message to the timer queue.
virtual timer_thread_stats_t query_stats()=0
Get statistics for run-time monitoring.
timer_thread_t & operator=(const timer_thread_t &)=delete
virtual void start()=0
Launch timer.
timer_thread_t(const timer_thread_t &)=delete
virtual ~timer_thread_t()=default
virtual timer_id_t schedule(const std::type_index &type_index, const mbox_t &mbox, const message_ref_t &msg, std::chrono::steady_clock::duration pause, std::chrono::steady_clock::duration period)=0
Push delayed/periodic message to the timer queue.
An implementation of backoff object with usage of std::yield.
#define SO_5_LOG_ERROR(logger, var_name)
A special macro for helping error logging.
#define SO_5_LOG_ERROR_IMPL(logger, file, line, var_name)
An implementation for SO_5_LOG_ERROR macro.
#define SO_5_THROW_EXCEPTION_IMPL(file, line, error_code, desc)
#define SO_5_THROW_EXCEPTION(error_code, desc)
demand_handler_pfn_t select_demand_handler_for_message(const agent_t &agent, const message_ref_t &msg)
A helper function to select actual demand handler in dependency of message kind.
mbox_t make_direct_mbox_with_respect_to_custom_factory(partially_constructed_agent_ptr_t agent_ptr, const agent_tuning_options_t &tuning_options, mbox_t standard_mbox)
Helper for creation of the direct mbox for an agent.
unsigned int ensure_valid_agent_name_length(std::size_t length)
std::string create_anonymous_state_name(const agent_t *agent, const state_t *st)
const state_t deadletter_state(nullptr, "<DEADLETTER_STATE>")
A special object to be used as state for make subscriptions for deadletter handlers.
subscription_storage_factory_t detect_subscription_storage_factory_to_use(environment_t &env, const agent_tuning_options_t &tuning_options)
Helper for selection of subscription storage factory.
const state_t awaiting_deregistration_state(nullptr, "<AWAITING_DEREGISTRATION_AFTER_UNHANDLED_EXCEPTION>")
A special object for the state in which agent is awaiting for deregistration after unhandled exceptio...
Enumeration of cooperation deregistration reasons.
const int unknown_error
Deregistration because of unknown error.
const int user_defined_reason
A starting point for user-defined reasons.
const int parent_deregistration
Deregistration because parent cooperation deregistration.
const int undefined
Reason is not properly defined.
const int unhandled_exception
Deregistration because of unhandled exception.
const int normal
Normal deregistration.
const int shutdown
Deregistration because SObjectizer Environment shutdown.
constexpr method_noexceptness_t noexcept_method
constexpr method_noexceptness_t not_noexcept_method
Various helpers for event subscription.
Agent * get_actual_agent_pointer(agent_t &agent)
Get actual agent pointer.
std::enable_if< is_agent_method_pointer< method_arity::unary, Method_Pointer >::value, msg_type_and_handler_pair_t >::type make_handler_with_arg_for_agent(Agent *agent, Method_Pointer pfn)
Helper template for creation of event handler with actual argument.
details::msg_type_and_handler_pair_t make_handler_from_lambda_of_free_function(Lambda &&lambda)
A function for creation event handler.
msg_type_and_handler_pair_t make_handler_with_arg(Handler_Type lambda)
Helper template for creation of event handler with actual argument.
void ensure_handler_can_be_used_with_mbox(const ::so_5::details::msg_type_and_handler_pair_t &handler, const ::so_5::mbox_t &target_mbox)
Ensure that mutability of message is compatible with mutability of target mbox.
Helpers for manipulation with standard C++ I/O streams.
Internal implementation details.
Helper templates for detection of lambda-type traits.
M * get_ptr(const intrusive_ptr_t< user_type_message_t< M > > &msg) noexcept
A helper function to get a const raw pointer from smart pointer.
M * get_ptr(const intrusive_ptr_t< M > &msg) noexcept
A helper function to get a const raw pointer from smart pointer.
Implementation details for implementation of rollback on exception helper.
Some reusable and low-level classes/functions which can be used in public header files.
auto make_message_instance(Args &&... args) -> std::unique_ptr< typename message_payload_type< Msg >::envelope_type >
A helper for allocate instance of a message.
mhood_type_t
A special selector for mhood_t implementations.
@ classical_signal
Message type is a classical signal derived from so_5::signal_t.
@ classical_message
Message type is a classical message derived from so_5::message_t.
@ user_type_message
Message type is not related to so_5::message_t.
void abort_on_fatal_error(L logging_lambda) noexcept
void fill_handlers_bunch(Bunch &bunch, std::size_t index, Lambda &&lambda, Others &&... other_handlers)
auto do_with_rollback_on_exception(Main_Action main_action, Rollback_Action rollback_action) -> decltype(main_action())
Helper function for do some action with rollback in the case of an exception.
void fill_handlers_bunch(Bunch &bunch, std::size_t index, msg_type_and_handler_pair_t &&handler, Others &&... other_handlers)
void fill_handlers_bunch(Bunch &bunch, std::size_t)
auto invoke_noexcept_code(L lambda) noexcept -> decltype(lambda())
method_arity
A special enumeration to specify arity of lambda-function or method.
@ nullary
Method or function has no arguments.
@ unary
Method or function has just one argument.
scope_exit_details::at_exit_t< L > at_scope_exit(L &&l)
Helper function for creation action to be performed at scope exit.
Various stuff related to MPMC event queue implementation and tuning.
std::chrono::high_resolution_clock::duration default_combined_lock_waiting_time()
Default timeout used by combined_lock for waiting on spinlock before switching to mutex-based locking...
SO_5_FUNC lock_factory_t combined_lock_factory(std::chrono::high_resolution_clock::duration waiting_time)
Factory for creation of combined queue lock with the specified waiting time.
lock_factory_t combined_lock_factory()
Factory for creation of combined queue lock with default waiting time.
SO_5_FUNC lock_factory_t simple_lock_factory()
Factory for creation of very simple implementation based on usage of mutex and condition_variable onl...
Various stuff related to MPSC event queue implementation and tuning.
lock_factory_t combined_lock_factory()
Factory for creation of combined queue lock with default waiting time.
SO_5_FUNC lock_factory_t simple_lock_factory()
Factory for creation of very simple implementation based on usage of mutex and condition_variable onl...
SO_5_FUNC lock_factory_t combined_lock_factory(std::chrono::high_resolution_clock::duration waiting_time)
Factory for creation of combined queue lock with the specified waiting time.
std::chrono::high_resolution_clock::duration default_combined_lock_waiting_time()
Default timeout used by combined_lock for waiting on spinlock before switching to mutex-based locking...
Dispatcher with single working thread.
Reusable components for dispatchers.
SO_5_FUNC abstract_work_thread_factory_shptr_t make_std_work_thread_factory()
Get a standard SObjectizer's work thread factory that is used by default.
envelope_t & message_to_envelope(const message_ref_t &src_msg)
A helper function for casting message instance to envelope instance.
SO_5_FUNC optional< message_ref_t > message_to_be_inspected(const message_ref_t &msg_or_envelope)
Helper function for extraction of a payload from enveloped message.
SO_5_FUNC optional< payload_info_t > extract_payload_for_message_transformation(const message_ref_t &envelope)
Helper function for extraction of a payload from enveloped message.
access_context_t
Information about context on that enveloped message is handled.
Internal namespace with details of agent_t implementation.
std::tuple< so_5::message_limit::description_container_t, std::optional< so_5::message_limit::description_t > > prepare(so_5::message_limit::description_container_t original_descriptions)
void append_dummy_limit_for_state_timeout_msg(so_5::message_limit::description_container_t &original_descriptions)
Check presence of limit for msg_state_timeout and add it of there is no such a limit.
Low-level details of message delivery tracing implementation.
void make_trace_to_1(std::ostream &s, const agent_t *agent)
void fill_trace_data_1(actual_trace_data_t &d, current_thread_id_t tid)
void make_trace_to_1(std::ostream &s, const redirection_deep limit)
void fill_trace_data_1(actual_trace_data_t &d, mbox_identification id)
void fill_trace_data_1(actual_trace_data_t &d, const original_msg_type msg_type)
void make_trace_to_1(std::ostream &s, current_thread_id_t tid)
void make_trace_to_1(std::ostream &s, const type_of_removed_msg msg_type)
void make_trace(so_5::msg_tracing::holder_t &msg_tracing_stuff, Args &&... args) noexcept
void make_trace_to_1(std::ostream &s, const so_5::message_limit::control_block_t *limit)
void make_trace_to_1(std::ostream &s, const abstract_message_sink_t *sink)
void make_trace_to_1(std::ostream &s, const composed_action_name name)
void fill_trace_data_1(actual_trace_data_t &d, const event_handler_data_t *handler)
void fill_trace_data_1(actual_trace_data_t &, message_delivery_mode_t)
void make_trace_to_1(std::ostream &s, const mbox_as_msg_destination mbox)
void fill_trace_data_1(actual_trace_data_t &, const so_5::message_limit::control_block_t *)
void make_trace_to_1(std::ostream &s, mbox_identification id)
void fill_trace_data_1(actual_trace_data_t &d, const agent_t *agent)
void make_trace_to_1(std::ostream &s, message_delivery_mode_t mode)
void fill_trace_data_1(actual_trace_data_t &, const mbox_as_msg_destination &)
void make_trace_to_1(std::ostream &s, mchain_identification id)
void fill_trace_data(actual_trace_data_t &)
void fill_trace_data_1(actual_trace_data_t &d, const abstract_message_chain_t &chain)
void make_trace_to_1(std::ostream &s, const original_msg_type msg_type)
void fill_trace_data_1(actual_trace_data_t &d, const mbox_as_msg_source &mbox)
void fill_trace_data_1(actual_trace_data_t &, chain_size)
void fill_trace_data_1(actual_trace_data_t &, const type_of_transformed_msg)
void fill_trace_data_1(actual_trace_data_t &d, const composed_action_name name)
void fill_trace_data_1(actual_trace_data_t &d, const message_ref_t &message)
void fill_trace_data(actual_trace_data_t &d, A &&a, Other &&... other)
void make_trace_to_1(std::ostream &s, const abstract_message_chain_t &chain)
void fill_trace_data_1(actual_trace_data_t &, const text_separator)
void fill_trace_data_1(actual_trace_data_t &d, mchain_identification id)
void make_trace_to_1(std::ostream &s, const type_of_transformed_msg msg_type)
void make_trace_to_1(std::ostream &s, const mbox_as_msg_source mbox)
void make_trace_to_1(std::ostream &s, const state_t *state)
void make_trace_to(std::ostream &s, A &&a, Other &&... other)
void make_trace_to_1(std::ostream &s, const event_handler_data_t *handler)
void make_trace_to(std::ostream &)
void make_trace_to_1(std::ostream &s, chain_size size)
void make_trace_to_1(std::ostream &s, const text_separator text)
void fill_trace_data_1(actual_trace_data_t &d, const abstract_message_sink_t *sink)
void fill_trace_data_1(actual_trace_data_t &, const type_of_removed_msg)
void fill_trace_data_1(actual_trace_data_t &, const state_t *)
void make_trace_to_1(std::ostream &s, const message_ref_t &message)
void fill_trace_data_1(actual_trace_data_t &, const redirection_deep)
Various helpers for message delivery tracing mechanism.
void safe_trace_state_leaving(const agent_t &state_owner, const state_t &state)
Helper for tracing the fact of leaving a state.
void safe_trace_state_entering(const agent_t &state_owner, const state_t &state)
Helper for tracing the fact of entering into a state.
void trace_deadletter_handler_search_result(const execution_demand_t &demand, const char *context_marker, const event_handler_data_t *search_result)
Helper for tracing the result of search of deadletter handler.
void trace_event_handler_search_result(const execution_demand_t &demand, const char *context_marker, const event_handler_data_t *search_result)
Helper for tracing the result of event handler search.
Details of SObjectizer run-time implementations.
so_5::disp::mpsc_queue_traits::lock_factory_t default_lock_factory(environment_t &env, const so_5::disp::mpsc_queue_traits::lock_factory_t &)
Helper function to be used for extraction of lock_factory for MPSC queues.
void process_unhandled_unknown_exception(current_thread_id_t working_thread_id, agent_t &a_exception_producer) noexcept
Processor of unhandled exception of unknown type from agent's event handler.
so_5::disp::mpmc_queue_traits::lock_factory_t default_lock_factory(environment_t &env, const so_5::disp::mpmc_queue_traits::lock_factory_t &)
Helper function to be used for extraction of lock_factory for MPSC queues.
void process_unhandled_exception(current_thread_id_t working_thread_id, const std::exception &ex, agent_t &a_exception_producer) noexcept
Processor of unhandled exception from agent's event handler.
static std::unique_ptr< sinks_storage_t > create_sinks_storage_if_necessary(partially_constructed_agent_ptr_t owner_ptr, so_5::message_limit::description_container_t &&descriptions)
Create info_storage object if there are some message limits.
void wrap_init_fn_call(Init_Fn init_fn)
A special wrapper for calling init function.
timer_thread_unique_ptr_t create_appropriate_timer_thread(error_logger_shptr_t error_logger, const timer_thread_factory_t &user_factory)
Helper function for timer_thread creation.
Implementation details of error_logging facility.
so_5::timer_id_t schedule_timer(const std::type_index &subscription_type, message_ref_t msg, const mbox_t &mbox, std::chrono::steady_clock::duration pause, std::chrono::steady_clock::duration period)
Schedule periodic timer event.
void ensure_not_null(const delivery_filter_unique_ptr_t &ptr)
Helper function that throws if a pointer to delivery_filter is null.
void single_timer(const std::type_index &subscription_type, message_ref_t msg, const mbox_t &mbox, std::chrono::steady_clock::duration pause)
Schedule single timer event.
void deliver_message(message_delivery_mode_t delivery_mode, abstract_message_box_t &target, std::type_index subscription_type, message_ref_t msg)
Deliver message.
coop_shptr_t to_shptr_noexcept(const coop_handle_t &) noexcept
A helper function for unsafe extraction of shared_ptr to coop from coop_handle instance.
void deliver_signal(message_delivery_mode_t delivery_mode, abstract_message_box_t &target)
Deliver signal.
void deliver_message(message_delivery_mode_t delivery_mode, abstract_message_box_t &target, std::type_index subscription_type, std::unique_ptr< Message > msg)
Deliver message.
coop_shptr_t to_shptr(const coop_handle_t &)
A helper function for safe extraction of shared_ptr to coop from coop_handle instance.
bool is_infinite_wait_timevalue(duration_t v)
Is time value means 'infinite_wait'?
bool is_no_wait_timevalue(duration_t v)
Is time value means 'no_wait'?
mchain_receive_result_t receive_without_total_time(const mchain_receive_params_t< msg_count_status_t::defined > ¶ms, const Bunch &bunch)
An implementation of advanced receive when there is no limit for total operation time is defined.
duration_t actual_timeout(no_wait_indication)
Helper function for detection of actual value for waiting timeout.
duration_t actual_timeout(V value)
Helper function for detection of actual value for waiting timeout.
mchain_receive_result_t receive_with_finite_total_time(const mchain_receive_params_t< msg_count_status_t::defined > ¶ms, const Bunch &bunch)
An implementation of advanced receive when a limit for total operation time is defined.
duration_t infinite_wait_special_timevalue()
Special value of duration to indicate 'infinite_wait' case.
mchain_receive_result_t perform_receive(const mchain_receive_params_t< msg_count_status_t::defined > ¶ms, const Bunch &bunch)
An implementation of main receive actions.
duration_t no_wait_special_timevalue()
Special value of duration to indicate 'no_wait' case.
duration_t actual_timeout(infinite_wait_indication)
Helper function for detection of actual value for waiting timeout.
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.
@ abort_app
Application must be aborted.
@ throw_exception
An exception must be thrown.
msg_count_status_t
Status of limit for messages to be extracted/handled during a bulk operation on a mchain.
@ undefined
Message count limit is not set yet.
@ defined
Message count limit is set.
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.
@ not_stored
Message wasn't stored.
@ 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.
@ preallocated
Storage must be preallocated once and doesn't change after that.
@ dynamic
Storage can be allocated and deallocated dynamically.
Internal implementation of message limits related stuff.
action_t make_action_for_message_transformer(Lambda &&transformator)
Helper function to make an action that performs message transformation.
SO_5_FUNC void redirect_reaction(const overlimit_context_t &ctx, const mbox_t &to)
Actual implementation of redirect message reaction.
SO_5_FUNC void abort_app_reaction(const overlimit_context_t &ctx)
Actual implementation of abort application reaction.
SO_5_FUNC void drop_message_reaction(const overlimit_context_t &ctx)
Actual implementation of drop message reaction.
action_t make_action_for_signal_transformer(Lambda &&transformator)
Helper function to make an action that performs signal transformation.
SO_5_FUNC void transform_reaction(const overlimit_context_t &ctx, const mbox_t &to, const std::type_index &msg_type, const message_ref_t &message)
Actual implementation of transform reaction.
All stuff related to message limits.
void accept_one_indicator(description_container_t &to, const log_then_abort_app_indicator_t< M, L > &indicator)
Helper function for accepting log_then_abort_app_indicator and storing the corresponding description ...
void accept_indicators(description_container_t &)
void accept_indicators(description_container_t &to, I &&indicator, Args &&... others)
Helper function for constructing limits description from a series of limit indicators.
void accept_one_indicator(description_container_t &to, const drop_indicator_t< M > &indicator)
Helper function for accepting drop_indicator and storing the corresponding description into the limit...
void accept_one_indicator(description_container_t &to, transform_indicator_t< M > indicator)
Helper function for accepting transform_indicator and storing the corresponding description into the ...
void accept_one_indicator(description_container_t &to, const abort_app_indicator_t< M > &indicator)
Helper function for accepting abort_app_indicator and storing the corresponding description into the ...
void accept_one_indicator(description_container_t &to, redirect_indicator_t< Msg, Lambda > indicator)
Helper function for accepting redirect_indicator and storing the corresponding description into the l...
Implementation details of message delivery tracing mechanism.
Public part of message delivery tracing mechanism.
SO_5_FUNC tracer_unique_ptr_t std_cerr_tracer()
Factory for tracer which uses std::cerr stream.
SO_5_FUNC tracer_unique_ptr_t std_clog_tracer()
Factory for tracer which uses std::clog stream.
filter_shptr_t make_enable_all_filter()
A helper function for creation of filter that enables all messages.
SO_5_FUNC tracer_unique_ptr_t std_cout_tracer()
Factory for tracer which uses std::cout stream.
message_or_signal_flag_t
A flag for message/signal dichotomy.
filter_shptr_t no_filter()
A helper function to be used when it is necessary to remove msg_tracing's filter.
msg_source_type_t
Type of message source.
@ mchain
The source is a mchain.
@ mbox
The source is a mbox.
filter_shptr_t make_filter(L &&lambda)
A helper function for creation of new filter from lambda-function.
filter_shptr_t make_disable_all_filter()
A helper function for creation of filter that disables all messages.
status_t
Status of message delivery tracing.
@ disabled
Message delivery tracing is disabled.
@ enabled
Message delivery tracing is enabled.
Helpers for working with priorities.
void for_each_priority(Lambda l)
Does enumeration of all priorities.
priority_t prev(priority_t p)
Get the previous priority value.
bool has_prev(priority_t p)
Is there lower priority?
const priority_t default_priority
Default priority value.
priority_t next(priority_t p)
Get the next priority value.
bool has_next(priority_t p)
Is there higher priority?
const unsigned int total_priorities_count
Total count of priorities.
Implementation details for send-family and request_future/value helper functions.
so_5::environment_t & arg_to_env(const so_5::mchain_t &chain)
const so_5::mbox_t & arg_to_mbox(const so_5::agent_t &agent)
const so_5::mbox_t & arg_to_mbox(const so_5::mbox_t &mbox)
so_5::environment_t & arg_to_env(const so_5::mbox_t &mbox)
so_5::environment_t & arg_to_env(const so_5::agent_t &agent)
so_5::mbox_t arg_to_mbox(const so_5::mchain_t &chain)
All stuff related to run-time monitoring and statistics.
Private part of message limit implementation.
std::size_t to_size_t(priority_t priority)
Helper function for conversion from priority to size_t.
const int rc_nullptr_as_result_of_user_mbox_factory
nullptr returned by user-provided mbox factory.
event_queue_hook_unique_ptr_t make_event_queue_hook(event_queue_hook_deleter_fnptr_t deleter, Args &&...args)
Helper function for simplify creation of event_queue_hook object.
SO_5_FUNC queue_locks_defaults_manager_unique_ptr_t make_defaults_manager_for_combined_locks()
A factory for queue_locks_defaults_manager with generators for combined locks.
SO_5_FUNC timer_manager_unique_ptr_t create_timer_heap_manager(error_logger_shptr_t logger, outliving_reference_t< timer_manager_t::elapsed_timers_collector_t > collector, std::size_t initial_heap_capacity)
Create timer manager based on timer_heap mechanism.
SO_5_FUNC subscription_storage_factory_t flat_set_based_subscription_storage_factory(std::size_t initial_capacity)
Factory for subscription storage based on sorted std::vector.
const int rc_disp_create_failed
Unable to create a dispatcher.
const int rc_layer_not_binded_to_so_env
The layer is not bound to the SObjectizer Environment.
message_delivery_mode_t
Possible modes of message/signal delivery.
const int rc_coop_define_agent_failed
Cooperation couldn't be registered.
priority_t to_priority_t(std::size_t v)
Helper function for conversion from size_t to priority.
void ensure_message_with_actual_data(const Msg *m)
A special checker to guarantee that the message is an instance of the message_t (not signal_t) and ha...
agent_context_t operator+(agent_context_t ctx, custom_direct_mbox_factory_t factory)
const int rc_state_nesting_is_too_deep
Nesting of agent states is too deep.
SO_5_FUNC timer_thread_unique_ptr_t create_timer_wheel_thread(error_logger_shptr_t logger)
Create timer thread based on timer_wheel mechanism.
const int rc_agent_incompatible_type_conversion
It is impossible to make a cast to that type.
const int rc_initial_substate_already_defined
Initial substate for a composite state is already defined.
timer_manager_factory_t timer_wheel_manager_factory(unsigned int wheel_size, std::chrono::steady_clock::duration granularity)
Factory for timer_wheel manager with explicitely specified parameters.
const int rc_unable_to_start_extra_layer
Layer initialization is failed.
SO_5_FUNC subscription_storage_factory_t default_subscription_storage_factory()
Factory for default subscription storage object.
mbox_type_t
Type of the message box.
@ multi_producer_single_consumer
@ multi_producer_multi_consumer
const int rc_negative_value_for_pause
An attempt to use negative value for pause argument for delayed or periodic message/signal.
const int rc_prepared_select_is_active_now
An attempt to activate prepared-select when an operation on that prepared-select object is already ac...
void ensure_not_signal()
A special compile-time checker to guarantee that the message class is not a signal class.
const int rc_msg_chain_overflow
const int rc_coop_is_not_in_registered_state
An attempt to do something with coop that is not in registered state.
agent_context_t operator+(agent_context_t ctx, message_limit::abort_app_indicator_t< M > limit)
const int rc_mutable_msg_cannot_be_periodic
An attempt to send mutable message as a periodic message.
const int rc_cannot_set_stop_guard_when_stop_is_started
An attempt to set up a new stop_guard when the stop operation is already in progress.
void operator>>=(agent_t *agent, const state_t &new_state)
A shortcat for switching the agent state.
constexpr unsigned int max_redirection_deep
Maximum deep of message redirections.
const int rc_no_preallocated_resources_for_agent
There are no resources that must have been in place for an agent in advance.
mchain_receive_params_t< mchain_props::msg_count_status_t::undefined > from(mchain_t chain)
A helper function for simplification of creation of mchain_receive_params instance.
const int rc_transfer_to_state_loop
A loop in transfer_to_state detected.
exception_reaction_t
A reaction of SObjectizer to an exception from agent event.
@ abort_on_exception
Execution of application must be aborted immediatelly.
@ inherit_exception_reaction
Exception reaction should be inherited from SO Environment.
@ ignore_exception
Exception should be ignored and agent should continue its work.
@ deregister_coop_on_exception
@ shutdown_sobjectizer_on_exception
std::enable_if<!message_payload_type< Message >::is_signal >::type send_delayed(Target &&to, std::chrono::steady_clock::duration pause, mhood_t< Message > msg)
A utility function for delayed redirection of a message from existing message hood.
SO_5_FUNC error_logger_shptr_t create_stderr_logger()
A factory for creating error_logger implemenation which uses std::stderr as log stream.
std::enable_if< message_payload_type< Message >::is_signal >::type send_delayed(Target &&to, std::chrono::steady_clock::duration pause, mhood_t< Message >)
A utility function for delayed redirection of a signal from existing message hood.
void ensure_not_mutable_signal()
A special compile-time checker to guarantee that S is not a mutable signal.
const int rc_coop_already_destroyed
An attempt to get a pointer to already destroyed cooperation.
agent_context_t operator+(agent_context_t ctx, so_5::priority_t agent_priority)
const int rc_agent_name_too_long
Length of an agent name is too large.
current_thread_id_t null_current_thread_id()
Get NULL thread id.
const thread_safety_t not_thread_safe
Shorthand for thread unsafety indicator.
const int rc_msg_chain_is_full
Attempt to push a message to full message queue.
std::enable_if< details::is_agent_method_pointer< details::method_arity::unary, Method_Pointer >::value, details::msg_type_and_handler_pair_t >::type preprocess_agent_event_handler(const mbox_t &mbox, agent_t &agent, Method_Pointer pfn)
Do preprocessing and some verification of event handler and return msg_type_and_handler_pair for it.
priority_t
Definition of supported priorities.
const thread_safety_t thread_safe
Shorthand for thread safety indicator.
const int rc_operation_enabled_only_on_agent_working_thread
An attempt to perform an operation which is enabled only on agent's working thread.
const int rc_autoshutdown_must_be_enabled
An attempt to launch environment with autoshutdown disabled in conditions where autoshutdown must be ...
SO_5_FUNC timer_thread_unique_ptr_t create_timer_heap_thread(error_logger_shptr_t logger, std::size_t initial_heap_capacity)
Create timer thread based on timer_heap mechanism.
const int rc_agent_is_not_the_state_owner
Agent doesn't own this state.
const int rc_scenario_must_be_completed
Testing scenario must be completed before an attempt to do the current operation.
const int rc_extensible_select_is_active_now
An attempt to modify or activate extensible-select when an operation on that extensible-select object...
const int rc_agent_unknown_state
Trying to switch to the unknown state.
SO_5_FUNC timer_thread_unique_ptr_t create_timer_list_thread(error_logger_shptr_t logger)
Create timer thread based on timer_list mechanism.
message_mutability_t
A enum with variants of message mutability or immutability.
std::thread::id raw_id_from_current_thread_id(const current_thread_id_t &w)
Get the raw thread id from current_thread_id.
SO_5_FUNC timer_manager_unique_ptr_t create_timer_list_manager(error_logger_shptr_t logger, outliving_reference_t< timer_manager_t::elapsed_timers_collector_t > collector)
Create timer thread based on timer_list mechanism.
void send(Target &&to, message_holder_t< Message, Ownership > what)
A version of send function for redirection of a message from exising message_holder instance.
infinite_wait_indication
A type for special marker for infitite waiting on service request or on receive from mchain.
const int rc_trying_to_add_extra_layer_that_already_exists_in_extra_list
The layer is already bound to the SObjectizer Environment as an extra layer.
const int rc_several_limits_for_one_message_type
An attempt to define several limits for one message type.
const int rc_layer_does_not_exist
A layer with the specified type doesn't exist.
const int rc_invalid_time_limit_for_state
Invalid value of time limit for an agent's state.
mchain_params_t make_unlimited_mchain_params()
Create parameters for size-unlimited mchain.
const int rc_agent_to_disp_binding_failed
Binding of agent to dispatcher failed.
thread_safety_t
Thread safety indicator.
const int rc_priority_quote_illegal_value
Illegal value of quote for a priority.
timer_thread_factory_t timer_wheel_factory()
Factory for timer_wheel thread with default parameters.
void close_drop_content(Exceptions_Control exceptions_control, const mchain_t &ch) noexcept(noexcept(details::should_terminate_if_throws_t< Exceptions_Control >::value))
Helper function for closing a message chain with dropping all its content.
timer_manager_factory_t timer_list_manager_factory()
Factory for timer_list manager with default parameters.
const int rc_several_handlers_for_one_message_type
Attempt to define several handlers for one msg_type.
SO_5_FUNC subscription_storage_factory_t hash_table_based_subscription_storage_factory()
Factory for default subscription storage based on std::unordered_map.
const int rc_msg_chain_doesnt_support_subscriptions
Attempt to make subscription for message chain.
intrusive_ptr_t< Derived > make_agent_ref(Derived *agent)
Helper function template for the creation of smart pointer to an agent.
SO_5_FUNC timer_manager_unique_ptr_t create_timer_wheel_manager(error_logger_shptr_t logger, outliving_reference_t< timer_manager_t::elapsed_timers_collector_t > collector)
Create timer manager based on timer_wheel mechanism.
SO_5_FUNC timer_manager_unique_ptr_t create_timer_wheel_manager(error_logger_shptr_t logger, outliving_reference_t< timer_manager_t::elapsed_timers_collector_t > collector, unsigned int wheel_size, std::chrono::steady_clock::duration granuality)
Create timer manager based on timer_wheel mechanism.
const infinite_wait_indication infinite_wait
A special indicator for infinite waiting on service request or on receive from mchain.
decltype(auto) introduce_child_coop(agent_t &owner, Args &&... args)
A simple way for creating and registering child cooperation.
const int rc_stored_msg_inspection_result_not_found
There is no stored msg inspection result in the testing scenario.
timer_thread_factory_t timer_list_factory()
Factory for timer_list thread with default parameters.
message_kind_t
A enum with variants of message kinds.
@ user_type_message
Message is an user type message.
@ enveloped_msg
Message is an envelope with some other message inside.
agent_context_t operator+(agent_context_t ctx, message_limit::drop_indicator_t< M > limit)
const int rc_empty_agent_name
Name for an agent can't be empty.
constexpr terminate_if_throws_t terminate_if_throws
Value that indicates that an exception leads to the termination of the whole application.
event_queue_hook_unique_ptr_t make_empty_event_queue_hook_unique_ptr()
Helper function for creation of empty unique_ptr for event_queue_hook.
const int rc_agent_deactivated
Agent can't change state because the agent is already deactivated.
no_wait_indication
A type for special marker for no waiting on service request or on receive from mchain.
SO_5_FUNC void swap(name_for_agent_t &a, name_for_agent_t &b) noexcept
timer_id_t send_periodic(Target &&target, std::chrono::steady_clock::duration pause, std::chrono::steady_clock::duration period, Args &&... args)
A utility function for creating and delivering a periodic message to the specified destination.
std::enable_if< is_signal< M >::value, mhood_t< immutable_msg< M > > >::type to_immutable(mhood_t< mutable_msg< M > >)
const int rc_stored_state_name_not_found
There is no stored state name in the testing scenario.
mbox_id_t null_mbox_id()
Default value for null mbox_id.
std::enable_if<!is_signal< M >::value, mhood_t< immutable_msg< M > > >::type to_immutable(mhood_t< mutable_msg< M > > msg)
Transform mutable message instance into immutable.
void send(Target &&to, Args &&... args)
A utility function for creating and delivering a message or a signal.
const int rc_another_state_switch_in_progress
An attempt to switch agent state when another switch operation is in progress.
std::enable_if< is_signal< Message >::value, timer_id_t >::type send_periodic(Target &&target, std::chrono::steady_clock::duration pause, std::chrono::steady_clock::duration period, mhood_t< Message >)
A utility function for periodic redirection of a signal from existing message hood.
work_thread_activity_tracking_t
Values for dispatcher's work thread activity tracking.
@ off
Tracking is disabled.
@ unspecified
Tracking mode is specified elsewhere.
const no_wait_indication no_wait
A special indicator for no waiting on service request or on receive from mchain.
const int rc_unable_to_define_new_step
New step can't be defined if testing scenario is already started or finished.
const int rc_msg_tracing_disabled
Message delivery tracing is disabled and cannot be used.
message_ownership_t
Type of ownership of a message instance inside message_holder.
const int rc_unable_to_register_coop_during_shutdown
It is impossible to register cooperation during SObjectizer Environment shutdown.
intrusive_ptr_t(std::unique_ptr< T >) -> intrusive_ptr_t< T >
coop_unique_holder_t create_child_coop(coop_handle_t parent, Args &&... args)
A simple way for creating child cooperation when there is a reference to the parent cooperation objec...
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.
prepared_receive_t< sizeof...(Handlers) > prepare_receive(const mchain_receive_params_t< Msg_Count_Status > ¶ms, Handlers &&... handlers)
Create parameters for receive function to be used later.
delivery_possibility_t
Result of checking delivery posibility.
@ disabled_by_delivery_filter
const int rc_no_initial_substate
An attempt to change agent state to a new composite state which have no initial state defined.
const int rc_unable_to_join_thread_by_itself
An attempt to call join() from the joinable thread itself.
timer_manager_factory_t timer_heap_manager_factory(std::size_t initial_heap_capacity)
Factory for timer_heap manager with explicitely specified parameters.
SO_5_FUNC subscription_storage_factory_t adaptive_subscription_storage_factory(std::size_t threshold, const subscription_storage_factory_t &small_storage_factory, const subscription_storage_factory_t &large_storage_factory)
Factory for adaptive subscription storage.
const int rc_agent_has_no_cooperation
Agent is not bound to a cooperation.
const int rc_null_message_data
Null message data.
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.
outliving_reference_t< const T > outliving_const(T const &r)
Make outliving_reference wrapper for const reference.
decltype(auto) introduce_child_coop(coop_handle_t parent, Args &&... args)
A simple way for creating and registering child cooperation when there is a reference to parent coop.
const int rc_unknown_exception_type
An exception of unknown type is caught.
void ensure_signal()
A special compile-time checker to guarantee that the Msg is derived from the signal_t.
timer_thread_factory_t timer_wheel_factory(unsigned int wheel_size, std::chrono::steady_clock::duration granularity)
Factory for timer_wheel thread with explicitely specified parameters.
std::enable_if<!is_signal< Message >::value, timer_id_t >::type send_periodic(Target &&target, std::chrono::steady_clock::duration pause, std::chrono::steady_clock::duration period, mhood_t< Message > mhood)
A utility function for delivering a periodic from an existing message hood.
void ensure_classical_message()
A special compile-time checker to guarantee that Msg is derived from message_t.
SO_5_FUNC subscription_storage_factory_t vector_based_subscription_storage_factory(std::size_t initial_capacity)
Factory for subscription storage based on unsorted std::vector.
timer_thread_factory_t timer_heap_factory()
Factory for timer_heap thread with default parameters.
transformed_message_t< Msg > make_transformed(mbox_t mbox, Args &&... args)
Helper function for creation of an instance of transformed_message_t.
disp_binder_shptr_t make_default_disp_binder(environment_t &env)
Create an instance of the default dispatcher binder.
const int rc_msg_chain_doesnt_support_delivery_filters
Attempt to set delivery_filter for message chain.
const int rc_environment_error
so_environment launch is failed.
timer_manager_factory_t timer_heap_manager_factory()
Factory for timer_heap manager with default parameters.
outliving_reference_t< const T > outliving_const(outliving_reference_t< T > r)
Make outliving_reference wrapper for const reference.
SO_5_FUNC subscription_storage_factory_t map_based_subscription_storage_factory()
Factory for subscription storage based on std::map.
const int rc_empty_name
The empty name doesn't allowed.
const int rc_unexpected_error
Unclassified error.
SO_5_FUNC subscription_storage_factory_t adaptive_subscription_storage_factory(std::size_t threshold)
Factory for adaptive subscription storage.
agent_context_t operator+(environment_t &env, Option arg)
A plus operator for creating agent_context object from a reference to Environment and single agent tu...
agent_context_t operator+(agent_context_t ctx, message_limit::redirect_indicator_t< M, L > limit)
SO_5_FUNC timer_manager_unique_ptr_t create_timer_heap_manager(error_logger_shptr_t logger, outliving_reference_t< timer_manager_t::elapsed_timers_collector_t > collector)
Create timer manager based on timer_heap mechanism.
timer_manager_factory_t timer_wheel_manager_factory()
Factory for timer_wheel manager with default parameters.
coop_unique_holder_t create_child_coop(agent_t &owner, Args &&... args)
A simple way for creating child cooperation.
void send_delayed(Target &&target, std::chrono::steady_clock::duration pause, Args &&... args)
A utility function for creating and delivering a delayed message to the specified destination.
constexpr exceptions_enabled_t exceptions_enabled
Value that indicates that exceptions are enabled.
timer_id_t send_periodic(Target &&target, std::chrono::steady_clock::duration pause, std::chrono::steady_clock::duration period, message_holder_t< Message, Ownership > what)
A version of send_periodic function for redirection of a message from exising message_holder instance...
SO_5_FUNC timer_thread_unique_ptr_t create_timer_wheel_thread(error_logger_shptr_t logger, unsigned int wheel_size, std::chrono::steady_clock::duration granuality)
Create timer thread based on timer_wheel mechanism.
agent_context_t operator+(agent_context_t ctx, message_limit::log_then_abort_app_indicator_t< M, L > limit)
agent_context_t operator+(agent_context_t ctx, subscription_storage_factory_t factory)
timer_thread_factory_t timer_heap_factory(std::size_t initial_heap_capacity)
Factory for timer_heap thread with explicitely specified parameters.
const int rc_attempt_to_cast_to_envelope_on_nullptr
An attempt to cast message to message envelope when a pointer to message is NULL.
const int rc_evt_handler_already_provided
A handler for that event/mbox/state is already registered.
agent_context_t operator+(agent_context_t ctx, name_for_agent_t agent_name)
const int rc_mutable_msg_cannot_be_delivered_via_mpmc_mbox
An attempt to deliver mutable message via MPMC mbox.
std::enable_if< details::lambda_traits::is_lambda< Lambda >::value, details::msg_type_and_handler_pair_t >::type preprocess_agent_event_handler(const mbox_t &mbox, agent_t &, Lambda &&lambda)
Do preprocessing and some verification of event handler and return msg_type_and_handler_pair for it.
const int rc_trying_to_add_extra_layer_that_already_exists_in_default_list
The layer is already bound to the SObjectizer Environment as a default layer.
event_handler_kind_t
Kind of an event handler.
SO_5_FUNC event_exception_logger_unique_ptr_t create_std_event_exception_logger()
Create the default exception logger.
const int rc_disp_binder_already_set_for_agent
The dispatcher binder is already set for the agent.
void close_retain_content(Exceptions_Control exceptions_control, const mchain_t &ch) noexcept(noexcept(details::should_terminate_if_throws_t< Exceptions_Control >::value))
Helper function for closing a message chain with retaining all its content.
std::enable_if<!is_signal< Message >::value >::type send(Target &&to, mhood_t< Message > what)
A version of send function for redirection of a message from exising message hood.
current_thread_id_t query_current_thread_id()
Get the ID of the current thread.
SO_5_FUNC queue_locks_defaults_manager_unique_ptr_t make_defaults_manager_for_simple_locks()
A factory for queue_locks_defaults_manager with generators for simple locks.
std::enable_if< is_signal< Message >::value >::type send(Target &&to, mhood_t< Message >)
A version of send function for redirection of a signal from exising message hood.
SO_5_FUNC timer_thread_unique_ptr_t create_timer_heap_thread(error_logger_shptr_t logger)
Create timer thread based on timer_heap mechanism.
const int rc_nullptr_as_delivery_filter_pointer
nullptr can't be passed as delivery_filter.
const int rc_not_implemented
Feature or method has no implementation yet.
const int rc_message_has_no_limit_defined
An attempt to create subscription to message without predefined limit for that message type.
const int rc_negative_value_for_period
An attempt to use negative value for period argument for periodic message/signal.
outliving_reference_t< T > outliving_mutable(T &r)
Make outliving_reference wrapper for mutable reference.
const int rc_mpsc_mbox_expected
An instance of MPSC mbox is expected as custom direct mbox.
transformed_message_t< Msg > make_transformed(mbox_t mbox, message_holder_t< Msg, Ownership > msg_holder)
Helper function for creation of an instance of transformed_message_t.
mchain_receive_result_t receive(const prepared_receive_t< Handlers_Count > &prepared)
A receive operation to be done on previously prepared receive params.
const int rc_subscription_to_mutable_msg_from_mpmc_mbox
An attempt to make subscription on mutable message from MPMC mbox.
mchain_receive_result_t receive(const mchain_receive_params_t< Msg_Count_Status > ¶ms, Handlers &&... handlers)
Advanced version of receive from mchain.
const int rc_trying_to_add_nullptr_extra_layer
Unable to bind a layer by the null pointer to it.
mchain_params_t make_limited_without_waiting_mchain_params(std::size_t max_size, mchain_props::memory_usage_t memory_usage, mchain_props::overflow_reaction_t overflow_reaction)
Create parameters for size-limited mchain without waiting on overflow.
mchain_params_t make_limited_with_waiting_mchain_params(std::size_t max_size, mchain_props::memory_usage_t memory_usage, mchain_props::overflow_reaction_t overflow_reaction, mchain_props::duration_t wait_timeout)
Create parameters for size-limited mchain with waiting on overflow.
void send_delayed(Target &&to, std::chrono::steady_clock::duration pause, message_holder_t< Message, Ownership > msg)
A version of send_delayed function for redirection of a message from exising message_holder instance.
agent_context_t operator+(agent_context_t ctx, message_limit::transform_indicator_t< M > limit)
const int rc_no_disp_binder_for_agent
The dispatcher binder is not set for the agent yet.
Type for case when agent has user-provided name.
std::string_view m_name
Value.
Type for case when agent has no user-provided name.
SO_5_FUNC std::array< char, c_string_size > make_c_string() const noexcept
Make a c-string with text representation of a value.
static constexpr std::string_view c_string_prefix
Prefix to be used for string representation.
static constexpr std::size_t c_string_size
const agent_t * m_pointer_value
Value.
static constexpr std::string_view c_string_suffix
Suffix to be used for string representation.
void operator()(const pointer_only_t &v) const
to_ostream_visitor_t(std::ostream &to)
void operator()(const actual_name_t &v) const
std::string operator()(const pointer_only_t &v) const
std::string operator()(const actual_name_t &v) const
Type of user resource deleter.
resource_deleter_t(T *resource)
void operator()() noexcept
static constexpr const method_arity arity
static constexpr const bool is_noexcept
static constexpr const bool value
static constexpr const method_arity arity
static constexpr const bool value
static constexpr const bool is_noexcept
A simple metafunction that always "returns" false.
static constexpr const bool value
static void ensure_appropriate_type()
static immutable_msg< Msg > make_arg(message_ref_t &)
static void ensure_appropriate_type()
static mhood_t< immutable_msg< Msg > > make_arg(message_ref_t &mf)
static mhood_t< mutable_msg< Msg > > make_arg(message_ref_t &mf)
static void ensure_appropriate_type()
static void ensure_appropriate_type()
static mhood_t< Msg > make_arg(message_ref_t &mf)
static void ensure_appropriate_type()
static mutable_msg< Msg > make_arg(message_ref_t &)
A helper template for create an argument for event handler in the case when argument is passed as val...
static void ensure_appropriate_type()
static const Msg & make_arg(message_ref_t &mf)
Basic part of handlers_bunch implementation.
static void prepare_handlers(msg_type_and_handler_pair_t *left, msg_type_and_handler_pair_t *right)
Preparation of message handlers vector.
static SO_5_FUNC bool find_and_use_handler(const msg_type_and_handler_pair_t *left, const msg_type_and_handler_pair_t *right, const std::type_index &msg_type, message_ref_t &message)
Find and exec message handler.
Helper for showing only part of long string.
const std::size_t m_limit
const std::string_view m_what
length_limited_string(const std::string_view what, std::size_t limit)
Helper for showing pointer value.
pointer(const void *what)
Check whether T is a non-static member function pointer.
static constexpr const bool value
A detector of lambda argument type if the checked type is lambda.
A checker for lambda likeness.
A detector that type is a lambda or functional object.
static constexpr const bool value
Detector of plain type without const/volatile modifiers.
static R call_with_arg(R(*l)(M), M m)
Helper for calling a lambda.
static R call_with_arg(R(*l)(M), M m)
Helper for calling a lambda.
static R call_without_arg(L l)
Helper for calling a lambda.
static R call_with_arg(L l, M m)
Helper for calling a lambda.
Detector of lambda result and argument type.
static std::unique_ptr< Msg > make()
static std::unique_ptr< E > make(Args &&... args)
A meta-function for selection of type of accessors mixin.
A meta-function for selection a base of message_holder implementation in compile-time.
static const constexpr message_mutability_t mutability
static const constexpr message_mutability_t mutability
Detector of message type traits in dependency of message immutability or mutability.
static const constexpr message_mutability_t mutability
A special detector of message immutability/mutability.
static constexpr const message_mutability_t mutability
A special selector of message hood type.
static constexpr const mhood_type_t mhood_type
Description of an event handler.
bool operator<(const msg_type_and_handler_pair_t &o) const
Comparison (strictly less than).
msg_type_and_handler_pair_t(std::type_index msg_type)
Constructor for the case when only msg_type is known.
friend void swap(msg_type_and_handler_pair_t &a, msg_type_and_handler_pair_t &b) noexcept
Swap operation.
msg_type_and_handler_pair_t(const msg_type_and_handler_pair_t &o)
Copy constructor.
msg_type_and_handler_pair_t & operator=(msg_type_and_handler_pair_t &&o) noexcept
Move operator.
std::type_index m_msg_type
Type of a message or signal.
msg_type_and_handler_pair_t()
Default constructor.
msg_type_and_handler_pair_t(msg_type_and_handler_pair_t &&o) noexcept
Move constructor.
event_handler_method_t m_handler
A handler for processing this message or signal.
msg_type_and_handler_pair_t(std::type_index msg_type, event_handler_method_t handler, message_mutability_t mutability)
Initializing constructor.
bool operator==(const msg_type_and_handler_pair_t &o) const
Comparison (strictly equal).
msg_type_and_handler_pair_t & operator=(const msg_type_and_handler_pair_t &o)
Copy operator.
message_mutability_t m_mutability
What message is expected by handler: mutable or immutable.
static void exec(Main_Action main_action, rollbacker_t< Rollback_Action > &rollback)
static Result exec(Main_Action main_action, rollbacker_t< Rollback_Action > &rollback)
static constexpr bool value
static constexpr bool value
Statistical data for run-time monitoring of coop repository content.
std::size_t m_total_coop_count
Count of cooperations inside the environment.
std::size_t m_total_agent_count
Count of registered agents.
std::size_t m_final_dereg_coop_count
Count of coops waiting for the final deregistration.
Internal details of SObjectizer Environment object.
Type that indicates that exceptions are enabled.
A description of event execution demand.
mbox_id_t m_mbox_id
ID of mbox.
void call_handler(current_thread_id_t thread_id)
Helper method to simplify demand execution.
demand_handler_pfn_t m_demand_handler
Demand handler.
agent_t * m_receiver
Receiver of demand.
message_ref_t m_message_ref
Event incident.
execution_demand_t() noexcept
Default constructor.
const message_limit::control_block_t * m_limit
Optional message limit for that message.
execution_demand_t(agent_t *receiver, const message_limit::control_block_t *limit, mbox_id_t mbox_id, std::type_index msg_type, message_ref_t message_ref, demand_handler_pfn_t demand_handler) noexcept
std::type_index m_msg_type
Type of the message.
A helper class for temporary setting and then dropping the ID of the current working thread.
so_5::current_thread_id_t & m_id
working_thread_id_sentinel_t(so_5::current_thread_id_t &id_var, so_5::current_thread_id_t value_to_set)
~working_thread_id_sentinel_t()
Type of key for filters map.
mbox_t m_mbox
Message mbox.
std::type_index m_msg_type
Message type.
bool operator<(const key_t &o) const
Type of value for filters map.
value_t(delivery_filter_unique_ptr_t filter, so_5::outliving_reference_t< abstract_message_sink_t > sink)
delivery_filter_unique_ptr_t m_filter
Delivery filter.
std::reference_wrapper< abstract_message_sink_t > m_sink
Message sink for that the filter was set.
Information about event_handler and its properties.
thread_safety_t m_thread_safety
Is event handler thread safe or not.
event_handler_method_t m_method
Method for handling event.
event_handler_kind_t m_kind
Kind of this event handler.
static void send_delayed(const so_5::mbox_t &to, std::chrono::steady_clock::duration pause)
static void send(const so_5::mbox_t &to)
static timer_id_t send_periodic(const so_5::mbox_t &to, std::chrono::steady_clock::duration pause, std::chrono::steady_clock::duration period)
static auto make_instance(Args &&... args)
static void send(const so_5::mbox_t &to, Args &&... args)
static void send_delayed(const so_5::mbox_t &to, std::chrono::steady_clock::duration pause, Args &&... args)
static timer_id_t send_periodic(const so_5::mbox_t &to, std::chrono::steady_clock::duration pause, std::chrono::steady_clock::duration period, Args &&... args)
const abstract_message_box_t & m_mbox
const abstract_message_box_t & m_mbox
const abstract_message_chain_t & m_mchain
const std::type_index & m_type
redirection_deep(unsigned int deep)
const std::type_index & m_type
Base class for a mchain for the case when message delivery tracing is disabled.
void trace_demand_drop_on_close(const abstract_message_chain_t &, const mchain_props::demand_t &)
void trace_extracted_demand(const abstract_message_chain_t &, const mchain_props::demand_t &)
Base class for a mbox for the case when message delivery tracing is disabled.
Helper class to be used as a comparator for msinks.
bool operator()(const msink_t &a, const msink_t &b) const noexcept
static std::pair< const abstract_sink_owner_t *, so_5::priority_t > safe_get_pair(const msink_t &from) noexcept
Helper for marking initial substate of composite state.
initial_substate_of(state_t &parent_state)
A helper class for checking that message is a classical message derived from message_t class.
A helper class for checking that message is a mutable message.
A helper class for checking that message is a signal.
A helper for detection presence of message of user type.
const mbox_t & m_mbox
Mbox to which message will be delivered.
const message_ref_t & m_msg
Message to be sent after timeout.
std::chrono::steady_clock::duration m_period
Period of the delivery repetition for periodic messages.
std::chrono::steady_clock::duration m_pause
Timeout before the first delivery.
const std::type_index & m_msg_type
Message type.
const mbox_t & m_mbox
Mbox to which message will be delivered.
const std::type_index & m_msg_type
Message type.
std::chrono::steady_clock::duration m_pause
Timeout before the delivery.
const message_ref_t & m_msg
Message to be sent after timeout.
An information which is necessary for creation of a new mbox.
mbox_id_t m_id
ID for a new mbox.
outliving_reference_t< msg_tracing::holder_t > m_tracer
Stuff to be used for message delivery tracing.
mbox_creation_data_t(outliving_reference_t< environment_t > env, mbox_id_t id, outliving_reference_t< msg_tracing::holder_t > tracer)
Initializing constructor.
outliving_reference_t< environment_t > m_env
Environment for which the mbox is created.
Description of one demand in message chain.
friend void swap(demand_t &a, demand_t &b) noexcept
Swap operation.
std::type_index m_msg_type
Type of the message.
demand_t()
Default constructor.
so_5::message_ref_t m_message_ref
Event incident.
demand_t(std::type_index msg_type, so_5::message_ref_t message_ref)
Initializing constructor.
Container of parameters for receive() function.
adv_receive_data_t()=default
Default constructor.
mchain_t m_chain
A chain to be used in receive operation.
adv_receive_data_t(mchain_t chain)
Initializing constructor.
std::size_t m_to_extract
Minimal count of messages to be extracted.
chain_closed_handler_t m_chain_closed_handler
Optional chain-closed handler.
std::size_t m_to_handle
Minimal count of messages to be handled.
stop_predicate_t m_stop_predicate
Optional stop-predicate.
mchain_props::duration_t m_total_time
Total time for all work of advanced receive.
mchain_props::duration_t m_empty_timeout
Timeout for waiting on empty queue.
Message limit with reaction 'abort the application'.
const unsigned int m_limit
Max count of waiting messages.
abort_app_indicator_t(unsigned int limit)
Initializing constructor.
A control block for one message limit.
action_t m_action
Limit overflow reaction.
std::atomic_uint m_count
The current count of the messages of that type.
control_block_t(unsigned int limit, action_t action)
Initializing constructor.
unsigned int m_limit
Limit value.
static const control_block_t * none()
A special indicator about absence of control_block.
control_block_t & operator=(const control_block_t &o)
Copy operator.
static void decrement(const control_block_t *limit)
control_block_t(const control_block_t &o)
Copy constructor.
A description of one message limit.
std::type_index m_msg_type
Type of message.
description_t(std::type_index msg_type, unsigned int limit, action_t action)
Initializing constructor.
unsigned int m_limit
Max count of waiting messages.
action_t m_action
Reaction to overload.
Message limit with reaction 'drop new message'.
drop_indicator_t(unsigned int limit)
Initializing constructor.
const unsigned int m_limit
Max count of waiting messages.
static void call(const overlimit_context_t &ctx, L action)
Helper class for calling pre-abort action.
static void call(const overlimit_context_t &ctx, L action)
Helper class for calling pre-abort action.
Message limit with reaction 'abort the application' and the possibility to call additional lambda bef...
const L m_lambda
Lambda for some last actions.
const unsigned int m_limit
Max count of waiting messages.
log_then_abort_app_indicator_t(unsigned int limit, L lambda)
Initializing constructor.
A mixin with message limit definition methods.
static drop_indicator_t< Msg > limit_then_drop(unsigned int limit)
A helper function for creating drop_indicator.
static redirect_indicator_t< Msg, Lambda > limit_then_redirect(unsigned int limit, Lambda dest_getter)
A helper function for creating redirect_indicator.
static transform_indicator_t< Source > limit_then_transform(unsigned int limit, Lambda &&transformator)
A helper function for creating transform_indicator.
static log_then_abort_app_indicator_t< M, L > limit_then_abort(unsigned int limit, L lambda)
A helper function for creating log_then_abort_app_indicator.
static abort_app_indicator_t< Msg > limit_then_abort(unsigned int limit)
A helper function for creating abort_app_indicator.
static auto limit_then_redirect(unsigned int limit, mbox_t destination)
A helper function for creating redirect_indicator.
static transformed_message_t< Msg > make_transformed(mbox_t mbox, Args &&... args)
Helper method for creating message transformation result.
static auto limit_then_transform(unsigned int limit, Lambda &&transformator)
A helper function for creating transform_indicator.
Description of context for overlimit action.
const message_delivery_mode_t m_delivery_mode
Delivery mode for message delivery attempt.
overlimit_context_t(mbox_id_t mbox_id, message_delivery_mode_t delivery_mode, const agent_t &receiver, const control_block_t &limit, unsigned int reaction_deep, const std::type_index &msg_type, const message_ref_t &message, const impl::action_msg_tracer_t *msg_tracer)
Initializing constructor.
const mbox_id_t m_mbox_id
ID of mbox which is used for message delivery.
const control_block_t & m_limit
Control block for message limit.
const unsigned int m_reaction_deep
The current deep of overlimit reaction recursion.
const agent_t & m_receiver
Receiver of the message (or enveloped message).
const std::type_index & m_msg_type
Type of message to be delivered.
const message_ref_t & m_message
A message (or enveloped message) to be delivered.
const impl::action_msg_tracer_t * m_msg_tracer
An optional pointer to tracer object for message delivery tracing.
Indication that a message must be redirected on overlimit.
Lambda m_destination_getter
A lambda/functional object which returns mbox for redirection.
const unsigned int m_limit
Max count of waiting messages.
redirect_indicator_t(unsigned int limit, Lambda destination_getter)
Initializing constructor.
static constexpr message_mutability_t mutability()
Helper for getting message mutability flag.
static payload_type & payload_reference(message_t &msg)
Helper for getting a const reference to payload part.
static constexpr const bool is_signal
Is it a signal type or message type.
static payload_type * extract_payload_ptr(message_ref_t &msg)
Helper for extraction of pointer to payload part.
static envelope_type * extract_envelope_ptr(message_ref_t &msg)
Helper for extraction of pointer to envelope part.
static std::type_index subscription_type_index()
Type ID for subscription.
Implementation details for message_payload_type.
static constexpr message_mutability_t mutability()
Helper for getting message mutability flag.
static payload_type & payload_reference(message_t &msg)
Helper for getting a const reference to payload part.
static envelope_type * extract_envelope_ptr(message_ref_t &msg)
Helper for extraction of pointer to envelope part.
static std::type_index subscription_type_index()
Type ID for subscription.
static constexpr const bool is_signal
Is it a signal type or message type.
static payload_type * extract_payload_ptr(message_ref_t &msg)
Helper for extraction of pointer to payload part.
A helper class for detection of payload type of message.
An information about compound description of message-related action.
const char * m_first
The first part of the description.
const char * m_second
The second part of the description.
An information about a message instance.
const void * m_envelope
A pointer to envelope.
message_mutability_t m_mutability
Information about message mutability.
An information about message source.
mbox_id_t m_id
ID of mbox or mchain.
msg_source_type_t m_type
Type of message source.
Helper type with method to be mixed into agent class.
static name_for_agent_t name_for_agent(std::string_view name)
A helper factory for making name_for_agent_t instance.
time_limit_t(duration_t limit, const state_t &state_to_switch)
void set_up_limit_for_agent(agent_t &agent, const state_t ¤t_state) noexcept
const state_t & m_state_to_switch
void drop_limit_for_agent(agent_t &agent, const state_t ¤t_state) noexcept
Helper for marking a substate of composite state.
substate_of(state_t &parent_state)
Type that indicates that an exception leads to the termination of the whole application.
Statistics for run-time monitoring.
std::size_t m_periodic_count
Quantity of periodic timers.
std::size_t m_single_shot_count
Quantity of single-shot timers.
Template class for representing object of user type as a message.
user_type_message_t(T &&o)
Initialization from temporary T object.
kind_t so5_message_kind() const noexcept override
Detect the kind of the message.
user_type_message_t(T &o)
Initialization from non-const T object.
T m_payload
Instance of user message.
user_type_message_t(const T &o)
Initialization from const T object.
user_type_message_t(Args &&... args)
Initializing constructor.
#define SO_5_VERSION_PATCH
#define SO_5_VERSION_MAJOR
#define SO_5_VERSION_MAKE(major, minor, patch)
#define SO_5_VERSION_MINOR