|
| timer_list_engine () |
| Default constructor.
|
|
| timer_list_engine (Error_Logger error_logger, Actor_Exception_Handler exception_handler) |
| Constructor with all parameters.
|
|
| ~timer_list_engine () |
|
timer_object_holder< Thread_Safety > | allocate () |
| Create timer to be activated later.
|
|
template<class Duration_1 , class Duration_2 > |
bool | activate (timer_object_holder< Thread_Safety > timer, Duration_1 pause, Duration_2 period, timer_action action) |
| Activate timer and schedule it for execution.
|
|
template<class Duration_1 , class Duration_2 > |
bool | reschedule (timer_object_holder< Thread_Safety > timer, Duration_1 pause, Duration_2 period, timer_action action) |
| Perform an attempt to reschedule a timer.
|
|
void | deactivate (timer_object_holder< Thread_Safety > timer) |
| Deactivate timer and remove it from the list.
|
|
template<typename Unique_Lock > |
void | process_expired_timers (Unique_Lock &lock) |
| Build sublist of elapsed timers and process them all.
|
|
bool | empty () const |
| Is empty timer list?
|
|
monotonic_clock::time_point | nearest_time_point () const |
| Get time point of the next timer.
|
|
void | clear_all () |
| Deactivate all timers and cleanup internal data structures.
|
|
| engine_common (Error_Logger error_logger, Actor_Exception_Handler exception_handler) |
| Initializing constructor.
|
|
timer_quantities | get_timer_quantities () const |
| Get the quantities of timers of various types.
|
|
template<typename Thread_Safety, typename Time_Action, typename Error_Logger, typename Actor_Exception_Handler>
class timertt::details::timer_list_engine< Thread_Safety, Time_Action, Error_Logger, Actor_Exception_Handler >
An engine for timer list mechanism.
This engine uses double-linked list of timers as timer mechanism. This list is ordered. The head of the list is the timer with the minimum time point.
When used with timer thread then the thread sleeps until the first timer in the list elapsed. Then thread build sublist of elapsed timers and process them. Single-shot timers are removed after processing. Periodic timers rescheduled (inserted into appropriate places in the list).
- Note
- After building sublist of elapsed timers thread unblocks object mutex and calls timer actors for timers from the sublist. And locks object back right after processing. It means that actors call call timer thread object. And there won't be frequent mutex locking/unlocking operations for building and processing sublist of elapsed timers. This allows to process millions of timer actor per second.
- Attention
- This type of timer thread is good for situations where there are many timers with equal pauses and repetition periods. In that cases almost all timers will be added to the end of the list. But if there are many timers with very different pauses then operation of activating and rescheduling of timers will be too expensive. Timer thread based on timer_wheel or timer_heap is more appropriate for that scenario.
- Template Parameters
-
Thread_Safety | Thread-safety indicator. Must be timertt::thread_safety::unsafe or timertt::thread_safety::safe. |
Timer_Action | type of functor to perform an user-defined action when timer expires. This must be Moveable and MoveConstructible type. |
Error_Logger | type of logger for errors detected during timer thread execution. Interface for error logger is defined by default_error_logger class. |
Actor_Exception_Handler | type of handler for dealing with exceptions thrown from timer actors. Interface for exception handler is defined by default_actor_exception_handler. |
Definition at line 1651 of file 3rd_party/timertt/all.hpp.
template<typename Thread_Safety , typename Time_Action , typename Error_Logger , typename Actor_Exception_Handler >
template<class Duration_1 , class Duration_2 >
Activate timer and schedule it for execution.
- Returns
- true if the new timer is the first timer in the list.
- Exceptions
-
std::exception | If timer thread is not started. |
std::exception | If timer is already activated. |
- Template Parameters
-
Duration_1 | actual type which represents time duration. |
Duration_2 | actual type which represents time duration. |
- Parameters
-
timer | Timer to be activated. |
pause | Pause for timer execution. |
period | Repetition period. If Duration_2::zero() == period then timer will be single-shot. |
action | Action for the timer. |
Definition at line 1715 of file 3rd_party/timertt/all.hpp.
template<typename Thread_Safety , typename Time_Action , typename Error_Logger , typename Actor_Exception_Handler >
template<class Unique_Lock >
Execute all active timers in the sublist.
Object is unlocked and locked back after sublist processing.
- Parameters
-
lock | Object lock. This lock will be unlocked before execution of actions and locked back after. |
head | Head of execution list. Cannot be nullptr. |
Definition at line 2118 of file 3rd_party/timertt/all.hpp.
template<typename Thread_Safety , typename Time_Action , typename Error_Logger , typename Actor_Exception_Handler >
Insert timer to the list.
Insertion starts from the tail of the list. And if timer has lower timer_type::m_whan value then the last list item there is an loop of searching appropriate place by going to the head of the list.
Doesn't increment reference count for timer.
- Parameters
-
timer | Timer to be inserted. |
Definition at line 2006 of file 3rd_party/timertt/all.hpp.
template<typename Thread_Safety , typename Time_Action , typename Error_Logger , typename Actor_Exception_Handler >
template<typename Unique_Lock >
Build sublist of elapsed timers and process them all.
Object is unlocked and then locked back.
- Parameters
-
Definition at line 1872 of file 3rd_party/timertt/all.hpp.
template<typename Thread_Safety , typename Time_Action , typename Error_Logger , typename Actor_Exception_Handler >
template<class Duration_1 , class Duration_2 >
Perform an attempt to reschedule a timer.
Before v.1.2.1 there was just one way to reschedule a timer: method deactivate() must be called first and then method activate() must be called for the same timer. This approach is not fast because in the case of thread-safe engines it requires two operations on a mutex.
Since v.1.2.1 there is a reschedule() method which does deactivation of a timer (if it is active) and then new activation of this timer. All actions are performed by using just one operation on a mutex.
- Note
- This operation can fail if the timer to be rescheduled is in processing. Because of that it is recommended to use such operation for timer_managers only. But even with timer_managers this operation should be used with care.
- Attention
- It move operator for a timer_action throws then timer will be deactivated. The state for a timer_action itself will be unknown.
- Exceptions
-
std::exception | If timer thread is not started. |
std::exception | If timer is in processing right now. |
- Template Parameters
-
Duration_1 | actual type which represents time duration. |
Duration_2 | actual type which represents time duration. |
- Since
- v.1.2.1
- Parameters
-
timer | Timer to be rescheduled. |
pause | Pause for timer execution. |
period | Repetition period. If Duration_2::zero() == period then timer will be single-shot. |
action | Action for the timer. |
Definition at line 1782 of file 3rd_party/timertt/all.hpp.
template<typename Thread_Safety , typename Time_Action , typename Error_Logger , typename Actor_Exception_Handler >
Process list of elapsed timers after execution of its actions.
Active periodic timers will be rescheduled. All other timers will be deactivated and removed.
- Parameters
-
head | Head of execution list. Cannot be null. |
Definition at line 2174 of file 3rd_party/timertt/all.hpp.