2
3
6
7
8
9
10
11
15#include <so_5/timers.hpp>
17#include <so_5/environment_infrastructure.hpp>
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
58
59
60
61
62
63
64
65
66
67
68
69
70
75
76
84 m_timer_factory = std::move(factory);
92 m_timer_factory = std::move(factory);
93 return std::move(*
this);
100 return m_timer_factory;
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
152 return factory( params_t() );
163
164
165
166
167
168
169
170
171
172
173
174
175
180
181
189 m_timer_factory = std::move(factory);
197 m_timer_factory = std::move(factory);
198 return std::move(*
this);
205 return m_timer_factory;
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
257 return factory( params_t() );
autoshutdown_guard_t(environment_t &env, bool autoshutdown_disabled)
coop_handle_t m_guard_coop
const bool m_autoshutdown_disabled
A bunch of data sources for core objects.
stats::auto_registered_source_holder_t< stats::impl::ds_timer_thread_stats_t > m_timer_thread
Data source for timer thread.
stats::auto_registered_source_holder_t< stats::impl::ds_agent_core_stats_t > m_coop_repository
Data source for cooperations repository.
stats::auto_registered_source_holder_t< stats::impl::ds_mbox_core_stats_t > m_mbox_repository
Data source for mboxes repository.
core_data_sources_t(outliving_reference_t< stats::repository_t > ds_repository, impl::mbox_core_t &mbox_repository, so_5::environment_infrastructure_t &infrastructure)
event_queue_t * on_bind(agent_t *, event_queue_t *original_queue) noexcept override
A reaction to binding of an agent to some event_queue.
void on_unbind(agent_t *, event_queue_t *) noexcept override
A reaction to unbinding of an agent from some event_queue.
The base class for the object with a reference counting.
Type of smart handle for a cooperation.
A special type that plays role of unique_ptr for coop.
Interface for creator of new mbox in OOP style.
A class to be used as mixin with actual std::mutex instance inside.
Lock_Type m_lock
Actual lock.
auto lock_and_perform(Lambda &&l) const -> decltype(l())
Do actual lock and perform necessary action.
A class to be used as mixin without any real mutex instance inside.
auto lock_and_perform(Lambda &&l) const -> decltype(l())
Perform necessary action.
Parameters for simple thread-safe single-thread environment.
params_t & timer_manager(timer_manager_factory_t factory) &
Setter for timer_manager factory.
timer_manager_factory_t m_timer_factory
Timer manager factory for environment.
const timer_manager_factory_t & timer_manager() const
Getter for timer_manager factory.
params_t && timer_manager(timer_manager_factory_t factory) &&
Setter for timer_manager factory.
Parameters for simple not-thread-safe single-thread environment.
params_t && timer_manager(timer_manager_factory_t factory) &&
Setter for timer_manager factory.
params_t & timer_manager(timer_manager_factory_t factory) &
Setter for timer_manager factory.
const timer_manager_factory_t & timer_manager() const
Getter for timer_manager factory.
timer_manager_factory_t m_timer_factory
Timer manager factory for environment.
An interface for environment_infrastructure entity.
Parameters for the SObjectizer Environment initialization.
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?
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?
environment_params_t(environment_params_t &&other)
Move constructor.
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.
exception_reaction_t exception_reaction() const noexcept
Get exception reaction flag value.
environment_params_t()
Constructor.
work_thread_activity_tracking_t work_thread_activity_tracking() const
Get activity tracking flag for the whole SObjectizer Environment.
environment_params_t & operator=(environment_params_t &&other) noexcept
Move operator.
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.
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 change_message_delivery_tracer_filter(so_5::msg_tracing::filter_shptr_t filter)
Change the current msg_tracing's filter to a new one.
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.
void run()
Run the SObjectizer Run-Time.
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.
environment_t & self_ref()
Auxiliary methods for getting reference to itself.
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.
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.
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.
coop_handle_t register_coop(coop_unique_holder_t agent_coop)
Register a cooperation.
coop_unique_holder_t make_coop(disp_binder_shptr_t disp_binder)
Create a cooperation with specified dispatcher binder.
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.
Interface of event_queue_hook object.
An interface of event queue for agent.
The base class for all SObjectizer exceptions.
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.
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.
std::mutex m_extra_layers_lock
Object lock for the extra layers data.
void shutdown_default_layers()
Shutdown default layers.
environment_t & m_env
SObjectizer Environment to work with.
layer_t * query_layer(const std::type_index &type) const
Get a layer.
void shutdown_extra_layers()
Shutdown extra layers.
so_layer_list_t m_default_layers
Default layers.
void add_extra_layer(const std::type_index &type, const layer_ref_t &layer)
Add an extra layer.
so_layer_list_t m_extra_layers
Extra layers.
void start()
Start all layers.
layer_core_t(environment_t &env, layer_map_t &&so_layers)
void wait_extra_layers()
Blocking wait for the complete shutdown of all extra layers.
void wait_default_layers()
Blocking wait for the complete shutdown of all default layers.
void finish()
Shutdown all layers and wait for full stop of them.
mbox_t create_ordinary_mpsc_mbox(environment_t &env, agent_t &owner)
Create mpsc_mbox that handles message limits.
mbox_t create_limitless_mpsc_mbox(environment_t &env, agent_t &owner)
Create mpsc_mbox that ignores message limits.
named_mboxes_dictionary_t m_named_mboxes_dictionary
Named mboxes.
mbox_t introduce_named_mbox(mbox_namespace_name_t mbox_namespace, nonempty_name_t mbox_name, const std::function< mbox_t() > &mbox_factory)
Introduce named mbox with user-provided factory.
outliving_reference_t< so_5::msg_tracing::holder_t > m_msg_tracing_stuff
Data related to message delivery tracing.
mbox_core_t(outliving_reference_t< so_5::msg_tracing::holder_t > msg_tracing_stuff)
std::mutex m_dictionary_lock
Named mbox map's lock.
mbox_t create_custom_mbox(environment_t &env, ::so_5::custom_mbox_details::creator_iface_t &creator)
Create a custom mbox.
std::atomic< mbox_id_t > m_mbox_id_counter
A counter for mbox ID generation.
void destroy_mbox(const full_named_mbox_id_t &name) noexcept
Remove a reference to the named mbox.
mchain_t create_mchain(environment_t &env, const mchain_params_t ¶ms)
Create message chain.
mbox_core_t & operator=(const mbox_core_t &)=delete
mbox_core_t(const mbox_core_t &)=delete
mbox_t create_mbox(environment_t &env)
Create local anonymous mbox.
mbox_t create_mbox(environment_t &env, nonempty_name_t mbox_name)
Create local named mbox.
mbox_id_t allocate_mbox_id() noexcept
Allocate an ID for a new custom mbox or mchain.
mbox_core_stats_t query_stats()
Get statistics for run-time monitoring.
Repository of stop_guards.
status_t
Status of the stop operation.
stop_guard_t::setup_result_t setup_guard(stop_guard_shptr_t guard)
Setup new stop_guard.
stop_guard_repository_t(const stop_guard_repository_t &)=delete
action_t remove_guard(stop_guard_shptr_t guard) noexcept
Remove stop_guard.
action_t initiate_stop() noexcept
Initiate stop operation.
stop_guard_repository_t()
guards_container_t m_container_for_shutdown
Additional container to be used on shutdown operation.
action_t
Action which must be performed as result of operation on repository.
@ do_nothing
Nothing to do. Stop operation is not started.
@ do_actual_stop
Stop operation must be finished.
@ wait_for_completion
Stop operation is started but can't be finished right now.
stop_guard_repository_t(stop_guard_repository_t &&)=delete
guards_container_t m_guards
List of actual stop_guards.
status_t m_status
The current status of the stop operation.
Template class for smart reference wrapper on the atomic_refcounted_t.
An interface of the additional SObjectizer Environment layer.
A class for the name of mbox_namespace.
Parameters for message chain.
friend message_mutability_t message_mutability(const intrusive_ptr_t< message_t > &what) noexcept
Helper method for safe get of message mutability flag.
Interface of holder of message tracer and message trace filter objects.
Standard implementation of message tracer holder.
virtual filter_shptr_t take_filter() noexcept override
Get access to the current message trace filter object.
std_holder_t(filter_shptr_t filter, tracer_unique_ptr_t tracer)
Initializing constructor.
const tracer_unique_ptr_t m_tracer
void change_filter(filter_shptr_t filter) noexcept
virtual bool is_msg_tracing_enabled() const noexcept override
Is message tracing enabled?
virtual tracer_t & tracer() const noexcept override
Get pointer to the message tracer object.
default_spinlock_t m_lock
A lock for protecting filter object.
Interface of tracer object.
A class for the name which cannot be empty.
A class which is like std::mutex but does not do any real actions.
null_mutex_t(null_mutex_t &&)=delete
null_mutex_t(const null_mutex_t &)=delete
Helper class for indication of long-lived reference via its type.
A holder for data-souce that should be automatically registered and deregistered in registry.
A public interface for control SObjectizer monitoring options.
void distribute(const mbox_t &distribution_mbox) override
Send appropriate notification about the current value.
ds_agent_core_stats_t(so_5::environment_infrastructure_t &what)
so_5::environment_infrastructure_t & m_what
A data source for distributing information about mbox_core.
ds_mbox_core_stats_t(so_5::impl::mbox_core_t &what)
so_5::impl::mbox_core_t & m_what
void distribute(const mbox_t &distribution_mbox) override
Send appropriate notification about the current value.
A data source for distributing information about timer_thread.
ds_timer_thread_stats_t(so_5::environment_infrastructure_t &what)
void distribute(const mbox_t &distribution_mbox) override
Send appropriate notification about the current value.
so_5::environment_infrastructure_t & m_what
std::condition_variable m_wake_up_cond
Condition for wake-up data-distribution thread.
const mbox_t m_mbox
Mbox for sending monitoring data.
std::chrono::steady_clock::duration m_distribution_period
Data-distribution period.
void body()
Main body of data distribution thread.
std_controller_t(mbox_t mbox)
source_t * m_tail
Tail of data sources list.
std::chrono::steady_clock::duration distribute_current_data()
Initiates distribution of current values for all data sources.
std::mutex m_data_lock
Object lock for data-related operations.
std::mutex m_start_stop_lock
Object lock for start/stop operations.
virtual void add(source_t &what) override
Registration of new data source.
virtual const mbox_t & mbox() const override
Get the mbox for receiving monitoring information.
virtual void remove(source_t &what) noexcept override
Deregistration of previously registered data source.
bool m_shutdown_initiated
Shutdown signal.
virtual void turn_on() override
Turn the monitoring on.
virtual void turn_off() override
Turn the monitoring off.
std::unique_ptr< std::thread > m_distribution_thread
Main data-distribution thread.
source_t * m_head
Head of data sources list.
virtual std::chrono::steady_clock::duration set_distribution_period(std::chrono::steady_clock::duration period) override
Set distribution period.
An interface of data sources repository.
An interface of data source.
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
what_if_stop_in_progress_t
An indentificator for the timer.
#define SO_5_THROW_EXCEPTION(error_code, desc)
so_5::subscription_storage_factory_t ensure_subscription_storage_factory_exists(subscription_storage_factory_t user_provided_factory)
Helper function for creation of the default subscription storage factory.
so_5::disp::abstract_work_thread_factory_shptr_t ensure_work_thread_factory_exists(so_5::disp::abstract_work_thread_factory_shptr_t user_provided_factory)
Helper function for creation of the default global work thread factory.
queue_locks_defaults_manager_unique_ptr_t ensure_locks_defaults_manager_exists(queue_locks_defaults_manager_unique_ptr_t current)
Helper function for creation of appropriate manager object if necessary.
event_queue_hook_unique_ptr_t ensure_event_queue_hook_exists(event_queue_hook_unique_ptr_t current)
Helper function for creation of appropriate event_queue_hook object if necessary.
Some reusable and low-level classes/functions which can be used in public header files.
Default multi-threaded environment infrastructure.
SO_5_FUNC environment_infrastructure_factory_t factory()
A factory for creation the default multitheading environment infrastructure.
Simple single-threaded environment infrastructure with thread safety.
environment_infrastructure_factory_t factory()
A factory for creation of simple thread-safe single-thread environment infrastructure object with def...
SO_5_FUNC environment_infrastructure_factory_t factory(params_t &¶ms)
A factory for creation of simple thread-safe single-thread environment infrastructure object.
Simple single-threaded environment infrastructure without thread safety.
SO_5_FUNC environment_infrastructure_factory_t factory(params_t &¶ms)
A factory for creation of simple not-thread-safe single-thread environment infrastructure object.
environment_infrastructure_factory_t factory()
A factory for creation of simple not-thread-safe single-thread environment infrastructure object with...
Various implementations of environment_infrastructure.
Details of SObjectizer run-time implementations.
void run_stage(const std::string &stage_name, Init_Fn &&init_fn, Deinit_Fn &&deinit_fn, Next_Stage &&next_stage)
Helper template function for doing initialization phase with rollback on failure.
std::string default_global_mbox_namespace()
Helper function that returns name of the default global namespace for named mboxes.
bool operator<(const full_named_mbox_id_t &a, const full_named_mbox_id_t &b)
Implementation details of message delivery tracing mechanism.
Public part of message delivery tracing mechanism.
Internal implementation of run-time monitoring and statistics related stuff.
All stuff related to run-time monitoring and statistics.
Private part of message limit implementation.
exception_reaction_t
A reaction of SObjectizer to an exception from agent event.
@ abort_on_exception
Execution of application must be aborted immediatelly.
message_mutability_t
A enum with variants of message mutability or immutability.
work_thread_activity_tracking_t
Values for dispatcher's work thread activity tracking.
@ unspecified
Tracking mode is specified elsewhere.
A selector of actual lock_holder type in dependency of lock type.
Internal details of SObjectizer Environment object.
so_5::msg_tracing::impl::std_holder_t m_msg_tracing_stuff
Holder of stuff related to message delivery tracing.
const exception_reaction_t m_exception_reaction
An exception reaction for the whole SO Environment.
const bool m_autoshutdown_disabled
Is autoshutdown when there is no more cooperation disabled?
core_data_sources_t m_core_data_sources
Data sources for core objects.
impl::layer_core_t m_layer_core
An utility for layers.
event_exception_logger_unique_ptr_t m_event_exception_logger
Logger for exceptions thrown from event-handlers.
impl::mbox_core_ref_t m_mbox_core
An utility for mboxes.
impl::stop_guard_repository_t m_stop_guards
A repository of stop_guards.
environment_infrastructure_unique_ptr_t m_infrastructure
A specific infrastructure for environment.
internals_t(environment_t &env, environment_params_t &¶ms)
Constructor.
error_logger_shptr_t m_error_logger
Error logger object for this environment.
std::mutex m_event_exception_logger_lock
Lock object for protection of exception logger object.
event_queue_hook_unique_ptr_t m_event_queue_hook
Actual event_queue_hook.
queue_locks_defaults_manager_unique_ptr_t m_queue_locks_defaults_manager
Manager for defaults of queue locks.
work_thread_activity_tracking_t m_work_thread_activity_tracking
Work thread activity tracking for the whole Environment.
so_5::disp::abstract_work_thread_factory_shptr_t m_work_thread_factory
Actual global work thread factory.
subscription_storage_factory_t m_default_subscription_storage_factory
Factory to be used as default subscription storage factory.
Full name for a named mbox.
std::string m_name
Own name of the mbox.
full_named_mbox_id_t(std::string mbox_namespace, std::string mbox_name)
Initializing constructor.
std::string m_namespace
Name of mbox namespace in that the mbox is defined.
Statistics from mbox_core for run-time monitoring.
std::size_t m_named_mbox_count
Count of named mboxes.
named_mbox_info_t(mbox_t mbox)
mbox_t m_mbox
Real mbox for that name.
unsigned int m_external_ref_count
Reference count by external mbox_refs.
A special wrapper to store a layer with its type.
std::type_index m_true_type
Layer type.
bool operator<(const typed_layer_ref_t &tl) const
typed_layer_ref_t(const std::type_index &type, const layer_ref_t &layer)
layer_ref_t m_layer
Layer itself.
typed_layer_ref_t(const layer_map_t::value_type &v)
const message_ref_t & m_msg
Message to be sent after timeout.