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/send_functions.hpp>
25#include <so_5/details/at_scope_exit.hpp>
26#include <so_5/details/sync_helpers.hpp>
61
62
63
64
65
66
74
75
76
77
78
91
92
93
98 sync_objects.m_wakeup_condition.notify_one();
110
111
112
113
114
130
131
132
136 std::lock_guard< std::mutex > lock( m_sync_objects.m_lock );
138 m_demands.push_back( std::move(demand) );
144
145
146
150 this->push( std::move(demand) );
154
155
156
157
158
159
163 this->push( std::move(demand) );
167
168
169
173 std::lock_guard< std::mutex > lock( m_sync_objects.m_lock );
175 return { m_demands.size() };
186
187
188
189
193 if( !m_demands.empty() )
195 receiver = std::move(m_demands.front());
196 m_demands.pop_front();
213
214
215
216
217
218using coop_repo_t = reusable::coop_repo_t;
224
225
226
227
230 static constexpr const char *
238
239
240
241
242
243
244
245
246template<
typename Activity_Tracker >
247using default_dispatcher_t =
257
258
259
260
261
269
270
271
272
273
274
275template<
typename Activity_Tracker >
284 timer_manager_factory_t timer_factory,
286 error_logger_shptr_t error_logger,
288 coop_listener_unique_ptr_t coop_listener,
290 mbox_t stats_distribution_mbox );
293 launch( env_init_t init_fn )
override;
296 stop()
noexcept override;
302 disp_binder_shptr_t default_binder )
override;
311 coop_shptr_t coop )
noexcept override;
315 coop_shptr_t coop )
noexcept override;
319 const std::type_index & type_wrapper,
320 const message_ref_t & msg,
322 std::chrono::steady_clock::duration pause,
323 std::chrono::steady_clock::duration period )
override;
327 const std::type_index & type_wrapper,
328 const message_ref_t & msg,
330 std::chrono::steady_clock::duration pause )
override;
354
355
356
357
380
381
382
390 env_init_t init_fn );
394 env_init_t init_fn );
401 std::unique_lock< std::mutex > & acquired_lock )
noexcept;
405 std::unique_lock< std::mutex > & acquired_lock )
noexcept;
409 std::unique_lock< std::mutex > & acquired_lock )
noexcept;
413 std::unique_lock< std::mutex > & acquired_lock )
noexcept;
416template<
typename Activity_Tracker >
419 timer_manager_factory_t timer_factory,
420 error_logger_shptr_t error_logger,
421 coop_listener_unique_ptr_t coop_listener,
422 mbox_t stats_distribution_mbox )
435template<
typename Activity_Tracker >
442template<
typename Activity_Tracker >
455template<
typename Activity_Tracker >
459 disp_binder_shptr_t default_binder )
466template<
typename Activity_Tracker >
474template<
typename Activity_Tracker >
477 coop_shptr_t coop )
noexcept
486template<
typename Activity_Tracker >
489 coop_shptr_t coop )
noexcept
495template<
typename Activity_Tracker >
498 const std::type_index & type_wrapper,
499 const message_ref_t & msg,
501 std::chrono::steady_clock::duration pause,
502 std::chrono::steady_clock::duration period )
518template<
typename Activity_Tracker >
521 const std::type_index & type_wrapper,
522 const message_ref_t & msg,
524 std::chrono::steady_clock::duration pause )
538template<
typename Activity_Tracker >
545template<
typename Activity_Tracker >
552template<
typename Activity_Tracker >
567template<
typename Activity_Tracker >
576template<
typename Activity_Tracker >
583template<
typename Activity_Tracker >
589 "run_default_dispatcher",
605template<
typename Activity_Tracker >
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
654template<
typename Activity_Tracker >
686template<
typename Activity_Tracker >
705template<
typename Activity_Tracker >
732template<
typename Activity_Tracker >
753template<
typename Activity_Tracker >
808 using namespace impl;
810 return [infrastructure_params](
812 environment_params_t & env_params,
813 mbox_t stats_distribution_mbox )
815 environment_infrastructure_t * obj =
nullptr;
817 auto timer_manager_factory =
818 infrastructure_params.timer_manager();
822 const auto tracking = env_params.work_thread_activity_tracking();
823 if( work_thread_activity_tracking_t::on == tracking )
824 obj =
new env_infrastructure_t< reusable::real_activity_tracker_t >(
826 std::move(timer_manager_factory),
827 env_params.so5_error_logger(),
828 env_params.so5_giveout_coop_listener(),
829 std::move(stats_distribution_mbox) );
831 obj =
new env_infrastructure_t< reusable::fake_activity_tracker_t >(
833 std::move(timer_manager_factory),
834 env_params.so5_error_logger(),
835 env_params.so5_giveout_coop_listener(),
836 std::move(stats_distribution_mbox) );
838 return environment_infrastructure_unique_ptr_t(
840 environment_infrastructure_t::default_deleter() );
Type of smart handle for a cooperation.
A special type that plays role of unique_ptr for coop.
Default implementation of multithreaded environment infrastructure.
std::shared_ptr< default_dispatcher_t< Activity_Tracker > > m_default_disp
Dispatcher to be used as default dispatcher.
stats::repository_t & stats_repository() noexcept override
Get stats repository for the environment.
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.
reusable::actual_elapsed_timers_collector_t m_timers_collector
A collector for elapsed timers.
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).
shutdown_status_t m_shutdown_status
Status of shutdown procedure.
void launch(env_init_t init_fn) override
Do actual launch of SObjectizer's Environment.
coop_handle_t register_coop(coop_unique_holder_t coop) override
Register new cooperation.
void stop() noexcept override
Initiate a signal for shutdown of Environment.
so_5::impl::final_dereg_chain_holder_t m_final_dereg_chain
The chain of coops for the final deregistration.
void perform_shutdown_related_actions_if_needed(std::unique_lock< std::mutex > &acquired_lock) noexcept
main_thread_sync_objects_t m_sync_objects
All sync objects to be shared between different parts.
void run_user_supplied_init_and_do_main_loop(env_init_t init_fn)
void try_handle_next_demand(std::unique_lock< std::mutex > &acquired_lock) noexcept
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
void process_final_deregs_if_any(std::unique_lock< std::mutex > &acquired_lock) noexcept
so_5::environment_infrastructure_t::coop_repository_stats_t query_coop_repository_stats() override
Query run-time statistics for cooperation repository.
void run_main_loop() noexcept
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 run_default_dispatcher_and_go_further(env_init_t init_fn)
bool final_deregister_coop(coop_shptr_t coop) noexcept override
Do final actions of the cooperation deregistration.
timer_manager_unique_ptr_t m_timer_manager
A timer manager to be used.
stats_controller_t m_stats_controller
Stats controller for this environment.
event_queue_impl_t m_event_queue
Queue for execution_demands which must be handled on the main thread.
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)
disp_binder_shptr_t make_default_disp_binder() override
Create a binder for the default dispatcher.
void handle_expired_timers_if_any(std::unique_lock< std::mutex > &acquired_lock) noexcept
coop_repo_t m_coop_repo
Repository of registered coops.
stats::controller_t & stats_controller() noexcept override
Get stats controller for the environment.
Activity_Tracker m_activity_tracker
Actual activity tracker for main working thread.
pop_result_t
Type for result of extraction operation.
void push(execution_demand_t demand) override
event_queue_impl_t(main_thread_sync_objects_t &sync_objects)
void push_evt_start(execution_demand_t demand) override
pop_result_t pop(execution_demand_t &receiver) noexcept
stats_t query_stats() const
std::deque< execution_demand_t > m_demands
main_thread_sync_objects_t & m_sync_objects
void push_evt_finish(execution_demand_t demand) noexcept override
An implementation of dispatcher to be used in places where default dispatcher is needed.
An interface for environment_infrastructure entity.
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.
auto unlock_do_and_lock_again(std::unique_lock< std::mutex > &acquired_lock, Action &&action) -> decltype(action())
main_thread_status_t
A short name for namespace with run-time stats stuff.
void wakeup_if_waiting(main_thread_sync_objects_t &sync_objects)
Simple single-threaded environment infrastructure with thread safety.
SO_5_FUNC environment_infrastructure_factory_t factory(params_t &¶ms)
A factory for creation of simple 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.
A bunch of sync objects which need to be shared between various parts of env_infrastructure.
main_thread_status_t m_status
The current status of the main thread.
std::condition_variable m_wakeup_condition
A condition to sleep on when no activities to handle.
std::mutex m_lock
Main lock for environment infrastructure.
Statistical data for run-time monitoring of coop repository content.
A description of event execution demand.
Statistics for run-time monitoring.