Scheduler: decision logic for actual dispatch of activities
This commit is contained in:
parent
fa391d1267
commit
aa60869082
4 changed files with 179 additions and 18 deletions
|
|
@ -64,7 +64,7 @@ namespace gear {
|
|||
|
||||
|
||||
/**
|
||||
* Scheduler Layer-2 : coordination.
|
||||
* Scheduler Layer-2 : execution of Scheduler Activities.
|
||||
*
|
||||
* @see SchedulerInvocation (Layer-1)
|
||||
* @see SchedulerCommutator_test
|
||||
|
|
@ -95,7 +95,7 @@ namespace gear {
|
|||
ThreadID expect_noThread; // expect no one else to be in...
|
||||
ThreadID myself = std::this_thread::get_id();
|
||||
return groomingToken_.compare_exchange_strong (expect_noThread, myself
|
||||
,memory_order_acquire // success also constitutes an acquire barrier
|
||||
,memory_order_acquire // success also constitutes an acquire barrier
|
||||
,memory_order_relaxed // failure has no synchronisation ramifications
|
||||
);
|
||||
}
|
||||
|
|
@ -125,6 +125,22 @@ namespace gear {
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Decide if Activities shall be performed now and in this thread.
|
||||
* @param when the indicated time of start of the first Activity
|
||||
* @param now current scheduler time
|
||||
* @return allow dispatch if acquired GroomingToken and time is due
|
||||
* @warning accesses current ThreadID and changes GroomingToken state
|
||||
*/
|
||||
bool
|
||||
decideDispatchNow (Time when, Time now)
|
||||
{
|
||||
auto myself = std::this_thread::get_id();
|
||||
return (when <= now)
|
||||
and (holdsGroomingToken (myself)
|
||||
or acquireGoomingToken());
|
||||
}
|
||||
|
||||
|
||||
Activity*
|
||||
findWork (SchedulerInvocation& layer1)
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
|
||||
/** @file scheduler-invocation.hpp
|
||||
** Layer-1 of the Scheduler: dispatch and invocation of activities.
|
||||
** Layer-1 of the Scheduler: queueing and prioritisation of activities.
|
||||
** This is the lower layer of the implementation and provides low-level functionality.
|
||||
**
|
||||
** @see SchedulerInvocation_test
|
||||
|
|
@ -66,7 +66,7 @@ namespace gear {
|
|||
|
||||
|
||||
/**
|
||||
* Scheduler Layer-1 : invocation.
|
||||
* Scheduler Layer-1 : time based dispatch.
|
||||
*
|
||||
* @see Scheduler
|
||||
* @see SchedulerInvocation_test
|
||||
|
|
|
|||
|
|
@ -31,11 +31,11 @@
|
|||
#include "lib/test/microbenchmark.hpp"
|
||||
#include "lib/time/timevalue.hpp"
|
||||
#include "lib/format-cout.hpp"
|
||||
#include "lib/thread.hpp"
|
||||
//#include "lib/util.hpp"
|
||||
#include "lib/test/diagnostic-output.hpp"///////////////////////////TODO TOD-Oh
|
||||
|
||||
//#include <utility>
|
||||
#include <thread>
|
||||
#include <chrono>
|
||||
|
||||
using test::Test;
|
||||
|
|
@ -58,6 +58,15 @@ namespace test {
|
|||
namespace {// Test parameters
|
||||
const size_t NUM_THREADS = 20;
|
||||
const size_t REPETITIONS = 100;
|
||||
|
||||
inline void
|
||||
___ensureGroomingTokenReleased(SchedulerCommutator& sched)
|
||||
{
|
||||
auto myself = std::this_thread::get_id();
|
||||
CHECK (not sched.holdsGroomingToken(myself));
|
||||
CHECK (sched.acquireGoomingToken());
|
||||
sched.dropGroomingToken();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -124,6 +133,7 @@ namespace test {
|
|||
|
||||
sched.dropGroomingToken();
|
||||
CHECK (not sched.holdsGroomingToken (myself));
|
||||
___ensureGroomingTokenReleased(sched);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -163,6 +173,7 @@ namespace test {
|
|||
|
||||
CHECK (brokenSum < checkSum);
|
||||
CHECK (checkSum = NUM_THREADS * REPETITIONS*(REPETITIONS-1)/2);
|
||||
___ensureGroomingTokenReleased(sched);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -174,7 +185,53 @@ namespace test {
|
|||
void
|
||||
verify_DispatchDecision()
|
||||
{
|
||||
UNIMPLEMENTED ("DispatchDecision");
|
||||
SchedulerCommutator sched;
|
||||
___ensureGroomingTokenReleased(sched);
|
||||
|
||||
Time t1{10,0};
|
||||
Time t2{20,0};
|
||||
Time t3{30,0};
|
||||
Time now{t2};
|
||||
|
||||
auto myself = std::this_thread::get_id();
|
||||
CHECK (sched.decideDispatchNow (t1, now));
|
||||
CHECK (sched.holdsGroomingToken (myself));
|
||||
|
||||
CHECK (sched.decideDispatchNow (t1, now));
|
||||
CHECK (sched.holdsGroomingToken (myself));
|
||||
|
||||
CHECK (sched.decideDispatchNow (t2, now));
|
||||
CHECK (sched.holdsGroomingToken (myself));
|
||||
|
||||
CHECK (not sched.decideDispatchNow (t3, now));
|
||||
CHECK (sched.holdsGroomingToken (myself));
|
||||
sched.dropGroomingToken();
|
||||
|
||||
CHECK (not sched.decideDispatchNow (t3, now));
|
||||
CHECK (not sched.holdsGroomingToken (myself));
|
||||
|
||||
std::atomic_bool stop{false};
|
||||
lib::ThreadJoinable theHog{"grooming-hog"
|
||||
, [&]{
|
||||
CHECK (sched.acquireGoomingToken());
|
||||
do sleep_for (100us);
|
||||
while (not stop);
|
||||
sched.dropGroomingToken();
|
||||
}};
|
||||
sleep_for (500us);
|
||||
CHECK (not sched.acquireGoomingToken());
|
||||
|
||||
CHECK (not sched.decideDispatchNow (t1, now));
|
||||
CHECK (not sched.holdsGroomingToken (myself));
|
||||
|
||||
CHECK (not sched.decideDispatchNow (t2, now));
|
||||
CHECK (not sched.holdsGroomingToken (myself));
|
||||
|
||||
stop = true;
|
||||
theHog.join().maybeThrow();
|
||||
|
||||
CHECK (sched.decideDispatchNow (t2, now));
|
||||
CHECK (sched.holdsGroomingToken (myself));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -84897,11 +84897,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1687909787970" ID="ID_1744353313" MODIFIED="1687909813720" TEXT="dieser bedient dann die Priority-Queue"/>
|
||||
<node CREATED="1687909860136" ID="ID_1257565620" MODIFIED="1687910043028" TEXT="...und gibt es kooperativ wieder frei">
|
||||
<linktarget COLOR="#af5678" DESTINATION="ID_1257565620" ENDARROW="Default" ENDINCLINATION="223;172;" ID="Arrow_ID_1390633196" SOURCE="ID_1887123630" STARTARROW="None" STARTINCLINATION="-430;56;"/>
|
||||
<node CREATED="1687909898834" ID="ID_688462252" MODIFIED="1694016347114" TEXT="Deadlock-Gefahr">
|
||||
<node CREATED="1687909898834" ID="ID_688462252" MODIFIED="1697583754517" TEXT="Deadlock-Gefahr">
|
||||
<linktarget COLOR="#88617a" DESTINATION="ID_688462252" ENDARROW="Default" ENDINCLINATION="118;-18;" ID="Arrow_ID_953966962" SOURCE="ID_240227471" STARTARROW="None" STARTINCLINATION="-312;13;"/>
|
||||
<linktarget COLOR="#f95182" DESTINATION="ID_688462252" ENDARROW="Default" ENDINCLINATION="-17;60;" ID="Arrow_ID_1801176056" SOURCE="ID_1725190336" STARTARROW="None" STARTINCLINATION="-186;-6;"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1687909906855" ID="ID_195997630" MODIFIED="1687909912310" TEXT="Watchdog notwendig">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1687909906855" ID="ID_195997630" MODIFIED="1697583958025" TEXT="Watchdog notwendig">
|
||||
<linktarget COLOR="#71457a" DESTINATION="ID_195997630" ENDARROW="Default" ENDINCLINATION="-1608;190;" ID="Arrow_ID_345281595" SOURCE="ID_942157229" STARTARROW="None" STARTINCLINATION="-375;32;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1687909963201" ID="ID_369489190" MODIFIED="1687909968365" TEXT="realisiert per Tick"/>
|
||||
<node CREATED="1687909969073" ID="ID_1256883233" MODIFIED="1687909980556" TEXT="geprüft beim Zugriff auf den Scheduler"/>
|
||||
|
|
@ -84969,8 +84971,14 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node CREATED="1694015344557" ID="ID_571276241" LINK="https://en.cppreference.com/w/cpp/atomic/memory_order#Release-Acquire_ordering" MODIFIED="1694015377170" TEXT="auch CPP-Reference ist völlig klar in diesem Punkt (»Release-Acquire-Ordering«)"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697473042062" ID="ID_1462757404" MODIFIED="1697473067073" TEXT="Platz im Scheduler und Zugriff">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#435e98" CREATED="1697473042062" ID="ID_1462757404" MODIFIED="1697583781583" TEXT="Platz im Scheduler und Zugriff">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1697583689827" ID="ID_1410024395" MODIFIED="1697583694398" TEXT="es sitzt im Layer-2"/>
|
||||
<node CREATED="1697583695082" ID="ID_1723522955" MODIFIED="1697583709990" TEXT="Zugriff erfolgt implizit aus der Logik heraus"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697583713560" ID="ID_1725190336" MODIFIED="1697583771560" TEXT="die Logik muß sicherstellen, daß es freigegeben wird">
|
||||
<arrowlink COLOR="#f95182" DESTINATION="ID_688462252" ENDARROW="Default" ENDINCLINATION="-17;60;" ID="Arrow_ID_1801176056" STARTARROW="None" STARTINCLINATION="-186;-6;"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -85034,11 +85042,11 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1697553564965" ID="ID_280879756" MODIFIED="1697553576815" TEXT="der »POST-Eingang«">
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
<node CREATED="1697553690189" ID="ID_937487663" MODIFIED="1697559787891" TEXT="enthält die Entscheidung über den Dispatch">
|
||||
<arrowlink COLOR="#6d677a" DESTINATION="ID_1453351337" ENDARROW="Default" ENDINCLINATION="7;-29;" ID="Arrow_ID_1868115325" STARTARROW="None" STARTINCLINATION="-51;3;"/>
|
||||
<node CREATED="1697553690189" ID="ID_937487663" MODIFIED="1697583424961" TEXT="enthält die Entscheidung über den Dispatch">
|
||||
<arrowlink COLOR="#6d677a" DESTINATION="ID_1453351337" ENDARROW="Default" ENDINCLINATION="3;-38;" ID="Arrow_ID_1868115325" STARTARROW="None" STARTINCLINATION="-51;3;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1697553928685" ID="ID_416015404" MODIFIED="1697559763784" TEXT="Form des Dispatch?">
|
||||
<node COLOR="#435e98" CREATED="1697553928685" ID="ID_416015404" MODIFIED="1697583437483" TEXT="Form des Dispatch?">
|
||||
<icon BUILTIN="help"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697555373532" ID="ID_323766443" MODIFIED="1697559741749" STYLE="fork" TEXT="Problem: Dependencies">
|
||||
<font NAME="SansSerif" SIZE="12"/>
|
||||
|
|
@ -85077,9 +85085,83 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1697559712744" ID="ID_1900900735" MODIFIED="1697559730521" TEXT="dort passiert auch jedwede Dependency-Injection"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697553674095" ID="ID_1453351337" MODIFIED="1697559787891" TEXT="decideNowOrLater">
|
||||
<linktarget COLOR="#6d677a" DESTINATION="ID_1453351337" ENDARROW="Default" ENDINCLINATION="7;-29;" ID="Arrow_ID_1868115325" SOURCE="ID_937487663" STARTARROW="None" STARTINCLINATION="-51;3;"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697553674095" ID="ID_1453351337" MODIFIED="1697583424961" TEXT="decideDispatchNow">
|
||||
<linktarget COLOR="#6d677a" DESTINATION="ID_1453351337" ENDARROW="Default" ENDINCLINATION="3;-38;" ID="Arrow_ID_1868115325" SOURCE="ID_937487663" STARTARROW="None" STARTINCLINATION="-51;3;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1697579158340" ID="ID_793480355" MODIFIED="1697579176584" TEXT="Ausführen ist möglich...">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1697579178708" ID="ID_787430790" MODIFIED="1697579237139" TEXT="wenn der Startzeitpunkt nicht in der Zukunft liegt"/>
|
||||
<node CREATED="1697579245499" ID="ID_60360398" MODIFIED="1697579263604" TEXT="wenn der aktuelle Thread das GroomingToken erlangen kann"/>
|
||||
</node>
|
||||
<node CREATED="1697579298524" ID="ID_593152010" MODIFIED="1697583436601" TEXT="Kontext der Entscheidung">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1697579409584" ID="ID_1475629503" MODIFIED="1697579417440" TEXT="Worker sucht Arbeit">
|
||||
<node CREATED="1697579435142" ID="ID_1101443095" MODIFIED="1697579457411" TEXT="dann ist das GroomingToken-Besitz bereits vorausgesetzt"/>
|
||||
<node CREATED="1697579470701" ID="ID_491245332" MODIFIED="1697579493026" TEXT="den Rest der Entscheidung macht bereits Layer-1">
|
||||
<node CREATED="1697579495039" ID="ID_1363159889" MODIFIED="1697579501366" TEXT="braucht dazu die aktuelle Zeit"/>
|
||||
<node CREATED="1697579501929" ID="ID_1156519476" MODIFIED="1697579509826" TEXT="stellt fest, ob überhaupt was in der Queue ist"/>
|
||||
<node CREATED="1697579510504" ID="ID_556911724" MODIFIED="1697579524746" TEXT="prüft den WaterLevel am Ausgang der Queue"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1697579541116" ID="ID_1539153693" MODIFIED="1697579559549" TEXT="λ-post">
|
||||
<node CREATED="1697579566464" ID="ID_284248868" MODIFIED="1697579575139" TEXT="kommt aus einer laufenden Ausführung"/>
|
||||
<node CREATED="1697579575973" ID="ID_1493021297" MODIFIED="1697579597952" TEXT="liefert den Startzeitpunkt als Parameter"/>
|
||||
<node CREATED="1697579599123" ID="ID_132991826" MODIFIED="1697579631058" TEXT="muß dann explizit das GroomingToken prüfen"/>
|
||||
</node>
|
||||
<node CREATED="1697579633655" ID="ID_700287234" MODIFIED="1697579642105" TEXT="von Extern neu übergebener Chain">
|
||||
<node CREATED="1697579656164" ID="ID_1585466417" MODIFIED="1697579662208" TEXT="beginnt mit einem POST"/>
|
||||
<node CREATED="1697579663228" ID="ID_1429242310" MODIFIED="1697579670951" TEXT="daraus ergibt sich der Start-Zeitpunkt"/>
|
||||
<node CREATED="1697579673554" ID="ID_85549667" MODIFIED="1697579682709" TEXT="GroomingToken muß erlangt werden"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1697579748287" ID="ID_1583484788" MODIFIED="1697579771817" TEXT="⟹ nur die letzten beiden Fälle">
|
||||
<node CREATED="1697579774229" ID="ID_1513919615" MODIFIED="1697583362689" TEXT="und zwar fallen sie sogar zusammen">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node CREATED="1697579781571" ID="ID_466935258" MODIFIED="1697579790174" TEXT="die Zeit ist explizit gegeben"/>
|
||||
<node CREATED="1697579807584" ID="ID_1369153607" MODIFIED="1697579813611" TEXT="brauche zudem die aktuelle Zeit"/>
|
||||
<node CREATED="1697579814431" ID="ID_184140714" MODIFIED="1697583353917">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
versuche GroomingToken zu erlangen (<b><font color="#5e3348">Seiteneffekt</font></b>)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697583303207" ID="ID_332099803" MODIFIED="1697583538155" TEXT="aber: kein dropGroomingToken() bei negativer Entscheidung">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...weil im normalen Control-flow direkt danach die Activity in die Queue gestellt wird — und da können wir eine <i>signifikannte Beschleunigung</i> erziehlen wenn wir das GroomingToken halten und deshalb nicht durch die Instruct-Queue gehen müssen
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697583572667" ID="ID_1258733239" MODIFIED="1697583665481" TEXT="Konsequenz: fällige Activities drängen sich vor">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...und zwar, weil sie infolge der hier getroffenen Entscheidung unmittelbar in den Dispatch gehen können; wäre das nicht so, dann würde u.U aus der Priority-Queue zunächst eine noch dringendere/frühere Aufgabe entnommen werden.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1697559873907" ID="ID_409935766" MODIFIED="1697567713362" TEXT="acquireGoomingToken">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -86024,7 +86106,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697483439491" ID="ID_20743819" MODIFIED="1697483452170" TEXT="die Bestandteile des API abdecken">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1697483458376" ID="ID_1335346824" MODIFIED="1697483469019" TEXT="das GroomingToken"/>
|
||||
<node CREATED="1697483469919" ID="ID_1121885008" MODIFIED="1697483490272" TEXT="die ExecutionCtx-λ"/>
|
||||
<node CREATED="1697483469919" ID="ID_1121885008" MODIFIED="1697571744407" TEXT="Logik für Queue-Zugriff"/>
|
||||
<node CREATED="1697571773963" ID="ID_1386234233" MODIFIED="1697571786371" TEXT="Ausführen eine Activity-Kette"/>
|
||||
<node CREATED="1697571745624" ID="ID_599597531" MODIFIED="1697571773200" TEXT="Entscheidung ob direkt ausgeführt wird"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697473111557" ID="ID_750298563" MODIFIED="1697484608763" TEXT="Bestandteile des Work-Funktors direkt verbinden">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
|
|
@ -86163,8 +86247,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697560511607" ID="ID_764686457" MODIFIED="1697560620825" TEXT="verify_DispatchDecision">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1697560511607" ID="ID_764686457" LINK="#ID_1453351337" MODIFIED="1697585897682" TEXT="verify_DispatchDecision">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697560535930" ID="ID_849370574" MODIFIED="1697560620825" TEXT="verify_findWork">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
|
|
@ -89208,6 +89292,10 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1692108511352" ID="ID_316055460" MODIFIED="1692108529978" TEXT="aber Ausnahme-Situationen sind an einen sehr spezifischen Kontext gebunden"/>
|
||||
<node CREATED="1692108530641" ID="ID_991521612" MODIFIED="1692108564761" TEXT="die Stelle, die die Ausnahme erkennt, kennt i.d.R. diesen (=ihren eigenen) Kontext nicht"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1697583823705" ID="ID_942157229" MODIFIED="1697583958025" TEXT="Watchdog für GroomingToken">
|
||||
<arrowlink COLOR="#71457a" DESTINATION="ID_195997630" ENDARROW="Default" ENDINCLINATION="-1608;190;" ID="Arrow_ID_345281595" STARTARROW="None" STARTINCLINATION="-375;32;"/>
|
||||
<icon BUILTIN="hourglass"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1693238644990" ID="ID_1196672113" MODIFIED="1693238729300" TEXT="Laststeuerung für »free-wheeling« / background render">
|
||||
<arrowlink COLOR="#965d71" DESTINATION="ID_1960804622" ENDARROW="Default" ENDINCLINATION="286;89;" ID="Arrow_ID_494620026" STARTARROW="None" STARTINCLINATION="2087;110;"/>
|
||||
|
|
|
|||
Loading…
Reference in a new issue