8#if !defined(ALIB_C20_MODULES) || ((ALIB_C20_MODULES != 0) && (ALIB_C20_MODULES != 1))
9# error "Symbol ALIB_C20_MODULES has to be given to the compiler as either 0 or 1"
27using namespace std::literals::chrono_literals;
41 ALIB_WARNING(
"MGTHR",
"Trigger destroyed without having run" )
45 ALIB_ERROR(
"MGTHR",
"Trigger destroyed without being terminated" )
55 bool isExisting=
false;
57 if ( it.Target == &triggered )
67 now + ( initialWakeup ? Ticks::Duration()
72 ALIB_WARNING(
"MGTHR",
"Duplicate registration of triggered object \"{}\".",
75 ALIB_WARNING(
"MGTHR",
"Duplicate registration of triggered object." )
89 if(it->Target == &triggered)
103 "Managed thread \"{}\" not found for de-registering with trigger list", triggered.
Name)
105 ALIB_MESSAGE(
"MGTHR",
"Managed thread not found for de-registering with trigger list")
112 ALIB_MESSAGE(
"MGTHR",
"Internal trigger-thread started" )
120 ALIB_MESSAGE(
"MGTHR",
"Internal trigger-thread exiting" )
137 "Trigger::Do() called twice!\n"
138 "Hint: Did you start the trigger thread and in addition 'manually' invoked Do()?\n"
139 " Only on sort of execution is allowed." )
141 ALIB_DBG(
Dbg.AssertExclusiveWaiter= std::this_thread::get_id(); )
147 && now.
Reset() < until )
150 Ticks nextTriggerTime= until;
154 if( it.NextWakeup <= now )
156 it.Target->trigger();
158 it.NextWakeup= now + it.Target->triggerPeriod();
162 nextTriggerTime= (std::min)(nextTriggerTime, it.NextWakeup);
ALIB_DLL void Add(Triggered &triggered, bool initialWakeup=false)
bool internalThreadMode
Denotes whether or not the trigger is currently used in internal thread mode.
virtual ALIB_DLL void Run() override
Implementation of the parent interface (virtual abstract).
virtual ALIB_DLL void Stop()
Stops the trigger thread and joins it.
ALIB_DLL void Do(Ticks until)
List< MonoAllocator, TriggerEntry > triggerList
The list of registered triggered objects.
ALIB_DLL void Remove(Triggered &triggered)
ALIB_DLL Trigger()
Constructor.
virtual ALIB_DLL void Start()
virtual ALIB_DLL ~Trigger() override
Destructor.
virtual Ticks::Duration triggerPeriod()=0
@ Started
Method Start was invoked but not running, yet.
@ Terminated
The thread is terminated.
Thread(const character *pName=A_CHAR(""))
virtual ALIB_DLL void Join()
State state
Internal flag to indicate if the thread is alive.
static Ticks EndOfEpoch()
#define ALIB_MESSAGE(domain,...)
#define ALIB_COMMA_CALLER_PRUNED
#define ALIB_WARNING(domain,...)
#define ALIB_ERROR(domain,...)
#define ALIB_LOCK_RECURSIVE_WITH(lock)
#define ALIB_ASSERT_ERROR(cond, domain,...)
#define ALIB_CALLER_PRUNED
constexpr void SetNull(T &t)
constexpr bool IsNull(const T &t)
ALIB_DLL RecursiveLock GLOBAL_ALLOCATOR_LOCK
time::Ticks Ticks
Type alias in namespace alib.
void WaitForNotification(ALIB_DBG_TAKE_CI)
TCondition(const character *dbgName)
void Acquire(ALIB_DBG_TAKE_CI)
void ReleaseAndNotify(ALIB_DBG_TAKE_CI)