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"
18 module ALib.ThreadModel;
27using namespace std::literals::chrono_literals;
38 ALIB_WARNING(
"TMOD",
"Trigger destroyed without having run" )
41 ALIB_ERROR(
"TMOD",
"Trigger destroyed without being terminated" )
49 bool isExisting=
false;
51 if ( it.Target == &triggered ) {
60 now + ( initialWakeup ? Ticks::Duration()
65 ALIB_WARNING(
"TMOD",
"Duplicate registration of triggered object \"{}\".",
68 ALIB_WARNING(
"TMOD",
"Duplicate registration of triggered object." )
80 if(it->Target == &triggered) {
90 "Managed thread \"{}\" not found for de-registering with trigger list", triggered.
Name)
92 ALIB_MESSAGE(
"TMOD",
"Managed thread not found for de-registering with trigger list")
97 ALIB_MESSAGE(
"TMOD",
"Internal trigger-thread started" )
105 ALIB_MESSAGE(
"TMOD",
"Internal trigger-thread exiting" )
121 "Trigger::Do() called twice!\n"
122 "Hint: Did you start the trigger thread and in addition 'manually' invoked Do()?\n"
123 " Only on sort of execution is allowed." )
125 ALIB_DBG(
Dbg.AssertExclusiveWaiter= std::this_thread::get_id(); )
131 && now.
Reset() < until )
134 Ticks nextTriggerTime= until;
137 if( it.NextWakeup <= now ) {
138 it.Target->trigger();
140 it.NextWakeup= now + it.Target->triggerPeriod();
144 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.
ListMA< TriggerEntry > triggerList
The list of registered triggered objects.
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)
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)