Activity-Lang: draft patterns of execution

essentially define a concept how to ''perform'' render activities in the Scheduler.
This entails to specify the operation patterns for the four known base cases
and to establish a setup for the implementation.
This commit is contained in:
Fischlurch 2023-07-28 02:21:59 +02:00
parent 28b3900284
commit 4f29d436b3
6 changed files with 374 additions and 93 deletions

View file

@ -64,7 +64,7 @@ namespace fixture {
* - similar for the end point: if the definition is omitted, the new Segment
* will cover the time range until the next Segmen's start
* - if upper/lower boundaries can not be established, the covered range will be
* expanded from Time::ANYTIME up to Time::ANYTIME in as fitting current context
* expanded from Time::ANYTIME up to Time::NEVER, taking into account the current context
* - after start and end point have been established by the above rules, the actual
* splicing operation will be determined; either an existing Segment is replaced
* altogether, or it is trimmed to fit, or the new Segment is inserted, thereby

View file

@ -49,8 +49,9 @@
#include "vault/common.hpp"
#include "vault/gear/job.h"
#include "lib/time/timevalue.hpp"
#include "lib/meta/function.hpp"
//#include "lib/symbol.hpp"
//#include "lib/util.hpp"
#include "lib/util.hpp"
//#include <string>
@ -63,31 +64,62 @@ namespace gear {
// using util::isnil;
// using std::string;
/**
* Wrapper to hold Time values in trivially constructible union.
* By an unfortunate design decision, lib::time::Time values are
* non-copyable, which prevents placing them into POD data
*
* @todo 7/2023 this decision should be revised //////////////////////////////////////////////////////////TICKET #1261 : reconsider (im)mutability of time entities
*/
class Instant
class Activity;
namespace activity { ///< special definitions for the Scheduler activity language
/**
* Wrapper to hold Time values in trivially constructible union.
* By an unfortunate design decision, lib::time::Time values are
* non-copyable, which prevents placing them into POD data
*
* @todo 7/2023 this decision should be revised //////////////////////////////////////////////////////////TICKET #1261 : reconsider (im)mutability of time entities
*/
class Instant
{
int64_t microTick_;
public:
Instant() =default; // @suppress("Class members should be properly initialized")
Instant(TimeValue time)
: microTick_{_raw(time)}
{ }
operator TimeVar() const
{
return TimeValue{microTick_};
}
// default copy acceptable
};
/**
* Definition to emulate a _Concept_ for the *Execution Context*.
* The Execution Context need to be passed to any Activity _activation;_
* it provides the _bindings_ for functionality defined only on a conceptual
* level, and provided by an opaque implementation (actually the Scheduler)
*/
template<class EXE>
constexpr void
_check_is_usable_as_ExecutionContext ()
{
int64_t microTick_;
#define ASSERT_MEMBER_FUNCTOR(_EXPR_, _SIG_) \
static_assert (lib::meta::has_Sig<decltype(_EXPR_), _SIG_>(), \
"Execution-Context: " STRINGIFY(_FUN_) " expect function with signature: " STRINGIFY(_SIG_));
public:
Instant() =default; // @suppress("Class members should be properly initialized")
Instant(TimeValue time)
: microTick_{_raw(time)}
{ }
EXE const& ctx = std::declval<EXE>();
operator TimeVar() const
{
return TimeValue{microTick_};
}
ASSERT_MEMBER_FUNCTOR (ctx.post, void(Activity&, EXE&));
// default copy acceptable
};
#undef ASSERT_MEMBER_FUNCTOR
}
}//(End)namespace activity
@ -101,6 +133,8 @@ namespace gear {
*/
class Activity
{
using Instant = activity::Instant;
public:
/** All possible kinds of activities */
enum Verb {INVOKE ///< dispatch a JobFunctor into a worker thread

View file

@ -1,62 +0,0 @@
/*
BlockFlow - specialised custom allocator to manage scheduler data
Copyright (C) Lumiera.org
2023, Hermann Vosseler <Ichthyostega@web.de>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *****************************************************/
/** @file block-flow.cpp
** Implementation details of the custom memory manager backing scheduler operation.
**
** @note currently the greatest challenge is de-allocation
**
** @see ////TODO_test usage example
**
** @todo WIP-WIP-WIP 6/2023 »Playback Vertical Slice«
**
*/
#include "vault/gear/block-flow.hpp"
//#include "lib/symbol.hpp"
//#include "include/logging.h"
//#include <string>
//using std::string;
//using util::isnil;
namespace vault{
namespace gear {
namespace { // internal details
} // internal details
// NA::~NA() { }
/**
*/
}} // namespace vault::gear

View file

@ -251,7 +251,7 @@ namespace gear {
}
// default copyable
Instant&
activity::Instant&
deadline()
{
return data_.condition.dead;

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="202307102241" tags="Rendering spec draft" changecount="10">
<div title="RenderActivity" creator="Ichthyostega" modifier="Ichthyostega" created="202304140145" modified="202307272318" tags="Rendering spec draft" changecount="12">
<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«.
@ -6886,10 +6886,17 @@ Activities are processed within a //performance critical part of the application
While Activities are logically polymorphic, they are implemented as »POD with constructor« -- meaning that they are classes with [[standard layout|https://en.cppreference.com/w/cpp/named_req/StandardLayoutType]] and at least a [[trivial destructor|https://en.cppreference.com/w/cpp/language/destructor#Trivial_destructor]], allowing to just place them into a memory block and forget about them (without need to call any non-trivial functions). The ''Argument data'' depends on the //actual verb// and is thus placed into a union, with access functions to ensure proper usage of the data fields (while it is always possible to access the data field directly). Since Activities are allocated a lot, small memory footprint is favoured, and thus some significant information -- notably the //time window// for activation of each Activity -- is defined //contextually.//
Activities are organised into ''chains'', allowing to express relations based on their respective verbs.
There are //standard usage patters,// hard coded into the {{{ActivityLang}}} and expected by the {{{SchedulerCommutator}}}, to express all relevant patterns of operational logic necessary to represent time-bound and dependent playback and render tasks.
There are //standard usage patters,// hard coded into the {{{ActivityLang}}} and expected by the {{{SchedulerCommutator}}}, to express all relevant [[patterns of operational logic|RenderOperationLogic]] necessary to represent time-bound and dependent playback and render tasks.
!The Activity Language
While the Activities are low-level primitives and can be handled directly by the scheduler, any actual rendering invocation must arrange several Activities into a suitable chain of operations. Thus the actual rendering invocation can be seen as a //sentence of the Activity Language.// Formally speaking, it is a //symbolic term.// Not every possible term (and thus sentence) leads to semantically sound behaviour, and thus the ''Scheduler Interface Setup'' is organised in the form of a //builder notation to construct viable Activity terms.// {{{vault::gear::ActivityLang}}} provides the framework for such builder invocations, and allows to create such terms as transient objects -- connected to the durable {{{Activity}}} records allocated into the [[»BlockFlow« memory manager|SchedulerMemory]] backing the Scheduler operation. The language term is thus a front-end, and exposes suitable extension and configuration points for the JobPlanningPipeline to instruct the necessary Scheduler operations to enact a specific [[render Job|RenderJob]].
The //meaning// of Activities can be understood on two levels. For one, there is the abstract, //conceptual level:// Each Activity represents a verb to express something //performed by »the render process«// -- which in turn appears as a combination and connection of these elementary expressions. Activity verbs can be linked together in a limited number of ways
* chaining means sequencing -- first //this// Activity, followed by //that// Activity
* guarding means inhibiting and releasing -- once the prerequisites of a {{{GATE}}} have been ticket off, and unless the deadline is violated
* notification implies a trigger -- an impulse, either to //decrement// a {{{GATE}}} or to //activate// another Activity
* posting anchors a pattern -- a complete structure of further Activities is put underway, possibly with an explicit //start time// and //deadline.//
However, the //meaning// of Activities can also be understood at the //operational level:// This is what the [[operational logic of Activity execution|RenderOperationLogic]] entails, what is implemented as interpretation of the Activity Language and what is actually backed and implemented by the [[Scheduler]].
</pre>
</div>
<div title="RenderDrive" creator="Ichthyostega" modifier="Ichthyostega" created="202306122212" tags="spec Player draft" changecount="1">
@ -7030,6 +7037,77 @@ __see also__
&amp;rarr; additional [[implementation details|RenderImplDetails]]
&amp;rarr; [[Memory management for render nodes|ManagementRenderNodes]]
&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">
<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
* the ''Scheduler Layer-2'' ({{{SchedulerCommutator}}}) backs this //language execution// with the elementary //effects// to setup the processing
* the ''Scheduler Layer-1'' ({{{SchedulerInvocation}}}) provides the low-level coordination and invocation mechanics to launch [[render Jobs|RenderJob]].
!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
:* {{{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''
:* {{{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)
:*** 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''
:** 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
</pre>
</div>
<div title="RenderProcess" modifier="Ichthyostega" created="200706190705" modified="201112162056" tags="Rendering operational">
@ -7071,7 +7149,7 @@ Later on we expect a distinct __query subsystem__ to emerge, presumably embeddin
&amp;rarr; QuantiserImpl</pre>
</div>
<div title="Scheduler" creator="Ichthyostega" modifier="Ichthyostega" created="202304140131" modified="202307102232" tags="Rendering spec draft" changecount="14">
<div title="Scheduler" creator="Ichthyostega" modifier="Ichthyostega" created="202304140131" modified="202307272248" tags="Rendering spec draft" changecount="15">
<pre>//Invoke and control the dependency and time based execution of [[render jobs|RenderJob]]//
The Scheduler acts as the central hub in the implementation of the RenderEngine and coordinates the //processing resources// of the application. Regarding architecture, the Scheduler is located in the Vault-Layer and //running// the Scheduler is equivalent to activating the »Vault Subsystem«. An EngineFaçade acts as entrance point, providing high-level render services to other parts of the application: [[render jobs|RenderJob]] can be activated under various timing and dependency constraints. Internally, the implementation is segregated into two layers
;Layer-2: Coordination
@ -7086,6 +7164,8 @@ Time bound delivery of media data is an important aspect of editing and playback
This leads to the observation that every render or playback process has to deal with rather incompatible processing patterns and trends: for one, processing has to start as soon as the event of an completed I/O-operation is published, yet on the other hand, limited computational resources must be distributed and prioritised in a way suitable to deliver the completed data as close as possible to a pre-established timing deadline, under the constraint of limited in-memory buffer capacity. The //control structure// of such a render engine is thus not only a time based computation plan -- first and foremost it should be conceived as an asynchronous messaging system, with the ability however to prioritise some messages based on urgency or approaching deadlines.
The time-based ordering and prioritisation of [[render activities|RenderActivity]] is thus used as a //generic medium and agent// to support and implement complex interwoven computational tasks. On the layer-1 mentioned above, a combination of a lock-free dispatch queue is used, feeding into a single threaded priority queue organised by temporal deadlines. Most render activities are lightweight and entail quick updates to some state flags, while certain activities are extremely long running -- and those are shifted into worker threads based on priority.
&amp;rarr; [[the Activity-Language|RenderActivity]]
&amp;rarr; [[implementing Activities|RenderOperationLogic]]
!Usage pattern
The [[Language of render activities|RenderActivity]] forms the interface to the scheduler -- new activities are defined as //terms// and handed over to the scheduler. This happens as part of the ongoing job planning activities -- and thus will be performed //from within jobs managed by the scheduler.// Thus the access to the scheduler happens almost entirely from within the scheduler's realm itself, and is governed by the usage scheme of the [[Workers|SchedulerWorker]].

View file

@ -77982,7 +77982,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1687908222714" ID="ID_941383183" MODIFIED="1687908233939" TEXT="Darstellung">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1687908222714" HGAP="83" ID="ID_941383183" MODIFIED="1690068335344" TEXT="Darstellung" VSHIFT="2">
<icon BUILTIN="pencil"/>
<node CREATED="1687908236975" ID="ID_692898121" MODIFIED="1687908476679" TEXT="eigentlich polymorph &#x2014; aber in gemeinsamen Datenrecord encodiert">
<richcontent TYPE="NOTE"><html>
<head>
@ -77998,10 +77999,14 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1687908607797" ID="ID_989605795" MODIFIED="1687908674373" TEXT="Implementierung des Verhaltens">
<arrowlink COLOR="#7f362f" DESTINATION="ID_1214627402" ENDARROW="Default" ENDINCLINATION="-265;-25;" ID="Arrow_ID_1834773150" STARTARROW="None" STARTINCLINATION="-686;57;"/>
<linktarget COLOR="#6a668f" DESTINATION="ID_989605795" ENDARROW="Default" ENDINCLINATION="-303;1079;" ID="Arrow_ID_180378517" SOURCE="ID_72274125" STARTARROW="None" STARTINCLINATION="-786;38;"/>
<icon BUILTIN="pencil"/>
<node CREATED="1687908684071" ID="ID_814820281" MODIFIED="1687908690152" TEXT="im Scheduler Layer-2">
<icon BUILTIN="info"/>
</node>
<node CREATED="1690490828030" ID="ID_231504634" MODIFIED="1690490873196" TEXT="falls Activity &#x27fc; externer Effekt">
<node CREATED="1690490875511" ID="ID_1949721757" MODIFIED="1690490904967" TEXT="post: Synchronisation und in die Queue stellen"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688599645418" ID="ID_290814679" MODIFIED="1688599769276" TEXT="Repr&#xe4;sentation Argument-Daten">
<linktarget COLOR="#4766fd" DESTINATION="ID_290814679" ENDARROW="Default" ENDINCLINATION="-1095;85;" ID="Arrow_ID_1644257444" SOURCE="ID_1520469413" STARTARROW="None" STARTINCLINATION="676;32;"/>
@ -78168,7 +78173,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node CREATED="1689169614354" ID="ID_969910286" MODIFIED="1689169702944" TEXT="man k&#xf6;nnte aber auch genau den gleichen Mechanismus direkt in GATE einbauen">
<node COLOR="#5b280f" CREATED="1689169614354" ID="ID_969910286" MODIFIED="1690490579815" TEXT="man k&#xf6;nnte aber auch genau den gleichen Mechanismus direkt in GATE einbauen">
<richcontent TYPE="NOTE"><html>
<head></head>
<body>
@ -78177,6 +78182,19 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<icon BUILTIN="button_cancel"/>
<node CREATED="1690490584246" ID="ID_1021729756" MODIFIED="1690490592447" TEXT="ja... aber">
<icon BUILTIN="smiley-angry"/>
</node>
<node CREATED="1690490614050" ID="ID_1084968679" MODIFIED="1690490623783" TEXT="das w&#xe4;re un-KISS">
<icon BUILTIN="smiley-oh"/>
</node>
<node CREATED="1690490709845" ID="ID_474906095" MODIFIED="1690490739991" TEXT="w&#xfc;rde eine trickreiche Konvention einf&#xfc;hren">
<icon BUILTIN="smily_bad"/>
</node>
<node CREATED="1690490625849" ID="ID_1739284273" MODIFIED="1690490751829" TEXT="und w&#xfc;rde die Symmetrie zwischen activation und NOTIFY st&#xf6;ren">
<icon BUILTIN="stop-sign"/>
</node>
</node>
</node>
<node CREATED="1688998857100" ID="ID_875955760" MODIFIED="1688998863575" TEXT="Deadline aus POST-Deadline"/>
@ -78271,7 +78289,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1689000503719" ID="ID_1847275936" MODIFIED="1689000627698" TEXT="Schalter Work/Meta"/>
<node CREATED="1689000328599" ID="ID_523939975" MODIFIED="1689000343817" TEXT="Closure / Zugangspunkt f&#xfc;r IO-Callback bereitstellen"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688998180822" ID="ID_462121305" MODIFIED="1688998232122" TEXT="ActivityLang &#x2261; Builder-Setup">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688998180822" ID="ID_462121305" MODIFIED="1690068422658" TEXT="ActivityLang &#x2261; Builder-Setup">
<arrowlink COLOR="#3d344c" DESTINATION="ID_975357334" ENDARROW="Default" ENDINCLINATION="-4;-17;" ID="Arrow_ID_56581087" STARTARROW="Default" STARTINCLINATION="6;32;"/>
<linktarget COLOR="#b14f6e" DESTINATION="ID_462121305" ENDARROW="Default" ENDINCLINATION="-76;7;" ID="Arrow_ID_1396143437" SOURCE="ID_1433064275" STARTARROW="None" STARTINCLINATION="-74;-111;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688999189055" ID="ID_1477089281" MODIFIED="1688999200359" TEXT="Dependency-Injection bereitstellen">
@ -78368,6 +78387,201 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690068219755" HGAP="133" ID="ID_1567752814" MODIFIED="1690068277660" TEXT="Ausf&#xfc;hrung von Activities" VSHIFT="20">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690068378225" ID="ID_975357334" MODIFIED="1690068414755" TEXT="ActivityLang &#x2261; Rahmen und Laufzeitsystem">
<linktarget COLOR="#3d344c" DESTINATION="ID_975357334" ENDARROW="Default" ENDINCLINATION="-4;-17;" ID="Arrow_ID_56581087" SOURCE="ID_462121305" STARTARROW="Default" STARTINCLINATION="6;32;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690068444705" ID="ID_1936713026" MODIFIED="1690068449569" TEXT="stellt Setup bereit">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690068450704" ID="ID_716451982" MODIFIED="1690068459871" TEXT="Dependency-Injection">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1690068675474" ID="ID_834417186" MODIFIED="1690068685091" TEXT="reine Konstruktor-DI gen&#xfc;gt">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690068461078" ID="ID_1000341702" MODIFIED="1690068687201" TEXT="BlockFlow">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690068469725" ID="ID_1098945451" MODIFIED="1690068479132" TEXT="&#x3bb;-Bindings">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1690068487379" ID="ID_967744995" MODIFIED="1690068517443" TEXT="Teile der Activity-Ausf&#xfc;hrungen aktiveren externe Funktionalit&#xe4;t"/>
<node CREATED="1690068633296" ID="ID_490552261" MODIFIED="1690068663039" TEXT="diese m&#xfc;ssen mit dem Setup bereits mit hergestellt werden"/>
<node CREATED="1690068518127" ID="ID_72274125" MODIFIED="1690068609740" TEXT="diese wird normalerweise im Scheduler Layer-2 bereitgestellt">
<arrowlink COLOR="#6a668f" DESTINATION="ID_989605795" ENDARROW="Default" ENDINCLINATION="-303;1079;" ID="Arrow_ID_180378517" STARTARROW="None" STARTINCLINATION="-786;38;"/>
</node>
<node CREATED="1690068617946" ID="ID_270502955" MODIFIED="1690068631452" TEXT="f&#xfc;r den Test k&#xf6;nnen Stubs eingebunden werden"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690068712621" ID="ID_663408731" MODIFIED="1690068720581" TEXT="Abstraktion: ExecutionContext">
<icon BUILTIN="flag-yellow"/>
<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>
<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">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1690490297125" ID="ID_1766901032" MODIFIED="1690490313350" TEXT="Vorgriff auf Concepts: Signaturen statisch pr&#xfc;fen">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node CREATED="1690068793535" ID="ID_1906823317" MODIFIED="1690068819476" TEXT="ist implementiert durch die ActivityLang selber"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690068830605" ID="ID_330404913" MODIFIED="1690068833053" TEXT="Invocation">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1690068838900" ID="ID_1597056190" MODIFIED="1690068897095" TEXT="Argumente">
<icon BUILTIN="info"/>
<node CREATED="1690068867288" ID="ID_1499789702" MODIFIED="1690068885342" TEXT="(*this Activity)"/>
<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">
<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"/>
<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;"/>
<linktarget COLOR="#8897a9" DESTINATION="ID_817512371" ENDARROW="Default" ENDINCLINATION="-175;61;" ID="Arrow_ID_847368059" SOURCE="ID_681493814" STARTARROW="None" STARTINCLINATION="-262;0;"/>
</node>
</node>
<node CREATED="1688998737324" ID="ID_1768827754" MODIFIED="1688998829651" TEXT="GATE">
<node CREATED="1690069237564" ID="ID_1663637650" MODIFIED="1690069243595" TEXT="pr&#xfc;ft die Bedingungen"/>
<node CREATED="1690069251010" ID="ID_449595126" MODIFIED="1690069692342" TEXT="bei Erfolg wird die Aktivierung weitergegeben">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_449595126" ENDARROW="Default" ENDINCLINATION="317;20;" ID="Arrow_ID_288430732" SOURCE="ID_1897470873" STARTARROW="None" STARTINCLINATION="232;-25;"/>
</node>
<node COLOR="#435e98" CREATED="1690069297302" ID="ID_33956976" MODIFIED="1690492032363" TEXT="sonst....">
<icon BUILTIN="help"/>
<node CREATED="1690069315708" ID="ID_1571780277" MODIFIED="1690069346741" TEXT="...soll sich das Gate &#xbb;selbst in die Zukunft schieben&#xab;"/>
<node CREATED="1690069773157" ID="ID_1756992465" MODIFIED="1690069785879" TEXT="Problem: wer bestimmt um wie viel?">
<node CREATED="1690069811256" ID="ID_743760450" MODIFIED="1690069828122" TEXT="konstanter Step &#x27f9; spinning"/>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1690491378700" ID="ID_1592003148" MODIFIED="1690491504993">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p style="text-align: center">
Hier <i>keine</i>&#160;zus&#228;tzliche Steuer-Logik einf&#252;hren!
</p>
<p style="text-align: center">
die Zeitplanung mu&#223; eben <i>gut genug </i>sein!
</p>
</body>
</html></richcontent>
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="yes"/>
</node>
<node CREATED="1690491347653" ID="ID_1726593706" MODIFIED="1690491374151" TEXT="die Schrittweite ist ein fester Parameter im ExecutionContext">
<icon BUILTIN="yes"/>
<node CREATED="1690491529352" ID="ID_582566403" MODIFIED="1690491977125" TEXT="Ma&#xdf;gabe: effektiv keine Wartezeiten">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
W&#228;hrend einer Wartezeit auf re-Test kann nicht erkannt werden, ob der Nachfolgejob vielleicht inzwischen schon arbeiten k&#246;nnte; somit besteht einerseits die Gefahr, Ressourcen zu verschwenden (re-Test Activities m&#252;ssen von Workern im Management-Modus (single-threaded) abgearbeitet werden), andererseits Ressourcen ungen&#252;tzt zu lassen (Worker k&#246;nnte sich schlafen legen, obwohl der wartende Nachfolge-Job bereits ausf&#252;hrbar w&#228;re und genau von diesem Worker behandelt werden k&#246;nnte. Das ist ein klassischer Zielkonflikt, und l&#228;uft auf die Forderung hinaus, nur so h&#228;ufig zu pr&#252;fen, wie die Engine im Schnitt ohnehin freie Kapazit&#228;t h&#228;tte. Ansatz: &#8709; Job-Zeit geteilt durch Zahl der Worker. Und das dann noch mal zwei oder drei, um etwas Puffer zu schaffen...
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1690491543494" ID="ID_647432692" MODIFIED="1690491573721" TEXT="die Engine wird einen charakteristischen Eigen-Rhythmus entwickeln">
<icon BUILTIN="idea"/>
</node>
</node>
<node CREATED="1690491999652" ID="ID_1302700119" MODIFIED="1690492023832" TEXT="letzten Endes stammt damit der Stellwert aus der Engine-Steuerungs-Ebene">
<icon BUILTIN="idea"/>
</node>
</node>
<node CREATED="1690069846556" ID="ID_1000629107" MODIFIED="1690495286268" TEXT="ansonsten ist das ein &#x3bb;-POST mit festem Delay">
<arrowlink DESTINATION="ID_817512371" ENDARROW="Default" ENDINCLINATION="-55;19;" ID="Arrow_ID_1228234954" STARTARROW="None" STARTINCLINATION="-170;11;"/>
</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>
<node CREATED="1688998913869" ID="ID_341032742" MODIFIED="1688998927398" TEXT="INVOKE">
<node CREATED="1690069389801" ID="ID_1255231137" MODIFIED="1690069397946" TEXT="die nachfolgenden FEED-Activities auswerten"/>
<node CREATED="1690069372858" ID="ID_1136969645" MODIFIED="1690069385742" TEXT="den eingebundenen Job-Funktor aufrufen"/>
</node>
<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>
<node CREATED="1688998940449" ID="ID_998055924" MODIFIED="1690069195189" TEXT="NOTIFY">
<node CREATED="1690069494444" ID="ID_913671672" MODIFIED="1690495334674">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
bewirkt <i>anderswo </i>einen Trigger
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1690495342418" ID="ID_1735708551" MODIFIED="1690495407533" TEXT="die Art der angesto&#xdf;enen Aktion h&#xe4;ngt vom Ziel ab (double-dispatch)">
<arrowlink COLOR="#72647d" DESTINATION="ID_1420540747" ENDARROW="Default" ENDINCLINATION="17;-42;" ID="Arrow_ID_1383949980" STARTARROW="None" STARTINCLINATION="-175;7;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1690495433254" ID="ID_1805822057" MODIFIED="1690495483570" TEXT="umst&#xe4;ndehalber kann noch eine asynchrone &#xdc;bergabe (&#x3bb;) dazwischenliegen">
<icon BUILTIN="idea"/>
</node>
</node>
<node CREATED="1690069195852" ID="ID_1205140605" MODIFIED="1690069197272" TEXT="TICK">
<node CREATED="1690069554609" ID="ID_250578152" MODIFIED="1690069556663" TEXT="&#x3bb;-tick"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690068951061" ID="ID_1729670913" MODIFIED="1690068954662" TEXT="Notification">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1690068955715" ID="ID_995732211" MODIFIED="1690068991190" TEXT="kann gegebenenfalls zu einer Invokation f&#xfc;hren">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1690069599277" ID="ID_1420540747" MODIFIED="1690495396485" TEXT="double-dispatch">
<linktarget COLOR="#72647d" DESTINATION="ID_1420540747" ENDARROW="Default" ENDINCLINATION="17;-42;" ID="Arrow_ID_1383949980" SOURCE="ID_1735708551" STARTARROW="None" STARTINCLINATION="-175;7;"/>
<icon BUILTIN="idea"/>
<node CREATED="1690069609660" ID="ID_194969059" MODIFIED="1690069611647" TEXT="GATE">
<node CREATED="1690069633998" ID="ID_6952365" MODIFIED="1690069639563" TEXT="count-down latch"/>
<node CREATED="1690069650471" ID="ID_1897470873" MODIFIED="1690069692342" TEXT="Invocation ohne else-Fall">
<arrowlink DESTINATION="ID_449595126" ENDARROW="Default" ENDINCLINATION="317;20;" ID="Arrow_ID_288430732" STARTARROW="None" STARTINCLINATION="232;-25;"/>
</node>
</node>
<node COLOR="#3c2cd7" CREATED="1690492107763" ID="ID_1237570064" MODIFIED="1690492139563" TEXT="--more-to-come-here--">
<font NAME="Monospaced" SIZE="12"/>
</node>
<node CREATED="1690069612171" ID="ID_546472363" MODIFIED="1690069618238" TEXT="sonst: Invocation">
<node CREATED="1690069846556" ID="ID_681493814" MODIFIED="1690495242907" TEXT="&#x3bb;-post">
<arrowlink COLOR="#8897a9" DESTINATION="ID_817512371" ENDARROW="Default" ENDINCLINATION="-175;61;" ID="Arrow_ID_847368059" STARTARROW="None" STARTINCLINATION="-262;0;"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690069961163" HGAP="-57" ID="ID_1647246120" MODIFIED="1690070058095" TEXT="brauche Diagnose-Hilfsmittel" VSHIFT="4">
<arrowlink COLOR="#794f4b" DESTINATION="ID_284088835" ENDARROW="Default" ENDINCLINATION="-685;-107;" ID="Arrow_ID_1213725911" STARTARROW="None" STARTINCLINATION="518;48;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690070237908" HGAP="43" ID="ID_875825086" MODIFIED="1690070258681" TEXT="Test-Setup mit &#x3bb;-Stubs" VSHIFT="-3">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690070107384" HGAP="31" ID="ID_396064852" MODIFIED="1690070255409" TEXT="ActivityDetector f&#xfc;r Me&#xdf;unkte" VSHIFT="-13">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689205105640" ID="ID_1873547897" MODIFIED="1690070157925" TEXT="Funktor-Aufruf erkennen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689205129709" ID="ID_1799160243" MODIFIED="1690070171707" TEXT="stattgefundene Invocation erkennen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689205423173" ID="ID_206179585" MODIFIED="1690070228859" TEXT="Gate beobachten">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1681396805942" ID="ID_1886457526" MODIFIED="1681396815850" TEXT="Architektur festlegen">
@ -78742,6 +78956,18 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1687788654684" ID="ID_1528240185" MODIFIED="1687788658716" TEXT="Terme">
<node CREATED="1687788659433" ID="ID_1507624704" MODIFIED="1687788784350" TEXT="es werden Satz-artige Terme ausgewertet">
<icon BUILTIN="yes"/>
<node CREATED="1690492542473" ID="ID_508740677" MODIFIED="1690492555436" TEXT="die Auswertung implementiert direkt die Abh&#xe4;ngigkeits-Struktur"/>
<node CREATED="1690492556024" ID="ID_1073489318" MODIFIED="1690494850606" TEXT="aber delegiert externe Effekte &#xfc;ber ein &#x3bb;-Binding">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
konkretes operationales Verhalten des Schedulers, der Concurrency- und Worker-Steuerung
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#dae9fa" DESTINATION="ID_1532008023" ENDARROW="Default" ENDINCLINATION="-184;505;" ID="Arrow_ID_61418953" STARTARROW="None" STARTINCLINATION="630;34;"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1687908576983" ID="ID_1214627402" MODIFIED="1687908674373" TEXT="operationale Semantik">
<linktarget COLOR="#7f362f" DESTINATION="ID_1214627402" ENDARROW="Default" ENDINCLINATION="-265;-25;" ID="Arrow_ID_1834773150" SOURCE="ID_989605795" STARTARROW="None" STARTINCLINATION="-686;57;"/>
@ -78760,8 +78986,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1687910219015" ID="ID_28786353" MODIFIED="1687910221323" TEXT="invoke">
<node CREATED="1687910253555" ID="ID_373183597" MODIFIED="1687910259797" TEXT="Verweis auf einen JobFunctor"/>
<node CREATED="1687910292410" ID="ID_1172966925" MODIFIED="1687910299032" TEXT="Job-Parameter-Record">
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1687913896192" ID="ID_596101241" MODIFIED="1687913904630" TEXT="wo liegt der im Speicher?">
<node COLOR="#435e98" CREATED="1687913896192" ID="ID_596101241" MODIFIED="1690491003462" TEXT="wo liegt der im Speicher?">
<icon BUILTIN="help"/>
<node CREATED="1690490972307" ID="ID_129140005" MODIFIED="1690490983821" TEXT="er wird aufgeteilt und umgepackt"/>
<node CREATED="1690490984361" ID="ID_922866757" MODIFIED="1690490999435" TEXT="in eine Kette nachfolgender FEED-Activities"/>
</node>
</node>
<node CREATED="1687913931473" ID="ID_1493272170" MODIFIED="1687913951849" TEXT="ruft JobFunctor mit Parametern auf"/>
@ -81332,7 +81560,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1689204913954" ID="ID_256874849" MODIFIED="1689204922646" TEXT="f&#xfc;r ExtentFamily">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689204967974" ID="ID_284088835" MODIFIED="1689204977426" TEXT="ActivityDetector">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689204967974" ID="ID_284088835" MODIFIED="1690070044262" TEXT="ActivityDetector">
<linktarget COLOR="#794f4b" DESTINATION="ID_284088835" ENDARROW="Default" ENDINCLINATION="-685;-107;" ID="Arrow_ID_1213725911" SOURCE="ID_1647246120" STARTARROW="None" STARTINCLINATION="518;48;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689204985122" ID="ID_1020676746" MODIFIED="1689204995475" TEXT="Rahmen schaffen">
<icon BUILTIN="flag-yellow"/>