2
3
6
7
8
9
10
11
13#include <so_5/impl/st_env_infrastructure_reuse.hpp>
15#include <so_5/impl/run_stage.hpp>
16#include <so_5/impl/internal_env_iface.hpp>
18#include <so_5/impl/final_dereg_chain_helpers.hpp>
20#include <so_5/disp/reuse/data_source_prefix_helpers.hpp>
22#include <so_5/environment.hpp>
23#include <so_5/env_infrastructures.hpp>
25#include <so_5/details/at_scope_exit.hpp>
26#include <so_5/details/sync_helpers.hpp>
51
52
53
54
55
69 m_demands.push_back( std::move(demand) );
73
74
75
79 this->push( std::move(demand) );
83
84
85
86
87
88
92 this->push( std::move(demand) );
98 return { m_demands.size() };
111 if( !m_demands.empty() )
113 receiver = std::move(m_demands.front());
114 m_demands.pop_front();
129
130
131
132
133
134using coop_repo_t = reusable::coop_repo_t;
140
141
142
143
146 static constexpr const char *
154
155
156
157
158
159
160
161
162template<
typename Activity_Tracker >
163using default_dispatcher_t =
173
174
175
176
177
178using stats_controller_t =
185
186
187
188
189
190
191
192
193
194
195template<
typename Activity_Tracker >
204 timer_manager_factory_t timer_factory,
206 error_logger_shptr_t error_logger,
208 coop_listener_unique_ptr_t coop_listener,
210 mbox_t stats_distribution_mbox );
213 launch( env_init_t init_fn )
override;
216 stop()
noexcept override;
222 disp_binder_shptr_t default_binder )
override;
230 coop_shptr_t coop )
noexcept override;
234 coop_shptr_t coop_name )
noexcept override;
238 const std::type_index & type_wrapper,
239 const message_ref_t & msg,
241 std::chrono::steady_clock::duration pause,
242 std::chrono::steady_clock::duration period )
override;
246 const std::type_index & type_wrapper,
247 const message_ref_t & msg,
249 std::chrono::steady_clock::duration pause )
override;
270
271
272
273
296
297
298
306 env_init_t init_fn );
310 env_init_t init_fn );
328template<
typename Activity_Tracker >
331 timer_manager_factory_t timer_factory,
332 error_logger_shptr_t error_logger,
333 coop_listener_unique_ptr_t coop_listener,
334 mbox_t stats_distribution_mbox )
346template<
typename Activity_Tracker >
353template<
typename Activity_Tracker >
363template<
typename Activity_Tracker >
367 disp_binder_shptr_t default_binder )
374template<
typename Activity_Tracker >
382template<
typename Activity_Tracker >
385 coop_shptr_t coop )
noexcept
390template<
typename Activity_Tracker >
393 coop_shptr_t coop )
noexcept
399template<
typename Activity_Tracker >
402 const std::type_index & type_wrapper,
403 const message_ref_t & msg,
405 std::chrono::steady_clock::duration pause,
406 std::chrono::steady_clock::duration period )
418template<
typename Activity_Tracker >
421 const std::type_index & type_wrapper,
422 const message_ref_t & msg,
424 std::chrono::steady_clock::duration pause )
434template<
typename Activity_Tracker >
441template<
typename Activity_Tracker >
448template<
typename Activity_Tracker >
461template<
typename Activity_Tracker >
468template<
typename Activity_Tracker >
475template<
typename Activity_Tracker >
481 "run_default_dispatcher",
497template<
typename Activity_Tracker >
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
546template<
typename Activity_Tracker >
575template<
typename Activity_Tracker >
589template<
typename Activity_Tracker >
610template<
typename Activity_Tracker >
619template<
typename Activity_Tracker >
670
671
672
673
678 if( env_params.autoshutdown_disabled() )
680 "autoshutdown feature must be enabled for "
681 "so_5::env_infrastructures::simple_not_mtsafe" );
692 using namespace impl;
694 return [infrastructure_params](
696 environment_params_t & env_params,
697 mbox_t stats_distribution_mbox )
699 ensure_autoshutdown_enabled( env_params );
701 environment_infrastructure_t * obj =
nullptr;
703 auto timer_manager_factory =
704 infrastructure_params.timer_manager();
708 const auto tracking = env_params.work_thread_activity_tracking();
709 if( work_thread_activity_tracking_t::on == tracking )
710 obj =
new env_infrastructure_t< reusable::real_activity_tracker_t >(
712 std::move(timer_manager_factory),
713 env_params.so5_error_logger(),
714 env_params.so5_giveout_coop_listener(),
715 std::move(stats_distribution_mbox) );
717 obj =
new env_infrastructure_t< reusable::fake_activity_tracker_t >(
719 std::move(timer_manager_factory),
720 env_params.so5_error_logger(),
721 env_params.so5_giveout_coop_listener(),
722 std::move(stats_distribution_mbox) );
724 return environment_infrastructure_unique_ptr_t(
726 environment_infrastructure_t::default_deleter() );
Type of smart handle for a cooperation.
A special type that plays role of unique_ptr for coop.
A class to be used as mixin without any real mutex instance inside.
Default implementation of not-thread safe single-threaded environment infrastructure.
void try_handle_next_demand() noexcept
bool final_deregister_coop(coop_shptr_t coop_name) noexcept override
Do final actions of the cooperation deregistration.
coop_unique_holder_t make_coop(coop_handle_t parent, disp_binder_shptr_t default_binder) override
Create an instance of a new coop.
void launch(env_init_t init_fn) override
Do actual launch of SObjectizer's Environment.
so_5::environment_infrastructure_t::coop_repository_stats_t query_coop_repository_stats() override
Query run-time statistics for cooperation repository.
so_5::impl::final_dereg_chain_holder_t m_final_dereg_chain
The chain of coops for the final deregistration.
void handle_expired_timers_if_any() noexcept
event_queue_impl_t m_event_queue
Queue for execution_demands which must be handled on the main thread.
stats::repository_t & stats_repository() noexcept override
Get stats repository for the environment.
Activity_Tracker m_activity_tracker
Actual activity tracker for main working thread.
reusable::direct_delivery_elapsed_timers_collector_t m_timers_collector
A collector for elapsed timers.
timer_thread_stats_t query_timer_thread_stats() override
Query run-time statistics for timer (thread or manager).
void ready_to_deregister_notify(coop_shptr_t coop) noexcept override
timer_manager_unique_ptr_t m_timer_manager
A timer manager to be used.
shutdown_status_t m_shutdown_status
Status of shutdown procedure.
void run_user_supplied_init_and_do_main_loop(env_init_t init_fn)
void perform_shutdown_related_actions_if_needed() noexcept
std::shared_ptr< default_dispatcher_t< Activity_Tracker > > m_default_disp
Dispatcher to be used as default dispatcher.
stats_controller_t m_stats_controller
Stats controller for this environment.
env_infrastructure_t(environment_t &env, timer_manager_factory_t timer_factory, error_logger_shptr_t error_logger, coop_listener_unique_ptr_t coop_listener, mbox_t stats_distribution_mbox)
void stop() noexcept override
Initiate a signal for shutdown of Environment.
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) override
Initiate a timer (delayed or periodic message).
void process_final_deregs_if_any() noexcept
stats::controller_t & stats_controller() noexcept override
Get stats controller for the environment.
void run_default_dispatcher_and_go_further(env_init_t init_fn)
void run_main_loop() noexcept
coop_repo_t m_coop_repo
Repository of registered coops.
void single_timer(const std::type_index &type_wrapper, const message_ref_t &msg, const mbox_t &mbox, std::chrono::steady_clock::duration pause) override
Initiate a delayed message.
coop_handle_t register_coop(coop_unique_holder_t coop) override
Register new cooperation.
disp_binder_shptr_t make_default_disp_binder() override
Create a binder for the default dispatcher.
void push_evt_finish(execution_demand_t demand) noexcept override
pop_result_t pop(execution_demand_t &receiver) noexcept
std::deque< execution_demand_t > m_demands
pop_result_t
Type for result of extraction operation.
void push_evt_start(execution_demand_t demand) override
stats_t query_stats() const
void push(execution_demand_t demand) override
Enqueue new event to the queue.
An implementation of dispatcher to be used in places where default dispatcher is needed.
An interface for environment_infrastructure entity.
Parameters for the SObjectizer Environment initialization.
An interface of event queue for agent.
Helper class for holding the current chain of coops for the final deregistration.
A public interface for control SObjectizer monitoring options.
An interface of data sources repository.
An indentificator for the timer.
#define SO_5_THROW_EXCEPTION(error_code, desc)
Some reusable and low-level classes/functions which can be used in public header files.
void ensure_autoshutdown_enabled(const environment_params_t &env_params)
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.
Various reusable stuff which can be used in implementation of single-threaded environment infrastruct...
shutdown_status_t
A short name for namespace with run-time stats stuff.
@ not_started
Shutdown is not started yet.
Various implementations of environment_infrastructure.
Details of SObjectizer run-time implementations.
All stuff related to run-time monitoring and statistics.
Private part of message limit implementation.
A special class for generation of names for dispatcher data sources.
static constexpr const char * disp_type_part() noexcept
Type for representation of statistical data for this event queue.
std::size_t m_demands_count
The current size of the demands queue.
Statistical data for run-time monitoring of coop repository content.
A description of event execution demand.
Statistics for run-time monitoring.