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
73
74
75
83
84
85
86
87
88
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 )
338 std::move(error_logger),
342 std::move(stats_distribution_mbox)
,
346template<
typename Activity_Tracker >
353template<
typename Activity_Tracker >
363template<
typename Activity_Tracker >
367 disp_binder_shptr_t default_binder )
371 std::move(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 )
431 std::chrono::milliseconds::zero()
);
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",
484 default_dispatcher_t< Activity_Tracker > >(
492 [
this, init_func=std::move(init_fn)] {
497template<
typename Activity_Tracker >
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519 optional< std::exception_ptr > exception_from_init;
529 exception_from_init = std::current_exception();
542 if( exception_from_init )
543 std::rethrow_exception( *exception_from_init );
546template<
typename Activity_Tracker >
575template<
typename Activity_Tracker >
589template<
typename Activity_Tracker >
610template<
typename Activity_Tracker >
619template<
typename Activity_Tracker >
639 const auto sleep_time =
642 std::chrono::hours(24)
);
644 std::this_thread::sleep_for( sleep_time );
658 auto work_tracking_stopper =
so_5::
details::at_scope_exit(
670
671
672
673
680 "autoshutdown feature must be enabled for "
681 "so_5::env_infrastructures::simple_not_mtsafe" );
689SO_5_FUNC environment_infrastructure_factory_t
692 using namespace impl;
694 return [infrastructure_params](
697 mbox_t stats_distribution_mbox )
703 auto timer_manager_factory =
712 std::move(timer_manager_factory)
,
715 std::move(stats_distribution_mbox)
);
719 std::move(timer_manager_factory)
,
722 std::move(stats_distribution_mbox)
);
724 return environment_infrastructure_unique_ptr_t(
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.
Parameters for simple not-thread-safe single-thread environment.
const timer_manager_factory_t & timer_manager() const
Getter for timer_manager factory.
bool has_live_coop()
Is there any live coop?
coop_repo_t(outliving_reference_t< environment_t > env, coop_listener_unique_ptr_t coop_listener)
Initializing constructor.
An implementation of dispatcher to be used in places where default dispatcher is needed.
stats_controller_t(mbox_t distribution_mbox, mbox_t next_turn_mbox)
Initializing constructor.
An interface for environment_infrastructure entity.
static environment_infrastructure_deleter_fnptr_t default_deleter()
Default deleter for environment_infrastructure object.
Parameters for the SObjectizer Environment initialization.
bool autoshutdown_disabled() const
Is autoshutdown disabled?
coop_listener_unique_ptr_t so5_giveout_coop_listener()
Get cooperation listener.
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.
An interface of event queue for agent.
coop_unique_holder_t make_coop(coop_handle_t parent, disp_binder_shptr_t default_binder)
Create an instance of a new coop.
void deregister_all_coop() noexcept
Deregisted all cooperations.
final_deregistration_result_t final_deregister_coop(coop_shptr_t coop) noexcept
Do final actions of the cooperation deregistration.
environment_infrastructure_t::coop_repository_stats_t query_stats()
Get the current statistic for run-time monitoring.
coop_handle_t register_coop(coop_unique_holder_t agent_coop)
Register cooperation.
Helper class for holding the current chain of coops for the final deregistration.
std::size_t size() const noexcept
void append(coop_shptr_t coop) noexcept
bool empty() const noexcept
coop_shptr_t giveout_current_chain() noexcept
A public interface for control SObjectizer monitoring options.
static mbox_t make(environment_t &env)
Helper for simplify creation of that mboxes of that type.
An interface of data sources repository.
An indentificator for the timer.
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_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.
virtual timer_thread_stats_t query_stats()=0
Get statistics for run-time monitoring.
#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.
@ must_be_started
Shutdown must be started as soon as possible.
@ completed
Shutdown completed and work of environment must be finished.
@ not_started
Shutdown is not started yet.
@ in_progress
Shutdown is initiated but not finished yet.
Various implementations of environment_infrastructure.
Details of SObjectizer run-time implementations.
void process_final_dereg_chain(coop_shptr_t head) noexcept
Helper function that does proceesing of final dereg chain.
void wrap_init_fn_call(Init_Fn init_fn)
A special wrapper for calling init function.
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.
const int rc_autoshutdown_must_be_enabled
An attempt to launch environment with autoshutdown disabled in conditions where autoshutdown must be ...
work_thread_activity_tracking_t
Values for dispatcher's work thread activity tracking.
outliving_reference_t< T > outliving_mutable(T &r)
Make outliving_reference wrapper for mutable reference.
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.
std::size_t m_total_coop_count
Count of cooperations inside the environment.
std::size_t m_total_agent_count
Count of registered agents.
A description of event execution demand.
Statistics for run-time monitoring.