2
3
6
7
8
9
10
11
13#include <so_5/disp/prio_one_thread/strictly_ordered/pub.hpp>
15#include <so_5/disp/prio_one_thread/strictly_ordered/impl/demand_queue.hpp>
16#include <so_5/disp/prio_one_thread/reuse/work_thread.hpp>
18#include <so_5/disp/reuse/actual_work_thread_factory_to_use.hpp>
19#include <so_5/disp/reuse/data_source_prefix_helpers.hpp>
20#include <so_5/disp/reuse/make_actual_dispatcher.hpp>
22#include <so_5/stats/repository.hpp>
23#include <so_5/stats/messages.hpp>
24#include <so_5/stats/std_names.hpp>
26#include <so_5/send_functions.hpp>
54 const so_5::mbox_t & mbox,
56 so_5::disp::prio_one_thread::reuse::work_thread_with_activity_tracking_t<
57 demand_queue_t > & wt )
59 so_5::send< stats::messages::work_thread_activity >(
62 stats::suffixes::work_thread_activity(),
64 wt.take_activity_stats() );
73
74
75
76
77
78template<
typename Work_Thread >
81 friend class disp_data_source_t;
86 const std::string_view name_base,
88 : m_demand_queue{ params.queue_params().lock_factory()() }
90 so_5::disp::reuse::acquire_work_thread( params, env.get() ),
94 outliving_mutable(env.get().stats_repository()),
96 outliving_mutable(*
this)
99 m_work_thread.start();
104 m_demand_queue.stop();
105 m_work_thread.join();
124 agent_t & agent )
noexcept override
126 const auto priority = agent.so_priority();
128 agent.so_bind_to_dispatcher(
129 m_demand_queue.event_queue_by_priority( priority ) );
131 m_demand_queue.agent_bound( priority );
136 agent_t & agent )
noexcept override
138 const auto priority = agent.so_priority();
140 m_demand_queue.agent_unbound( priority );
146
147
148
149
160 const std::string_view name_base,
205 std::size_t agents_count,
206 std::size_t demands_count )
245 make( disp_binder_shptr_t binder )
noexcept
247 return { std::move( binder ) };
259 const std::string_view data_sources_name_base,
265 using dispatcher_no_activity_tracking_t =
266 impl::dispatcher_template_t<
267 work_thread_no_activity_tracking_t< impl::demand_queue_t > >;
269 using dispatcher_with_activity_tracking_t =
270 impl::dispatcher_template_t<
271 work_thread_with_activity_tracking_t< impl::demand_queue_t > >;
273 disp_binder_shptr_t binder = so_5::disp::reuse::make_actual_dispatcher<
275 dispatcher_no_activity_tracking_t,
276 dispatcher_with_activity_tracking_t >(
277 outliving_mutable(env),
278 data_sources_name_base,
281 return impl::dispatcher_handle_maker_t::make( std::move(binder) );
Alias for namespace with traits of event queue.
A handle for prio_one_thread::strictly_ordered dispatcher.
A demand queue with support of demands priorities.
static dispatcher_handle_t make(disp_binder_shptr_t binder) noexcept
Data source for run-time monitoring of whole dispatcher.
void distribute_value_for_priority(const mbox_t &mbox, priority_t priority, std::size_t agents_count, std::size_t demands_count)
outliving_reference_t< dispatcher_template_t > m_dispatcher
Dispatcher to work with.
void distribute(const mbox_t &mbox) override
Send appropriate notification about the current value.
stats::prefix_t m_base_prefix
Basic prefix for data sources.
disp_data_source_t(const std::string_view name_base, outliving_reference_t< dispatcher_template_t > disp)
void unbind(agent_t &agent) noexcept override
Unbind agent from dispatcher.
demand_queue_t m_demand_queue
Demand queue for the dispatcher.
void bind(agent_t &agent) noexcept override
Bind agent to dispatcher.
dispatcher_template_t(outliving_reference_t< environment_t > env, const std::string_view name_base, disp_params_t params)
void undo_preallocation(agent_t &) noexcept override
Undo resources allocation.
void preallocate_resources(agent_t &) override
Allocate resources in dispatcher for new agent.
Work_Thread m_work_thread
Working thread for the dispatcher.
stats::auto_registered_source_holder_t< disp_data_source_t > m_data_source
Data source for run-time monitoring.
~dispatcher_template_t() noexcept override
Interface for dispatcher binders.
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 type for storing prefix of data_source name.
An interface of data source.
void send_thread_activity_stats(const so_5::mbox_t &, const stats::prefix_t &, so_5::disp::prio_one_thread::reuse::work_thread_no_activity_tracking_t< demand_queue_t > &)
Reusable code for dispatchers with one working thread for events of all priorities.
Implementation details for dispatcher which handles prioritized events in strict order.
Dispatcher which handles events in strict order (from highest priority to lowest).
SO_5_FUNC dispatcher_handle_t make_dispatcher(environment_t &env, const std::string_view data_sources_name_base, disp_params_t params)
Create an instance of strictly_ordered dispatcher.
Dispatcher with one working thread for events of all priorities.
Reusable components for dispatchers.
All stuff related to run-time monitoring and statistics.
Private part of message limit implementation.
priority_t
Definition of supported priorities.