2
3
6
7
8
9
10
11
13#include <so_5/details/abort_on_fatal_error.hpp>
15#include <so_5/impl/mbox_iface_for_timers.hpp>
17#include <so_5/timers.hpp>
19#include <so_5/3rd_party/timertt/all.hpp>
31
32
33
34
35
36
37
38
39
40
41
42template<
class Timer >
48 typename Timer::thread_safety >;
87
88
99
100
101
102
103
104
113 std::type_index type_index,
133
134
135
136
137
138
139
140template<
class Timer_Thread >
149 std::unique_ptr< Timer_Thread > thread )
167 const std::type_index & type_index,
169 const message_ref_t & msg,
170 std::chrono::steady_clock::duration pause,
171 std::chrono::steady_clock::duration period )
override
173 auto timer = std::make_unique< timer_demand_t >(
m_thread.get() );
175 m_thread->activate( timer->timer_holder(),
185 const std::type_index & type_index,
187 const message_ref_t & msg,
188 std::chrono::steady_clock::duration pause,
189 std::chrono::steady_clock::duration period )
override
200 auto d =
m_thread->get_timer_quantities();
203 d.m_single_shot_count,
216
217
218
219
220
221
234 std::type_index type_index,
254
255
256
257
258
259
260
261template<
class Timer_Manager >
270 std::unique_ptr< Timer_Manager > manager,
284 virtual std::chrono::steady_clock::duration
286 std::chrono::steady_clock::duration default_timer )
override
288 return m_manager->timeout_before_nearest_timer( default_timer );
293 const std::type_index & type_index,
295 const message_ref_t & msg,
296 std::chrono::steady_clock::duration pause,
297 std::chrono::steady_clock::duration period )
override
299 auto timer = std::make_unique< timer_demand_t >(
m_manager.get() );
301 m_manager->activate( timer->timer_holder(),
312 const std::type_index & type_index,
314 const message_ref_t & msg,
315 std::chrono::steady_clock::duration pause,
316 std::chrono::steady_clock::duration period )
override
334 auto d =
m_manager->get_timer_quantities();
337 d.m_single_shot_count,
352
353
354
355
356
357using error_logger_for_timertt_t = std::function<
void(
const std::string &) >;
363#if defined(__clang__
)
364#pragma clang diagnostic push
365#pragma clang diagnostic ignored "-Wmissing-prototypes"
368error_logger_for_timertt_t
376 return [logger](
const std::string & msg ) {
378 stream <<
"error inside timer_thread: " << msg;
383#if defined(__clang__
)
384#pragma clang diagnostic pop
391
392
393
394
395
396using exception_handler_for_timertt_t =
397 std::function<
void(
const std::exception &) >;
403#if defined(__clang__
)
404#pragma clang diagnostic push
405#pragma clang diagnostic ignored "-Wmissing-prototypes"
408exception_handler_for_timertt_t
410 const error_logger_shptr_t & logger )
412 return [logger](
const std::exception & x ) {
415 stream <<
"exception has been thrown and caught inside "
416 "timer_thread, application will be aborted. "
417 "Exception: " << x.what();
423exception_handler_for_timertt_t
425 const error_logger_shptr_t & logger )
427 return [logger](
const std::exception & x ) {
430 stream <<
"exception has been thrown and caught inside "
431 "timer_manager, application will be aborted. "
432 "Exception: " << x.what();
438#if defined(__clang__
)
439#pragma clang diagnostic pop
443
444
445
449 error_logger_for_timertt_t,
450 exception_handler_for_timertt_t >;
455 error_logger_for_timertt_t,
456 exception_handler_for_timertt_t >;
461 error_logger_for_timertt_t,
462 exception_handler_for_timertt_t >;
468 error_logger_for_timertt_t,
469 exception_handler_for_timertt_t >;
475 error_logger_for_timertt_t,
476 exception_handler_for_timertt_t >;
482 error_logger_for_timertt_t,
483 exception_handler_for_timertt_t >;
485
486
492 error_logger_shptr_t logger )
504 error_logger_shptr_t logger,
505 unsigned int wheel_size,
506 std::chrono::steady_clock::duration granuality )
511 std::unique_ptr< timertt_thread_t > thread(
512 new timertt_thread_t
(
518 return timer_thread_unique_ptr_t(
524 error_logger_shptr_t logger )
535 error_logger_shptr_t logger,
536 std::size_t initial_heap_capacity )
541 std::unique_ptr< timertt_thread_t > thread(
542 new timertt_thread_t
(
543 initial_heap_capacity
,
547 return timer_thread_unique_ptr_t(
553 error_logger_shptr_t logger )
558 std::unique_ptr< timertt_thread_t > thread(
559 new timertt_thread_t
(
563 return timer_thread_unique_ptr_t(
569 error_logger_shptr_t logger,
584 error_logger_shptr_t logger,
587 unsigned int wheel_size,
588 std::chrono::steady_clock::duration granuality )
593 auto manager = std::make_unique< timertt_manager_t >(
600 std::move( manager ),
606 error_logger_shptr_t logger,
620 error_logger_shptr_t logger,
623 std::size_t initial_heap_capacity )
628 auto manager = std::make_unique< timertt_manager_t >(
629 initial_heap_capacity,
634 std::move( manager ),
640 error_logger_shptr_t logger,
647 auto manager = std::make_unique< timertt_manager_t >(
652 std::move( manager ),
Helper class for accessing protected members from mbox interface.
mbox_iface_for_timers_t(const mbox_t &mb)
void deliver_message_from_timer(const std::type_index &msg_type, const message_ref_t &message)
intrusive_ptr_t(intrusive_ptr_t &&o) noexcept
Move constructor.
Helper class for indication of long-lived reference via its type.
outliving_reference_t(outliving_reference_t const &o) noexcept
An indentificator for the timer.
An interface for collector of elapsed timers.
virtual void accept(std::type_index type_index, mbox_t mbox, message_ref_t msg)=0
Accept and store info about elapsed timer.
A base class for timer identificator.
An actual implementation of timer_manager.
virtual timer_thread_stats_t query_stats() override
Get statistics for run-time monitoring.
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) override
Push anonymous delayed/periodic message to the timer queue.
actual_manager_t(std::unique_ptr< Timer_Manager > manager, outliving_reference_t< timer_manager_t::elapsed_timers_collector_t > collector)
Initializing constructor.
outliving_reference_t< timer_manager_t::elapsed_timers_collector_t > m_collector
virtual bool empty() override
virtual void process_expired_timers() override
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) override
Push delayed/periodic message to the timer queue.
std::unique_ptr< Timer_Manager > m_manager
virtual std::chrono::steady_clock::duration timeout_before_nearest_timer(std::chrono::steady_clock::duration default_timer) override
Calculate time before the nearest timer (if any).
An actual implementation of timer thread.
std::unique_ptr< Timer_Thread > m_thread
virtual timer_thread_stats_t query_stats() override
Get statistics for run-time monitoring.
virtual void start() override
Launch timer.
actual_thread_t(std::unique_ptr< Timer_Thread > thread)
Initializing constructor.
virtual void finish() override
Finish timer and wait for full stop.
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) override
Push delayed/periodic message to the timer queue.
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) override
Push anonymous delayed/periodic message to the timer queue.
An actual implementation of timer interface.
timer_holder_t & timer_holder() noexcept
actual_timer_t(Timer *thread)
Initialized constructor.
virtual void release() noexcept override
Release the timer event.
timer_holder_t m_timer
Underlying timer object reference.
virtual ~actual_timer_t() noexcept override
virtual bool is_active() const noexcept override
Is this timer event is active?
Timer * m_thread
Timer thread for the timer.
A functor to be used as timer action in implementation of timer thread.
void operator()() noexcept
std::type_index m_type_index
timer_action_for_timer_manager_t(outliving_reference_t< timer_manager_t::elapsed_timers_collector_t > collector, std::type_index type_index, mbox_t mbox, message_ref_t msg)
outliving_reference_t< timer_manager_t::elapsed_timers_collector_t > m_collector
A functor to be used as timer action in implementation of timer thread.
timer_action_for_timer_thread_t(std::type_index type_index, mbox_t mbox, message_ref_t msg)
std::type_index m_type_index
void operator()() noexcept
A timer heap manager template.
A timer heap thread template.
timer_heap_thread_template(std::size_t initial_heap_capacity, Error_Logger error_logger, Actor_Exception_Handler exception_handler)
Constructor with all parameters.
A timer list thread template.
A timer list thread template.
timer_list_thread_template(Error_Logger error_logger, Actor_Exception_Handler actor_exception_handler)
Constructor with all parameters.
An intrusive smart pointer to timer demand.
A timer wheel manager template.
A timer wheel thread template.
timer_wheel_thread_template(unsigned int wheel_size, monotonic_clock::duration granularity, Error_Logger error_logger, Actor_Exception_Handler exception_handler)
Constructor with all parameters.
#define SO_5_LOG_ERROR(logger, var_name)
A special macro for helping error logging.
Some reusable and low-level classes/functions which can be used in public header files.
void abort_on_fatal_error(L logging_lambda) noexcept
Details of SObjectizer run-time implementations.
Timers implementation details.
exception_handler_for_timertt_t create_exception_handler_for_timertt_thread(const error_logger_shptr_t &logger)
exception_handler_for_timertt_t create_exception_handler_for_timertt_manager(const error_logger_shptr_t &logger)
error_logger_for_timertt_t create_error_logger_for_timertt(const error_logger_shptr_t &logger)
Private part of message limit implementation.
SO_5_FUNC timer_manager_unique_ptr_t create_timer_heap_manager(error_logger_shptr_t logger, outliving_reference_t< timer_manager_t::elapsed_timers_collector_t > collector, std::size_t initial_heap_capacity)
Create timer manager based on timer_heap mechanism.
SO_5_FUNC timer_thread_unique_ptr_t create_timer_wheel_thread(error_logger_shptr_t logger)
Create timer thread based on timer_wheel mechanism.
SO_5_FUNC timer_thread_unique_ptr_t create_timer_heap_thread(error_logger_shptr_t logger, std::size_t initial_heap_capacity)
Create timer thread based on timer_heap mechanism.
SO_5_FUNC timer_thread_unique_ptr_t create_timer_list_thread(error_logger_shptr_t logger)
Create timer thread based on timer_list mechanism.
SO_5_FUNC timer_manager_unique_ptr_t create_timer_list_manager(error_logger_shptr_t logger, outliving_reference_t< timer_manager_t::elapsed_timers_collector_t > collector)
Create timer thread based on timer_list mechanism.
SO_5_FUNC timer_manager_unique_ptr_t create_timer_wheel_manager(error_logger_shptr_t logger, outliving_reference_t< timer_manager_t::elapsed_timers_collector_t > collector)
Create timer manager based on timer_wheel mechanism.
SO_5_FUNC timer_manager_unique_ptr_t create_timer_wheel_manager(error_logger_shptr_t logger, outliving_reference_t< timer_manager_t::elapsed_timers_collector_t > collector, unsigned int wheel_size, std::chrono::steady_clock::duration granuality)
Create timer manager based on timer_wheel mechanism.
SO_5_FUNC timer_manager_unique_ptr_t create_timer_heap_manager(error_logger_shptr_t logger, outliving_reference_t< timer_manager_t::elapsed_timers_collector_t > collector)
Create timer manager based on timer_heap mechanism.
SO_5_FUNC timer_thread_unique_ptr_t create_timer_wheel_thread(error_logger_shptr_t logger, unsigned int wheel_size, std::chrono::steady_clock::duration granuality)
Create timer thread based on timer_wheel mechanism.
SO_5_FUNC timer_thread_unique_ptr_t create_timer_heap_thread(error_logger_shptr_t logger)
Create timer thread based on timer_heap mechanism.
Top-level project's namespace.
Statistics for run-time monitoring.
static std::size_t default_initial_heap_capacity()
Default initial capacity of heap-array.
static unsigned int default_wheel_size()
Default wheel size.
static monotonic_clock::duration default_granularity()
Default tick duration.
Indicator for not-thread-safe implementation.
Container for thread safety flags.