Activity-Lang: setup skeleton of the activation function

- complete spec of Activity processing
- define the invocation structure
- implement basic cases of activation
This commit is contained in:
Fischlurch 2023-07-30 21:45:31 +02:00
parent 4f29d436b3
commit 26c2e835c3
5 changed files with 296 additions and 85 deletions

View file

@ -64,6 +64,8 @@ namespace gear {
// using util::isnil;
// using std::string;
namespace error = lumiera::error;
class Activity;
@ -96,6 +98,18 @@ namespace gear {
};
/**
* Result instruction from Activity activation.
* These codes are used by the ActivityLang to
* coordinate further processing of activity chains.
*/
enum Proc {PASS ///< pass on the activation down the chain
,SKIP ///< skip rest of the Activity chain for good
,KILL ///< obliterate the complete Activity-Term and all its dependencies
,HALT ///< abandon this play / render process
};
/**
* Definition to emulate a _Concept_ for the *Execution Context*.
* The Execution Context need to be passed to any Activity _activation;_
@ -104,7 +118,7 @@ namespace gear {
*/
template<class EXE>
constexpr void
_check_is_usable_as_ExecutionContext ()
_verify_usable_as_ExecutionContext ()
{
#define ASSERT_MEMBER_FUNCTOR(_EXPR_, _SIG_) \
static_assert (lib::meta::has_Sig<decltype(_EXPR_), _SIG_>(), \
@ -113,7 +127,10 @@ namespace gear {
EXE const& ctx = std::declval<EXE>();
ASSERT_MEMBER_FUNCTOR (ctx.post, void(Activity&, EXE&));
ASSERT_MEMBER_FUNCTOR (ctx.post, Proc(Activity&, EXE&, Time));
ASSERT_MEMBER_FUNCTOR (ctx.work, void(Time, size_t));
ASSERT_MEMBER_FUNCTOR (ctx.done, void(Time, size_t));
ASSERT_MEMBER_FUNCTOR (ctx.tick, Proc(Time));
#undef ASSERT_MEMBER_FUNCTOR
@ -138,12 +155,12 @@ namespace gear {
public:
/** All possible kinds of activities */
enum Verb {INVOKE ///< dispatch a JobFunctor into a worker thread
,TIMESTART ///< signal start of some processing (for timing measurement)
,TIMESTOP ///< correspondingly signal end of some processing
,WORKSTART ///< signal start of some processing and transition *grooming mode* ⟼ *work mode
,WORKSTOP ///< correspondingly signal end of some processing
,NOTIFY ///< push a message to another Activity
,GATE ///< probe window + count-down; activate next Activity, else re-schedule
,FEED ///< supply additional payload data for a preceding Activity
,POST ///< post a message providing a chain of further time-bound Activities
,FEED ///< supply additional payload data for a preceding Activity
,TICK ///< internal engine »heart beat« for internal maintenance hook(s)
};
@ -168,7 +185,7 @@ namespace gear {
/** Timing observation to propagate */
struct Timing
{
Instant instant;
Instant instant; ///////////////////////////////////////////////////////////////////TICKET #1317 : what time do we actually need to transport here, in addition to the invocation time (added automatically)?
size_t quality;
};
@ -268,6 +285,15 @@ namespace gear {
{ }
/********************************************************//**
* Core Operation: _Activate_ and _perform_ this Activity.
* @tparam EXE concrete binding for the _execution context_
* @param now current _»wall clock time« (time used for scheduling)
*/
template<class EXE>
activity::Proc activate (EXE& executionCtx, Time now);
private:
void
setDefaultArg (Verb verb) noexcept
@ -277,8 +303,8 @@ namespace gear {
case INVOKE:
data_.invocation.time = Time::ANYTIME;
break;
case TIMESTART:
case TIMESTOP:
case WORKSTART:
case WORKSTOP:
data_.timing.instant = Time::NEVER;
break;
case GATE:
@ -293,9 +319,112 @@ namespace gear {
break;
}
}
activity::Proc
invokeFunktor (Time) noexcept
{
REQUIRE (verb_ == INVOKE);
REQUIRE (next);
REQUIRE (next->verb_ == FEED);
REQUIRE (next->next);
REQUIRE (next->next->verb_ == FEED);
REQUIRE (data_.invocation.task);
JobClosure& functor = static_cast<JobClosure&> (*data_.invocation.task); /////////////////////TICKET #1287 : fix actual interface down to JobFunctor (after removing C structs)
lumiera_jobParameter param;
param.nominalTime = _raw(Time{data_.invocation.time});
param.invoKey.part.a = next->data_.feed.one;
param.invoKey.part.b = next->data_.feed.two;
//////////////////////////////////////////////////////////////////////////////////TICKET #1295 : rework Job parameters to accommodate input / output info required for rendering
try {
functor.invokeJobOperation (param);
}
ON_EXCEPTION_RETURN (activity::HALT, "Render Job invocation");
//
return activity::PASS;
}
template<class EXE>
activity::Proc
signalStart (EXE& executionCtx, Time now)
{
executionCtx.work (now, data_.timing.quality);
return activity::PASS;
}
template<class EXE>
activity::Proc
signalStop (EXE& executionCtx, Time now)
{
executionCtx.done (now, data_.timing.quality);
return activity::PASS;
}
template<class EXE>
activity::Proc
dispatchNotify (EXE& executionCtx, Time now)
{
UNIMPLEMENTED ("double-dispatch a notification trigger");
return executionCtx.post (*next, executionCtx, now);
}
template<class EXE>
activity::Proc
checkGate (EXE& executionCtx, Time now)
{
UNIMPLEMENTED ("evaluate GATE condition and branch accordingly");
return executionCtx.post (*next, executionCtx, now);
}
template<class EXE>
activity::Proc
postChain (EXE& executionCtx, Time now)
{
REQUIRE (next);
return executionCtx.post (*next, executionCtx, now);
}
template<class EXE>
activity::Proc
doTick (EXE& executionCtx, Time now)
{
return executionCtx.tick (now);
}
};
template<class EXE>
activity::Proc
Activity::activate (EXE& executionCtx, Time now)
{
activity::_verify_usable_as_ExecutionContext<EXE>();
switch (verb_) {
case INVOKE:
return invokeFunktor (now);
case WORKSTART:
return signalStart (executionCtx, now);
case WORKSTOP:
return signalStop (executionCtx, now);
case NOTIFY:
return dispatchNotify (executionCtx, now);
case GATE:
return checkGate (executionCtx, now);
case POST:
return postChain (executionCtx, now);
case FEED:
return activity::PASS;
case TICK:
return doTick (executionCtx, now);
default:
NOTREACHED ("uncovered Activity verb in activation function.");
}
}
}} // namespace vault::gear
#endif /*SRC_VAULT_GEAR_ACTIVITY_H_*/

View file

@ -141,6 +141,7 @@ struct lumiera_jobParameter_struct
InvocationInstanceID invoKey;
//////////////////////////////////////////////////////////////TODO: place an additional parameter value here, or make the instanceID globally unique?
////////////////////////////////////////////////////////////////////////////////////TICKET #1293 job invocation identity
////////////////////////////////////////////////////////////////////////////////////TICKET #1295 : rework Job parameters to accommodate input / output info required for rendering
};
typedef struct lumiera_jobParameter_struct lumiera_jobParameter;
typedef lumiera_jobParameter* LumieraJobParameter;

View file

@ -166,13 +166,13 @@ namespace test {
// allocate a new Activity into the next free slot (using a faked AllocatorHandle)
BlockFlow::AllocatorHandle allocHandle{alloc.begin(), nullptr};
Activity& timeStart = allocHandle.create (Activity::TIMESTART);
Activity& timeStart = allocHandle.create (Activity::WORKSTART);
CHECK (isSameObject (timeStart, epoch[extent.size()-1]));
// this Activity object is properly initialised (and memory was altered)
CHECK (epoch[extent.size()-1].data_.timing.instant != Time(5,5));
CHECK (epoch[extent.size()-1].data_.timing.instant == Time::NEVER);
CHECK (timeStart.verb_ == Activity::TIMESTART);
CHECK (timeStart.verb_ == Activity::WORKSTART);
CHECK (timeStart.data_.timing.instant == Time::NEVER);
CHECK (timeStart.data_.timing.quality == 0);

View file

@ -6858,7 +6858,7 @@ At first sight the link between asset and clip-MO is a simple logical relation b
{{red{Note 1/2015}}} several aspects regarding the relation of clips and single/multichannel media are not yet settled. There is a preliminary implementation in the code base, but it is not sure yet how multichnnel media will actually be modelled. Currently, we tend to treat the channel multiplicity rather as a property of the involved media, i.e we have //one// clip object.</pre>
</div>
<div title="RenderActivity" creator="Ichthyostega" modifier="Ichthyostega" created="202304140145" modified="202307272318" tags="Rendering spec draft" changecount="12">
<div title="RenderActivity" creator="Ichthyostega" modifier="Ichthyostega" created="202304140145" modified="202307301650" tags="Rendering spec draft" changecount="13">
<pre>//Render Activities define the execution language of the render engine.//
The [[Scheduler]] maintains the ability to perform these Activities, in a time-bound fashion, observing dependency relations; activities allow for notification of completed work, tracking of dependencies, timing measurements, re-scheduling of other activities -- and last but not least the dispatch of actual [[render jobs|RenderJob]]. Activities are what is actually enqueued with priority in the scheduler implementation, they are planned for a »µ-tick slot«, activated once when the activation time is reached, and then forgotten. Each Activity is a //verb//, but can be inhibited by conditions and carry operation object data. Formally, activating an Activity equates to a predication, and the subject of that utterance is »the render process«.
@ -6866,9 +6866,9 @@ The [[Scheduler]] maintains the ability to perform these Activities, in a time-b
;invoke
:dispatches a JobFunctor into an appropriate worker thread, based on the job definition's execution spec
:no further dependency checks; Activities attached to the job are re-dispatched after the job function's completion
;timestart
;workstart
:signal start of some processing -- for the purpose of timing measurement, but also to detect crashed tasks
;timestop
;workstop
:correspondingly signal end of some processing
;notify
:push a message to another Activity or process record
@ -7039,7 +7039,7 @@ __see also__
&amp;rarr; the protocol [[how to operate the nodes|NodeOperationProtocol]]
</pre>
</div>
<div title="RenderOperationLogic" creator="Ichthyostega" modifier="Ichthyostega" created="202307272322" modified="202307280012" tags="Rendering operational draft" changecount="4">
<div title="RenderOperationLogic" creator="Ichthyostega" modifier="Ichthyostega" created="202307272322" modified="202307301650" tags="Rendering operational draft" changecount="12">
<pre>//The operational logic of Activity execution is the concrete service provided by the [[Scheduler]] to implement interwoven [[render Activities|RenderActivity]] and [[Job execution|RenderJob]].//
* logically, each {{{Activity}}} record represents a //verb// to describe some act performed by »the render process«
* the {{{ActivityLang}}} provides a //builder notation// to build „sentences of activities“ and it sets the framework for //execution// of Activities
@ -7049,65 +7049,76 @@ __see also__
!Framework for Activity execution
The individual {{{Activity}}} records serve as atomic execution elements; an Activity can be invoked once, either by time-bound trigger in the Scheduler's priority queue, or by receiving an activation message (directly when in //management mode,// indirectly through the invocation queue else). The data structure of the {{{Activity}}} record (&amp;rarr; [[description|RenderActivity]]) is maintained by the [[»block flow« memory allocation scheme|SchedulerMemory]] and can be considered stable and available (within the logical limits of its definition, which means until the overarching deadline has passed). The ''activation'' of an Activity causes the invocation of a hard-wired execution logic, taking into account the //type field// of the actual {{{Activity}}} record to be »performed«. This hard-wired logic however can be differentiated into a //generic// part (implemented directly in {{{class Activity}}}) and a //contextual// part, which is indirected through a ''λ-binding'', passed as ''execution context'', yet actually implemented by functions of ''Scheduler Layer-2''.
!!!execution patterns
Since the render engine can be considered performance critical, only a fixed set of //operational patterns// is supported, implemented with a minimum of indirections and thus with limited configurability. It seems indicated to confine the scope of this operational logic to a finite low-level horizon, assuming that //all relevant high-level render activities// can actually be expressed in terms of these fundamental patters, in combination with an opaque JobFunctor.
;Frame render Job
:Invocaton of a ~CPU-bound calculation function working in-memory to generate data into output buffers
Since the render engine can be considered performance critical, only a fixed set of //operational patterns// is supported, implemented with a minimum of indirections and thus with limited configurability. It seems indicated to confine the scope of this operational logic to a finite low-level horizon, assuming that //all relevant high-level render activities// can actually be //expressed in terms of these fundamental patterns,// in combination with an opaque JobFunctor.
;Frame Render Job
:Invocation of a ~CPU-bound calculation function working in-memory to generate data into output buffers
:* {{{POST}}} : defines the ''contextual timing parameters'', which are the //start time// and the //deadline//
:** causes a chain of Activities to be put in action
:** these Activities are chained-up (hooked onto the {{{next}}} pointer)
:** depending on the //invocation context...//
:*** in ''grooming mode'' (i.e. the current worker holds the {{{GroomingToken}}}) the follow-up activation happens synchronously
:*** in ''work mode'' (i.e. the {{{GroomingToken}}} has been dropped) the Scheduler internals //must not be altered;// the chain has to be dispatched
:** ⟹ the Activity Language invokes the ''λ-post''
:** ⟹ the Activity Language invokes the ''λ-post''.
:* {{{GATE}}} : provides a check-point to ensure the preconditions are met
:** the current //wall-clock-time// is checked against the //deadline//
:** moreover, a //prerequisite count// is checked, allowing passage only if the count has been ticked off to zero
:** while surpassing the deadline simply obliterates all chained Activities, unmet prerequisites cause a spinning delay-and-recheck
:** the count-down of prerequisites is caused by receiving a ''notification'' (either externally, or from a {{{NOTIFY}}}-Activity)
:** receiving such a notification causes re-evaluation of the condition and possibly activation of the chain
:** ⟹ the Activity Language evaluates the condition (prerequisite ≡ 0 and before deadline)
:** ⟹ the Activity Language evaluates the condition {prerequisite ≡ 0 and before deadline}.
:*** when still blocked, the {{{GATE}}} is re-issued through invocation of ''λ-post'' with a re-check delay
:*** otherwise the chained Activities are activated
:* {{{TIMESTART}}} : mark the start of ''render calculations'' and leave the ''grooming mode''
:* {{{WORKSTART}}} : mark the start of ''render calculations'' and transition ''grooming mode'' ⟼ ''work mode''
:** the current time and a payload argument is emitted as message -- for self-regulation of the render engine
:** the {{{GroomingToken}}} is dropped, allowing other [[workers|SchedulerWorker]] to enter grooming mode and to retrieve further jobs.
:** ⟹ the Activity Language invokes the ''λ-start''
INVOKE
FEED
TIMESTOP
(optional) NOTIFY
Ankerpunkte
Gate wird nur bei Bedarf eingeschleift
dies muß aber vor dem Instruct() passieren
Media-Decoder-Job
zu erstellen
IO-Trigger
POST
Zeitfenster aus Job-Planning
frühestmoglich Start-Zeit / Deadline
(optional) GATE
TIMESTART
das ist der Gefahrenübergang
INVOKE
FEED
IO-Callback
(ggfs: Callback-entrance Closure)
TIMESTOP
NOTIFY
Ankerpunkte
Gate nur bei Bedarf
Flag für Asynchronen Job
Planungs-Job
zu erstellen
Achtung: hier kein Übergang in die Hintergrundverarbeitung
POST
INVOKE
FEED
Tick
einfache Builder-Funktion
wird nur einmal erzeugt
reproduziert sich dann selbst
:** ⟹ the Activity Language invokes the ''λ-work''.
:* {{{INVOKE}}} : actually invoke the JobFunctor given as immediate argument
:** a fixed number of further {{{size_t}}} arguments are retrieved from the {{{FEED}}}-Activities following next
:** all currently foreseeable render operations invoked from here do not need more than 4 fixed arguments (the rest being prepared by the Builder)
:** ⟹ the Activity Language directly invokes the ''~JobFunctor'', in the current thread, which thus might be blocked indefinitely.
:* {{{FEED}}} : used to transport argument data for render operations
:** ⟹ the Activity Language skips this {{{Activity}}} record, passing activation
:* {{{WORKSTOP}}} : mark the end of ''render calculations''
:** ⟹ the Activity Language invokes the ''λ-done''.
:** the current time and a payload argument is emitted as message -- for self-regulation of the render engine
:** logically, the current worker is now free for further work -- which is attained implicitly
:* {{{NOTIFY}}} (optional) : pass a trigger event to some other Activity dependant on the current render operation's results
:** the actual trigger is //double dispatched// -- depending on the target Activity given as argument
:** ⟹ the Activity Language ...
:*** for a {{{GATE}}} as target ⟹ //triggers// the gate, which implies to decrement the dependency counter, possibly activating the chain
:*** -- //further special trigger cases may be {{red{added later}}}// --
:*** for any other target Activity ⟹ invoke the ''λ-post'' ⟹ contend for acquiring the {{{GroomingToken}}} to re-enter ''grooming mode''
;Media Reader Job
:Retrieve raw media data from external storage, using ''asynchronous IO''
:this task is encoded in two separate Activity chains, where the second chain shall be activated by an asynchronous callback
:* {{{POST}}} : similar to Frame Rendering, this is the entrance point and defines ''contextual timing parameters''
:* {{{GATE}}} (optional) : can be inserted to hold back the data loading until some further prerequisites are met or to enforce a deadline
:* {{{WORKSTART}}} : mark the start of ''IO activity'' and enter ''work mode'' (including ramifications for error handling)
:* {{{INVOKE}}} : in this case implies launching a system call to post the asynchronous IO request
:** the coordinates of the media to be accessed are not given directly; they are rather encoded into the render nodes by the Builder
:** yet the actual frame number is retrieved as argument from the following {{{FEED}}}
:** typically, a block of data is loaded, while subsequent Media Reading Jobs will re-use this block (without actually causing IO)
:** ⟹ the Activity Language directly invokes the ''~JobFunctor'', in the current thread, typically non-blocking, but possibly causing failure
:* {{{FEED}}} : argument data package for the preceding invocation, otherwise ignored and passed
;IO Callback
:Entrance point activated from an external callback closure after asynchronous operations
:the external callback is required somehow to include the specific {{{Activity}}} record starting this chain...
:* {{{WORKSTOP}}} : mark the end of ''IO activities''
:* {{{NOTIFY}}} : pass the trigger event to signal availability of the retrieved data for processing
:** ⟹ the {{{Activity}}} record given as receiver represents the follow-up calculation (or IO) task to commence
;Planning Job
:Periodically establish the next chunk of ~Activity-Terms for an continuously ongoing [[stream of calculations|CalcStream]]
:notably this kind of Job entails enqueueing further {{{Activity}}} records and thus must be performed entirely in ''grooming mode''
:* {{{POST}}} : similar to the other cases, this is the entrance point and defines ''contextual timing parameters''
:* {{{INVOKE}}} : invokes a special ''~JobFunctor'' acting as //continuation closure//
:** here the further arguments are used to link back to a {{{RenderDrive}}} maintained as part of a running CalcStream
:** further continuation information is embedded into the JobPlanningPipeline enclosed therein
:** ⟹ the Activity Language directly invokes the ''~JobFunctor'', in this case to perform the planning and scheduling definition
:* {{{FEED}}} : argument data package for the preceding planning task
;Tick
:Internal periodical maintenance duty cycle
:* {{{TICK}}} : a special marker Activity, which re-inserts itself on each activation and performs an internal hook of the Render Engine
:** ⟹ the Activity Language invokes the ''λ-work''
</pre>
</div>
<div title="RenderProcess" modifier="Ichthyostega" created="200706190705" modified="201112162056" tags="Rendering operational">

View file

@ -77888,23 +77888,19 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</body>
</html></richcontent>
</node>
<node CREATED="1684980900583" ID="ID_896772403" MODIFIED="1687733911963" TEXT="timestart">
<node CREATED="1684980900583" ID="ID_896772403" MODIFIED="1690736112488" TEXT="workstart">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
signal start of some processing &#8212;&#160;for the purpose of timing measurement, but also to detect crashed tasks
signal start of some processing &#8212;&#160;for the purpose of timing measurement, but also to detect crashed tasks; beyond that, also transition from <b>grooming mode</b>&#160;&#10236; <b>work mode</b>
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1684980900585" ID="ID_1179349638" MODIFIED="1687733917360" TEXT="timestop">
<node CREATED="1684980900585" ID="ID_1179349638" MODIFIED="1690736116802" TEXT="workstop">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
correspondingly signal end of some processing
@ -78067,7 +78063,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1688601865955" ID="ID_1274992770" MODIFIED="1688601871022" TEXT="timestart|stop">
<node CREATED="1688601865955" ID="ID_1274992770" MODIFIED="1690736031094" TEXT="workstart|stop">
<node CREATED="1688601873323" ID="ID_1142615782" MODIFIED="1688601877397" TEXT="Time"/>
<node CREATED="1688602420417" ID="ID_186416345" MODIFIED="1688602445794" TEXT="observable-ID"/>
</node>
@ -78097,6 +78093,18 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1688642872398" ID="ID_1043417945" MODIFIED="1688642947743" TEXT="Job-Argumente in eine Kette von Datenbl&#xf6;cken legen"/>
<node CREATED="1688642986094" ID="ID_1753772146" MODIFIED="1688643010373" TEXT="Zeitfenster-Angaben nach M&#xf6;glichkeit kontextuell bereitstellen"/>
<node CREATED="1690737049353" ID="ID_1475155102" MODIFIED="1690740515276" TEXT="vorerst auf 64bit-Maschinen zugeschnitten">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...wir arbeiten komplett unter dem Schutz des Typsystemts, und deshalb werden auf 32bit-Maschinen trotzdem 64bit f&#252;r die Zeitangaben bereitgestellt, zuz&#252;glich Alignment; theoretisch k&#246;nnte man ein spezielles Encoding f&#252;r den &#187;Instant&#171; definieren, das nur int32_t ben&#246;tigt; das betrachte ich allerdings als Optimierung
</p>
</body>
</html></richcontent>
<linktarget COLOR="#797bad" DESTINATION="ID_1475155102" ENDARROW="Default" ENDINCLINATION="-1330;67;" ID="Arrow_ID_1076799185" SOURCE="ID_554665430" STARTARROW="None" STARTINCLINATION="-437;30;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1688643151608" ID="ID_1226022994" MODIFIED="1688643202164">
<richcontent TYPE="NODE"><html>
<head>
@ -78200,12 +78208,12 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1688998857100" ID="ID_875955760" MODIFIED="1688998863575" TEXT="Deadline aus POST-Deadline"/>
<node CREATED="1688998870698" ID="ID_40546286" MODIFIED="1688998883188" TEXT="Latch zun&#xe4;chst nicht gesperrt"/>
</node>
<node CREATED="1688998890863" ID="ID_425722709" MODIFIED="1688998934085" TEXT="TIMESTART">
<node CREATED="1688998890863" ID="ID_425722709" MODIFIED="1690735963807" TEXT="WORKSTART">
<node CREATED="1688998900504" ID="ID_1774286611" MODIFIED="1688998907001" TEXT="das ist der Gefahren&#xfc;bergang"/>
</node>
<node CREATED="1688998913869" ID="ID_556268071" MODIFIED="1688998927398" TEXT="INVOKE"/>
<node CREATED="1689000645022" ID="ID_1088539627" MODIFIED="1689000647216" TEXT="FEED"/>
<node CREATED="1688998935319" ID="ID_321972894" MODIFIED="1688998937349" TEXT="TIMESTOP"/>
<node CREATED="1688998935319" ID="ID_321972894" MODIFIED="1690736136402" TEXT="WORKSTOP"/>
<node CREATED="1688998940449" ID="ID_773816766" MODIFIED="1688998948955" TEXT="(optional) NOTIFY"/>
</node>
<node CREATED="1689000122273" ID="ID_1422583341" MODIFIED="1689000141923" TEXT="Ankerpunkte">
@ -78226,7 +78234,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1688998714647" ID="ID_921244873" MODIFIED="1688998724793" TEXT="fr&#xfc;hestmoglich Start-Zeit / Deadline"/>
</node>
<node CREATED="1688998737324" ID="ID_93843458" MODIFIED="1688999147130" TEXT="(optional) GATE"/>
<node CREATED="1688998890863" ID="ID_1895338828" MODIFIED="1688998934085" TEXT="TIMESTART">
<node CREATED="1688998890863" ID="ID_1895338828" MODIFIED="1690735988356" TEXT="WORKSTART">
<node CREATED="1688998900504" ID="ID_518096052" MODIFIED="1688998907001" TEXT="das ist der Gefahren&#xfc;bergang"/>
</node>
<node CREATED="1688998913869" ID="ID_55339592" MODIFIED="1688998927398" TEXT="INVOKE"/>
@ -78234,7 +78242,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1688999011414" ID="ID_628699211" MODIFIED="1688999028770" TEXT="IO-Callback">
<node CREATED="1688999092397" ID="ID_406811025" MODIFIED="1688999110811" TEXT="(ggfs: Callback-entrance Closure)"/>
<node CREATED="1688998935319" ID="ID_1850296698" MODIFIED="1688998937349" TEXT="TIMESTOP"/>
<node CREATED="1688998935319" ID="ID_1850296698" MODIFIED="1690736143495" TEXT="WORKSTOP"/>
<node CREATED="1688998940449" ID="ID_1383425943" MODIFIED="1688999051414" TEXT="NOTIFY"/>
</node>
</node>
@ -78418,10 +78426,18 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1690068752736" ID="ID_1532008023" MODIFIED="1690494850607" TEXT="enth&#xe4;lt die &#x3bb;-Bindings">
<arrowlink COLOR="#e3fddf" DESTINATION="ID_229335349" ENDARROW="Default" ENDINCLINATION="46;-190;" ID="Arrow_ID_382638651" STARTARROW="None" STARTINCLINATION="-301;39;"/>
<linktarget COLOR="#dae9fa" DESTINATION="ID_1532008023" ENDARROW="Default" ENDINCLINATION="-184;505;" ID="Arrow_ID_61418953" SOURCE="ID_1073489318" STARTARROW="None" STARTINCLINATION="630;34;"/>
<node CREATED="1690069222750" ID="ID_276634248" MODIFIED="1690494867733" TEXT="&#x3bb;-post"/>
<node CREATED="1690069365933" ID="ID_1190433817" MODIFIED="1690069369444" TEXT="&#x3bb;-start"/>
<node CREATED="1690069480630" ID="ID_964020744" MODIFIED="1690069483169" TEXT="&#x3bb;-stop"/>
<node CREATED="1690069554609" ID="ID_467087304" MODIFIED="1690069556663" TEXT="&#x3bb;-tick"/>
<node CREATED="1690069222750" ID="ID_276634248" MODIFIED="1690494867733" TEXT="&#x3bb;-post">
<node CREATED="1690736737684" ID="ID_1359419273" MODIFIED="1690746304080" TEXT="(Activity, ExecutionCtx) activity::Proc &#x27fc; activity::Proc"/>
</node>
<node CREATED="1690069365933" ID="ID_1190433817" MODIFIED="1690735578970" TEXT="&#x3bb;-work">
<node CREATED="1690740582313" ID="ID_1898791811" MODIFIED="1690740723196" TEXT="(Time, quality)"/>
</node>
<node CREATED="1690069480630" ID="ID_964020744" MODIFIED="1690735605878" TEXT="&#x3bb;-done">
<node CREATED="1690740582313" ID="ID_1636252560" MODIFIED="1690740723196" TEXT="(Time, quality)"/>
</node>
<node CREATED="1690069554609" ID="ID_467087304" MODIFIED="1690069556663" TEXT="&#x3bb;-tick">
<node CREATED="1690740728730" ID="ID_1262348056" MODIFIED="1690746330626" TEXT="(Time) &#x27fc; activity::Proc"/>
</node>
</node>
<node CREATED="1690490265626" ID="ID_691752926" MODIFIED="1690490274359" TEXT="wird eingebunden als Template-Parameter">
<node COLOR="#338800" CREATED="1690490280656" ID="ID_1134844863" MODIFIED="1690490315482" TEXT="direkt in Activity selber">
@ -78442,9 +78458,57 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1690068851434" ID="ID_196644680" MODIFIED="1690068865466" TEXT="ExecutionContext"/>
<node CREATED="1690068845131" ID="ID_488638240" MODIFIED="1690068850921" TEXT="aktuelle wall-clock-time"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690068914674" ID="ID_229335349" MODIFIED="1690492238820" TEXT="switch-on-type-selector">
<node CREATED="1690741904360" ID="ID_23684403" MODIFIED="1690741909940" TEXT="R&#xfc;ckgabewert">
<icon BUILTIN="info"/>
<node CREATED="1690741912719" ID="ID_1973238180" MODIFIED="1690741925084" TEXT="ein Status/Steuerflag"/>
<node CREATED="1690741926157" ID="ID_1658082854" MODIFIED="1690741927768" TEXT="F&#xe4;lle">
<node CREATED="1690741929054" ID="ID_1938875580" MODIFIED="1690742050594" TEXT="PASS">
<richcontent TYPE="NOTE"><html>
<head/
<body>
<p>
pass on the activation down the chain
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1690742161893" ID="ID_1861458943" MODIFIED="1690742315028" TEXT="SKIP">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
skip rest of the Activity chain for good
</p>
</body>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1690742164165" ID="ID_1609304132" MODIFIED="1690742708723" TEXT="KILL">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
obliterate the complete Activity-Term and all its dependencies
</p>
</body>
</html></richcontent>
<icon BUILTIN="help"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1690742167340" ID="ID_132807819" MODIFIED="1690742482151" TEXT="HALT">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
abandon this play / render process
</p>
</body>
</html></richcontent>
<icon BUILTIN="help"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1690068914674" ID="ID_229335349" MODIFIED="1690754699265" TEXT="switch-on-type-selector">
<linktarget COLOR="#e3fddf" DESTINATION="ID_229335349" ENDARROW="Default" ENDINCLINATION="46;-190;" ID="Arrow_ID_382638651" SOURCE="ID_1532008023" STARTARROW="None" STARTINCLINATION="-301;39;"/>
<icon BUILTIN="flag-yellow"/>
<icon BUILTIN="pencil"/>
<node CREATED="1688998699273" ID="ID_276240629" MODIFIED="1688998702452" TEXT="POST">
<node CREATED="1690069222750" ID="ID_817512371" MODIFIED="1690495286268" TEXT="&#x3bb;-post">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_817512371" ENDARROW="Default" ENDINCLINATION="-55;19;" ID="Arrow_ID_1228234954" SOURCE="ID_1000629107" STARTARROW="None" STARTINCLINATION="-170;11;"/>
@ -78501,8 +78565,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1688998890863" ID="ID_1091142135" MODIFIED="1688998934085" TEXT="TIMESTART">
<node CREATED="1690069365933" ID="ID_480174077" MODIFIED="1690069369444" TEXT="&#x3bb;-start"/>
<node CREATED="1688998890863" ID="ID_1091142135" MODIFIED="1690736014967" TEXT="WORKSTART">
<node CREATED="1690069365933" ID="ID_480174077" MODIFIED="1690735578970" TEXT="&#x3bb;-work"/>
</node>
<node CREATED="1688998913869" ID="ID_341032742" MODIFIED="1688998927398" TEXT="INVOKE">
<node CREATED="1690069389801" ID="ID_1255231137" MODIFIED="1690069397946" TEXT="die nachfolgenden FEED-Activities auswerten"/>
@ -78511,8 +78575,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1689000645022" ID="ID_31160018" MODIFIED="1689000647216" TEXT="FEED">
<node CREATED="1690069477078" ID="ID_866190724" MODIFIED="1690069478242" TEXT="NOP"/>
</node>
<node CREATED="1688998935319" ID="ID_1602687" MODIFIED="1688998937349" TEXT="TIMESTOP">
<node CREATED="1690069480630" ID="ID_917733959" MODIFIED="1690069483169" TEXT="&#x3bb;-stop"/>
<node CREATED="1688998935319" ID="ID_1602687" MODIFIED="1690736152166" TEXT="WORKSTOP">
<node CREATED="1690069480630" ID="ID_917733959" MODIFIED="1690735605878" TEXT="&#x3bb;-done"/>
</node>
<node CREATED="1688998940449" ID="ID_998055924" MODIFIED="1690069195189" TEXT="NOTIFY">
<node CREATED="1690069494444" ID="ID_913671672" MODIFIED="1690495334674">
@ -78975,7 +79039,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1687908771624" ID="ID_389533415" MODIFIED="1687908782901" TEXT="Grunds&#xe4;tzlich: verkettete Terme werden nacheinander aktiviert"/>
<node CREATED="1687908847686" ID="ID_1934270653" MODIFIED="1687908851049" TEXT="Job ausf&#xfc;hren">
<node CREATED="1687908853373" ID="ID_212238089" MODIFIED="1687994616711" TEXT="Gate-Check"/>
<node CREATED="1687908993649" ID="ID_1350770179" MODIFIED="1687909004475" TEXT="timeStart">
<node CREATED="1687908993649" ID="ID_1350770179" MODIFIED="1690736043917" TEXT="workStart">
<node CREATED="1687909447304" ID="ID_724099439" MODIFIED="1687914560990" TEXT="Nachricht an TimingObservable">
<arrowlink COLOR="#a1195c" DESTINATION="ID_225279364" ENDARROW="Default" ENDINCLINATION="279;0;" ID="Arrow_ID_802789276" STARTARROW="None" STARTINCLINATION="376;36;"/>
</node>
@ -78996,7 +79060,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1687914466382" ID="ID_212913790" MODIFIED="1687914471505" TEXT="post-Hook">
<node CREATED="1687914473677" ID="ID_1900995461" MODIFIED="1687914486927" TEXT="stellt seine Nachfollger in die Queue"/>
<node CREATED="1687913985529" ID="ID_1403905180" MODIFIED="1687913989780" TEXT="timeStop">
<node CREATED="1687913985529" ID="ID_1403905180" MODIFIED="1690736160581" TEXT="workStop">
<node CREATED="1687909447304" ID="ID_243187423" MODIFIED="1687914554079" TEXT="an TimingObservable">
<arrowlink COLOR="#a1195c" DESTINATION="ID_225279364" ENDARROW="Default" ENDINCLINATION="231;0;" ID="Arrow_ID_940532479" STARTARROW="None" STARTINCLINATION="71;9;"/>
</node>
@ -89278,7 +89342,7 @@ class Something
<arrowlink COLOR="#c35b60" DESTINATION="ID_601841679" ENDARROW="Default" ENDINCLINATION="53;0;" ID="Arrow_ID_198244235" STARTARROW="None" STARTINCLINATION="53;0;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node CREATED="1689294635406" HGAP="23" ID="ID_1624761863" MODIFIED="1689294849730" TEXT="Test/Debug" VSHIFT="35">
<node CREATED="1689294635406" FOLDED="true" HGAP="23" ID="ID_1624761863" MODIFIED="1689294849730" TEXT="Test/Debug" VSHIFT="35">
<cloud COLOR="#e4d4ac"/>
<icon BUILTIN="info"/>
<node CREATED="1689294864822" ID="ID_1556429085" MODIFIED="1689294870249" TEXT="NoBug">
@ -91112,7 +91176,6 @@ class Something
<node CREATED="1570817565257" ID="ID_872374381" MODIFIED="1570817571504" TEXT="auf x86 harmlos"/>
<node CREATED="1570817572097" ID="ID_942342414" MODIFIED="1570817577917" TEXT="aber nicht portabel"/>
</node>
</node>
<node CREATED="1570812031118" FOLDED="true" ID="ID_1018321072" MODIFIED="1570812037369" TEXT="Alignment bei placement-new">
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1570812038974" ID="ID_716754107" MODIFIED="1570812068335" TEXT="der Buffer mu&#xdf; passendes Alignment f&#xfc;r das Target aufweisen">
<icon BUILTIN="messagebox_warning"/>
@ -91177,6 +91240,13 @@ class Something
</node>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1690740456817" FOLDED="true" ID="ID_1080126518" MODIFIED="1690740564054" TEXT="#853 Portabilit&#xe4;t">
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1690740288384" ID="ID_554665430" MODIFIED="1690740515276" TEXT="#1320 consider 32bit time in Scheduler">
<arrowlink COLOR="#797bad" DESTINATION="ID_1475155102" ENDARROW="Default" ENDINCLINATION="-1330;67;" ID="Arrow_ID_1076799185" STARTARROW="None" STARTINCLINATION="-437;30;"/>
<icon BUILTIN="hourglass"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1689610305547" ID="ID_1569437785" MODIFIED="1689610311743" TEXT="QA-testing">
<icon BUILTIN="hourglass"/>
<node CREATED="1689610320586" ID="ID_1544042895" MODIFIED="1689610323417" TEXT="Acceptance"/>