2
3
6
7
8
9
10
11
15#include <so_5/declspec.hpp>
16#include <so_5/compiler_features.hpp>
28
29
30
31
32
45
46
47
48
49
50
51
55 const char * file_name,
59 const std::string & message ) = 0;
66
67
68
69
70
77
78
79
80
81
82
102 template<
class Env >
121 m_logger.log( m_file, m_line, m_stream.str() );
140
141
142
143
144
145#define SO_5_LOG_ERROR_IMPL(logger, file, line, var_name)
146 for( so_5::log_msg_details::conductor_t conductor_( logger, file, line );
147 !conductor_.completed(); )
148 for( std::ostringstream & var_name = conductor_.stream();
149 !conductor_.completed(); conductor_.log_message() )
155
156
157
158
159
160
161#define SO_5_LOG_ERROR(logger, var_name)
Interface for message sink.
A context for agent construction and tuning.
agent_tuning_options_t & options()
Read-Write access to agent options.
environment_t & env() const
Access to SObjectizer Environment.
Helper class for holding agent's identity (name or pointer).
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.
Type for holding information necessary for handling time limits for agent states.
~state_time_limit_handling_data_t()
bool is_defined() const noexcept
Is the data for handling time limits defined?
state_time_limit_handling_data_t()
mbox_t timeout_mbox() const noexcept
void make_defined(mbox_t timeout_mbox)
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.
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.
void evt_state_time_limit(mhood_t< so_5::details::msg_state_timeout >)
Special event handler to process state time limits.
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.
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.
@ shutdown_with_skipping_pending_demands
Agent was shutdown and all pending demands have to be skipped.
@ 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 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.
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.
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::unique_ptr< impl::delivery_filter_storage_t > m_delivery_filters
Delivery filters for that agents.
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.
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.
const demands_handling_on_dereg_t m_demands_handling_on_dereg
What to do with pending demands on deregistration.
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.
void so_drop_all_subscriptions_and_filters()
Dropping all agents subscriptions and filters.
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.
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.
state_time_limit_handling_data_t m_state_time_limit_handling_data
Data that is necessary for handling time limits of agent's states.
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_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.
void define_state_time_limit_handling_data_if_needed()
Initialize data for handling time limit of agent's states.
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.
so_5::priority_t query_priority() const noexcept
Get priority value.
agent_tuning_options_t()=default
bool is_user_provided_subscription_storage_factory() const noexcept
Does a user provide a specific subscription_storage_factory?
demands_handling_on_dereg_t demands_handling_on_dereg() const noexcept
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
Type of smart handle for a cooperation.
exception_reaction_t exception_reaction() const noexcept
Get the current exception rection flag for that cooperation.
coop_handle_t handle() noexcept
Get handle for this coop.
An implementation of handler_invoker interface.
void deregister_coop(coop_handle_t coop, int reason) noexcept
Deregister the cooperation.
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 of event queue for agent.
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.
static execution_hint_t create_empty_execution_hint(execution_demand_t &demand)
A special class for accessing private members of agent_coop.
static void decrement_usage_count(coop_t &coop)
static void increment_usage_count(coop_t &coop) noexcept
A helper class for accessing the functionality of environment-class which is specific for SObjectizer...
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.
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.
bool is_msg_tracing_enabled() const
Is message delivery tracing enabled?
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.
agent_t::agent_status_t m_previous_status
state_switch_guard_t(agent_t &agent)
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?
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)
A base class for agent messages.
A message wrapped to be used as type of argument for event handlers.
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
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.
name_for_agent_t(std::string_view value)
Initializing constructor.
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.
An implementation of backoff object using assembly instruction.
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 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
Helper class for simplify iteration on state's path.
state_path_t(const state_t &state) noexcept
Initializing constructor.
Information of time_limit for a state.
void change(duration_t limit, const state_t &state_to_switch) noexcept
const state_t & state_to_switch() const noexcept
void on_state_activation(const agent_t::state_time_limit_handling_data_t &info) noexcept
bool is_limit_exceeded(const steady_clock::time_point current_time) const noexcept
std::optional< activation_data_t > m_activation_data
std::reference_wrapper< const state_t > m_state_to_switch
The target state to switch after the timeout.
void activate(const agent_t::state_time_limit_handling_data_t &info)
time_limit_t(duration_t limit, const state_t &state_to_switch) noexcept
Initializing constructor.
void on_state_deactivation() noexcept
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.
state_t & drop_time_limit()
Drop time limit for the state if defined.
history_t m_state_history
Type of state history.
const state_t * parent_state() const noexcept
Get a parent state if exists.
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.
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 initializing constructor.
state_t(agent_t *agent, std::string state_name, history_t state_history)
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.
state_t(initial_substate_of parent)
Constructor for the case when state is the initial substate of some parent state.
const state_t * m_initial_substate
The initial substate.
bool operator==(const state_t &state) const noexcept
state_t(initial_substate_of parent, std::string state_name)
Constructor for the case when state is the initial substate of some parent state.
size_t m_substate_count
Number of substates.
state_t(agent_t *agent, history_t state_history)
bool operator!=(const state_t &state) const noexcept
agent_t *const m_target_agent
Owner of this state.
std::string query_name() const
Get textual name of the state.
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)
void activate() const
Switch agent to that state.
history_t
Type of history for state.
@ none
State has no history.
@ deep
State has deep history.
@ shallow
State has shallow history.
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.
A class for creating a subscription to messages from the mbox.
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.
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 normal
Normal deregistration.
Some reusable and low-level classes/functions which can be used in public header files.
Internal namespace with details of agent_t implementation.
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.
Implementation details of error_logging facility.
All stuff related to message limits.
Private part of message limit implementation.
const int rc_nullptr_as_result_of_user_mbox_factory
nullptr returned by user-provided mbox factory.
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.
const int rc_state_nesting_is_too_deep
Nesting of agent states is too deep.
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.
const int rc_unable_to_start_extra_layer
Layer initialization is failed.
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...
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.
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.
const int rc_no_preallocated_resources_for_agent
There are no resources that must have been in place for an agent in advance.
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
SO_5_FUNC error_logger_shptr_t create_stderr_logger()
A factory for creating error_logger implemenation which uses std::stderr as log stream.
const int rc_coop_already_destroyed
An attempt to get a pointer to already destroyed cooperation.
demands_handling_on_dereg_t
How pending demands should be handled on deregistration.
@ skip
Pending demands have to be skipped.
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.
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 ...
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.
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.
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.
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.
const int rc_several_handlers_for_one_message_type
Attempt to define several handlers for one msg_type.
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.
const int rc_stored_msg_inspection_result_not_found
There is no stored msg inspection result in the testing scenario.
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.
const int rc_empty_agent_name
Name for an agent can't be empty.
const int rc_agent_deactivated
Agent can't change state because the agent is already deactivated.
SO_5_FUNC void swap(name_for_agent_t &a, name_for_agent_t &b) noexcept
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.
const int rc_another_state_switch_in_progress
An attempt to switch agent state when another switch operation is in progress.
work_thread_activity_tracking_t
Values for dispatcher's work thread activity tracking.
@ off
Tracking is disabled.
@ unspecified
Tracking mode is specified elsewhere.
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.
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 >
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.
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.
const int rc_unknown_exception_type
An exception of unknown type is caught.
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.
outliving_reference_t< const T > outliving_const(outliving_reference_t< T > r)
Make outliving_reference wrapper for const reference.
const int rc_empty_name
The empty name doesn't allowed.
const int rc_unexpected_error
Unclassified error.
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.
const int rc_mutable_msg_cannot_be_delivered_via_mpmc_mbox
An attempt to deliver mutable message via MPMC mbox.
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.
const int rc_disp_binder_already_set_for_agent
The dispatcher binder is already set for the agent.
current_thread_id_t query_current_thread_id()
Get the ID of the current thread.
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.
const int rc_subscription_to_mutable_msg_from_mpmc_mbox
An attempt to make subscription on mutable message from MPMC mbox.
const int rc_trying_to_add_nullptr_extra_layer
Unable to bind a layer by the null pointer to it.
const int rc_no_disp_binder_for_agent
The dispatcher binder is not set for the agent yet.
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.
Description of an event handler.
A description of event execution demand.
mbox_id_t m_mbox_id
ID of mbox.
agent_t * m_receiver
Receiver of demand.
const message_limit::control_block_t * m_limit
Optional message limit for that 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()
Information about event_handler and its properties.
thread_safety_t m_thread_safety
Is event handler thread safe or not.
event_handler_kind_t m_kind
Kind of this event handler.
Helper for marking initial substate of composite state.
A control block for one message limit.
static void decrement(const control_block_t *limit)
A mixin with message limit definition methods.
Helper type with method to be mixed into agent class.
activation_data_t(timer_id_t timer, steady_clock::time_point expiration_point)
steady_clock::time_point m_expiration_point
Timeout of timeout expiration.
timer_id_t m_timer
ID of delayed timeout signal.
Helper for marking a substate of composite state.
#define SO_5_VERSION_PATCH
#define SO_5_VERSION_MAJOR
#define SO_5_VERSION_MAKE(major, minor, patch)
#define SO_5_VERSION_MINOR