Library: fix cause of the deadlock in Session-Thread

... which became apparent after switching to the new Thread-wrapper implementation
... the reason is a bug in the Thread-Monitor (which will also be reworked soon)
This commit is contained in:
Fischlurch 2023-10-01 20:29:11 +02:00
parent 9cb0a9b680
commit d879ae7fbd
5 changed files with 239 additions and 112 deletions

View file

@ -198,7 +198,8 @@ namespace lib {
void
handle_end_of_thread()
{
BAS::threadImpl_.detach();
if (BAS::isLive())
BAS::threadImpl_.detach();
}
void
@ -344,6 +345,11 @@ namespace lib {
public:
using ThreadLifecycle::ThreadLifecycle;
/** allow to detach explicitly — independent from thread-function's state
* @warning ensure that thread function only uses storage within its own scope
*/
void detach() { ThreadLifecycle::handle_end_of_thread(); }
};

View file

@ -263,7 +263,8 @@ namespace control {
}
// leave the Session thread...
// send notification of subsystem shutdown
notifyEnd (&errorMsg);
thread_.detach();
notifyEnd (&errorMsg); // invokes ~DispatcherLoop()
}
void

View file

@ -17,7 +17,7 @@ return: 0
END
PLANNED "Yield-waiting sync performance" SyncBarrierPerformance_test <<END
TEST "Yield-waiting sync performance" SyncBarrierPerformance_test <<END
return: 0
END

View file

@ -50,7 +50,7 @@ namespace test {
namespace {// Test setup for a concurrent calculation with checksum....
const uint NUM_THREADS = 1024;
const uint NUM_THREADS = 256;
atomic_uint stage1{0};
atomic_uint stage2{0};

View file

@ -79415,9 +79415,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1695948115970" ID="ID_1540583557" MODIFIED="1695948165115" TEXT="die mehrfach auf Stackoverflow berichteten Probleme sind also gefixt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
es wurde von Race-Problemen berichtet, und davon, da&#223; der zuletzt gesetzte Identifier pl&#246;tzlich auf allen Threads auftaucht
@ -79463,9 +79461,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1695946258298" ID="ID_1253418449" MODIFIED="1695946448060" TEXT="die kann man aber in dem gew&#xe4;hlten API-Schema nicht (mehr) realisieren">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
es ergeben sich zwei Schwierigkeiten...
@ -79490,9 +79486,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1695946643647" ID="ID_175299311" MODIFIED="1695946663576" TEXT="ansonsten k&#xf6;nnte man das n&#xe4;mlich auf vector&lt;string&gt; festlegen"/>
<node CREATED="1695946673835" ID="ID_1137129563" MODIFIED="1695946859221" TEXT="der Name &quot;stingify&quot; ist gut, aber nicht variierbar">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Er ist aus mehreren Gr&#252;nden gut
@ -79525,9 +79519,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node COLOR="#435e98" CREATED="1695915623001" ID="ID_284696799" MODIFIED="1695915685105" TEXT="keine weiteren compile-Time-Checks">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
das macht nur den Code komplex, macht aber die Diagnostik nicht besser; std::invoke hat bereits gute Diagnostik (man mu&#223; sie nur lesen k&#246;nnen)
@ -80009,9 +80001,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node COLOR="#338800" CREATED="1695394418004" ID="ID_1846217863" MODIFIED="1696002269162" TEXT="testen: ein Aufruf pro Thread hat stattgefunden">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...indem man testet, da&#223; eine bestimmte Berechnung stattgefunden hat
@ -80022,9 +80012,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node COLOR="#338800" CREATED="1696007745882" ID="ID_523093343" MODIFIED="1696007928650" TEXT="Zeitmessung &#x27f9; Beweis der Parallelisierung">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Da ich jetzt einen einfachsten Fall habe, kann der eigentliche Test doch wieder etwas komplexer sein...
@ -80069,9 +80057,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1695911804614" ID="ID_174546781" MODIFIED="1695911929623" TEXT="Scheitert mit Fehler">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
<font face="Monospaced" size="2">### Lumiera halted due to an unexpected Error ### </font>
@ -80099,9 +80085,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1696024808008" ID="ID_609747317" MODIFIED="1696025021431" TEXT="zirkul&#xe4;rer Bezug &#x27f9; template parameter deduction unm&#xf6;glich">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...das ist <i>interessant,</i>&#160;aber nicht kritisch; und zwar weil ich den Test jetzt umgeschrieben habe auf ein Lambda, und gar keine eigenst&#228;ndige Klasse mehr verwende &#8212; viel spannender ist, da&#223; der C++ - Compiler &#252;berhaupt schafft, solchen Code zu &#8222;knacken&#8220;
@ -80517,24 +80501,21 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-yellow"/>
<icon BUILTIN="pencil"/>
<node CREATED="1696029414385" ID="ID_140265798" MODIFIED="1696029417676" TEXT="weitere Tests...">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1696029465122" ID="ID_1060376805" MODIFIED="1696036148318" TEXT="SessionCommandFunction_test">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1696029465122" ID="ID_1060376805" MODIFIED="1696180242543" TEXT="SessionCommandFunction_test">
<icon BUILTIN="button_ok"/>
<node CREATED="1696036153400" ID="ID_1572079642" MODIFIED="1696036156883" TEXT="Umstellung">
<node CREATED="1696036158076" ID="ID_429764463" MODIFIED="1696036170175" TEXT="puh... der Test ist komplex">
<icon BUILTIN="smiley-oh"/>
</node>
<node CREATED="1696036172041" ID="ID_1669094555" MODIFIED="1696036317600" TEXT="nicht klar ob ich die Barriere wirklich brauche">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Theoretisch sollte sie sehr wohl n&#246;tig sein, da wir hier einen TypedCounter initialisieren, und das bedingt globales Locking; d.h. die weitere Initialisierung im ctor eines Threads kann durch einen anderen Thread aufgehalten werden.
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1696036369976" ID="ID_1754677356" MODIFIED="1696036379688" TEXT="lieber sauber...">
<node CREATED="1696036380543" ID="ID_1634940367" MODIFIED="1696036392151" TEXT="der Thread wird ein member-Feld"/>
@ -80544,7 +80525,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1696036451549" ID="ID_351344035" MODIFIED="1696036465487" TEXT="der Test-Thread partizipiert an der Barriere"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1696036468258" ID="ID_604722459" MODIFIED="1696036477574" TEXT="umgestellter Code h&#xe4;ngt">
<node COLOR="#435e98" CREATED="1696036468258" FOLDED="true" ID="ID_604722459" MODIFIED="1696180251352" TEXT="umgestellter Code h&#xe4;ngt">
<icon BUILTIN="broken-line"/>
<node CREATED="1696036872517" ID="ID_747545275" MODIFIED="1696036880792" TEXT="Beobachtung">
<node CREATED="1696036882068" ID="ID_670148447" MODIFIED="1696036973668" TEXT="die Threads laufen"/>
@ -80558,7 +80539,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1696037199267" ID="ID_791125343" MODIFIED="1696037224734" TEXT="Mischzustand: der Dispatcher-Thread l&#xe4;uft auf dem alten Framework">
<icon BUILTIN="messagebox_warning"/>
<node COLOR="#338800" CREATED="1696039674199" ID="ID_1718267866" MODIFIED="1696039763561" TEXT="sicherheitshalber auch gleich umstellen">
<arrowlink COLOR="#49b261" DESTINATION="ID_556208204" ENDARROW="Default" ENDINCLINATION="1224;154;" ID="Arrow_ID_1257115855" STARTARROW="None" STARTINCLINATION="602;40;"/>
<arrowlink COLOR="#71be6f" DESTINATION="ID_556208204" ENDARROW="Default" ENDINCLINATION="1038;-401;" ID="Arrow_ID_1257115855" STARTARROW="None" STARTINCLINATION="602;40;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#497db2" CREATED="1696039767003" ID="ID_1053399266" MODIFIED="1696039787013" TEXT="Tja.... das war&apos;s nicht">
@ -80569,29 +80550,23 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<font NAME="SansSerif" SIZE="11"/>
<node CREATED="1696038385875" ID="ID_1012862043" MODIFIED="1696038434994" TEXT="w&#xe4;re aber unwahrscheinlich">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...denn das sollte sich nur w&#228;hrend der Konstruktoren auswirken, und die sind ja alle &quot;durch&quot;, gem&#228;&#223; Barriere
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1696038437552" ID="ID_1876729224" MODIFIED="1696038477225" TEXT="au&#xdf;erdem geht&apos;s da nur um Inkrementieren">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
daf&#252;r braucht man heutzutage nun wirklich kein Lock mehr
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node COLOR="#338800" CREATED="1696038478167" ID="ID_268185715" MODIFIED="1696038501250" TEXT="gepr&#xfc;ft: die alte Variante mit Lock h&#xe4;ngt genauso">
<icon BUILTIN="button_ok"/>
@ -80603,9 +80578,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1696119047052" ID="ID_936117034" MODIFIED="1696119060820" TEXT="so ist es und das passiert auch tats&#xe4;chlich (Debugger)"/>
<node CREATED="1696119072544" ID="ID_1846378296" MODIFIED="1696119107817">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
aber hier schl&#228;ft der Dispatcher-Thrad gar nicht &#8212; sondern <b>wartet auf das Lock</b>
@ -80627,9 +80600,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1696081298897" ID="ID_1868082673" MODIFIED="1696081376953">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
&#10233; der Test-Controller-Thread kommt gar nicht dazu,
@ -80648,16 +80619,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1696081133452" ID="ID_1817962717" MODIFIED="1696081429821">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
ein <i>verschleppter </i>Error-State
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<linktarget COLOR="#ea255e" DESTINATION="ID_1817962717" ENDARROW="Default" ENDINCLINATION="13;-34;" ID="Arrow_ID_1502503112" SOURCE="ID_1414770650" STARTARROW="None" STARTINCLINATION="-60;3;"/>
<icon BUILTIN="broken-line"/>
<node CREATED="1696081456787" ID="ID_1943309176" MODIFIED="1696081469917" TEXT="jeder ThreadJoinable setzt versehentlich im ctor den Error-State"/>
@ -80668,16 +80636,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1696081544119" ID="ID_588082490" MODIFIED="1696081570191" TEXT="das C++ Exception-Handling nimmt keine R&#xfc;cksicht auf C"/>
<node CREATED="1696081571283" ID="ID_970986418" MODIFIED="1696081613486" TEXT="wir haben versucht, beides miteinander zu verknoten">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...und zwar an der einzigen Stelle, an der das zuverl&#228;ssig m&#246;glich ist: im Konstruktur von Exceptions
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1696081614501" ID="ID_459919469" MODIFIED="1696081636718" TEXT="sobald man Exceptions als Datentyp konstruiert, f&#xfc;hrt das zu Problemen">
<icon BUILTIN="clanbomber"/>
@ -80719,16 +80684,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1696119627366" ID="ID_9801066" MODIFIED="1696119976164">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
Debugger &#10233; Lock-Guard-<b>Destruktor wird nicht aufgerufen</b>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<arrowlink COLOR="#db3b65" DESTINATION="ID_893400394" ENDARROW="Default" ENDINCLINATION="214;-12;" ID="Arrow_ID_1289856285" STARTARROW="None" STARTINCLINATION="-385;17;"/>
<icon BUILTIN="broken-line"/>
</node>
@ -80740,32 +80702,26 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1696119729864" ID="ID_1528519295" MODIFIED="1696119766685">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
die Exception fliegt ja <b>aus dem Konstruktor</b>&#160;vom Guard
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1696119796679" ID="ID_1360508343" MODIFIED="1696119834888">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
(ja dann <font size="5">KANN</font>s ja gar nicht funktionieren)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<font NAME="SansSerif" SIZE="11"/>
<icon BUILTIN="ksmiletris"/>
</node>
@ -80783,9 +80739,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1696110202816" ID="ID_892025569" MODIFIED="1696110324805">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
das Problem ist entstanden weil der Monitor &#8222;vorsorglich&#8220; den Error-State auswertet,
@ -80797,79 +80751,63 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
Des weiteren ist nicht klar, was die Kopplung zwischen Exception und Error-State soll
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1696110353252" ID="ID_1579091753" MODIFIED="1696110384783">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
die <b>Gleichwertigkeit</b>&#160;von Error-Flag und Exception wird nun <i>in Frage gestellt</i>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1696110388984" ID="ID_1739603971" MODIFIED="1696110439910">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<u>Plan</u>: k&#252;nftig sollen Error-Flags nur noch aus C-Code stammen
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="yes"/>
</node>
</node>
<node CREATED="1696110741312" ID="ID_1412671366" MODIFIED="1696110830911" TEXT="da&#xdf; sich diese Probleme nun h&#xe4;ufen liegt an der &#xbb;Integration&#xab;">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
solange ich nur Detail-Komponenten gebaut habe, konnte ich von komplett definiertem Kontext (Unit-Test) ausgehen; damit waren Exceptions vor allem etwas, was man <i>pro forma</i>&#160;noch mit einbaut, aber letztlich nur &#8222;&#252;ber die Mauer wirft&#8220;
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="smiley-oh"/>
</node>
<node CREATED="1696119904681" ID="ID_1065151947" MODIFIED="1696119920360">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
die verschleppte Exception ist aber nur der <b>Anla&#223;</b>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1696119921079" ID="ID_893400394" MODIFIED="1696119969475">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
der <b>Grund</b>&#160;ist ein <b>Bug</b>&#160;im Objekt-Monitor
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<linktarget COLOR="#db3b65" DESTINATION="ID_893400394" ENDARROW="Default" ENDINCLINATION="214;-12;" ID="Arrow_ID_1289856285" SOURCE="ID_9801066" STARTARROW="None" STARTINCLINATION="-385;17;"/>
<icon BUILTIN="broken-line"/>
<node CREATED="1696119983670" ID="ID_878293823" MODIFIED="1696120171437" TEXT="der &#xbb;convenience-shortcut&#xab; hat eine L&#xfc;cke ge&#xf6;ffnet">
@ -80883,6 +80821,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1696179893084" ID="ID_174464195" MODIFIED="1696179935262" TEXT="auch noch Shutdown-Problem zu fixen...">
<arrowlink COLOR="#8dbdb4" DESTINATION="ID_1071243890" ENDARROW="Default" ENDINCLINATION="-743;-551;" ID="Arrow_ID_572192244" STARTARROW="None" STARTINCLINATION="376;26;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1696179937254" ID="ID_1888898055" MODIFIED="1696179947701" TEXT="damit l&#xe4;uft der Test wieder (endlich)">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node CREATED="1696029465122" ID="ID_1515483274" MODIFIED="1696029516437" TEXT="subsystem-runner-test.cpp (/zLumi/tests/core/application)"/>
<node CREATED="1696029465124" ID="ID_1556068052" MODIFIED="1696029514685" TEXT="typed-counter-test.cpp (/zLumi/tests/basics)"/>
@ -80901,12 +80846,180 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1696029465121" ID="ID_786350998" MODIFIED="1696029583638" TEXT="gtk-lumiera.cpp"/>
<node CREATED="1696029465122" ID="ID_871343805" MODIFIED="1696029593893" TEXT="output-director.cpp"/>
<node CREATED="1696029465122" ID="ID_556208204" MODIFIED="1696039758193" TEXT="steam-dispatcher.cpp">
<linktarget COLOR="#49b261" DESTINATION="ID_556208204" ENDARROW="Default" ENDINCLINATION="1224;154;" ID="Arrow_ID_1257115855" SOURCE="ID_1718267866" STARTARROW="None" STARTINCLINATION="602;40;"/>
<node CREATED="1696039703074" ID="ID_796238065" MODIFIED="1696039722180" TEXT="Refactoring wie &#xfc;blich">
<node CREATED="1696029465122" ID="ID_556208204" MODIFIED="1696171137865" TEXT="steam-dispatcher.cpp">
<linktarget COLOR="#71be6f" DESTINATION="ID_556208204" ENDARROW="Default" ENDINCLINATION="1038;-401;" ID="Arrow_ID_1257115855" SOURCE="ID_1718267866" STARTARROW="None" STARTINCLINATION="602;40;"/>
<node COLOR="#338800" CREATED="1696039703074" ID="ID_796238065" MODIFIED="1696171045349" TEXT="Refactoring wie &#xfc;blich">
<icon BUILTIN="button_ok"/>
<node CREATED="1696039723008" ID="ID_932291373" MODIFIED="1696039728651" TEXT="Thread wird ein Member-Feld"/>
<node CREATED="1696039729255" ID="ID_249325323" MODIFIED="1696039735587" TEXT="Sync-Barrier kommt hinzu"/>
</node>
<node COLOR="#435e98" CREATED="1696171047044" ID="ID_964609053" MODIFIED="1696179878653" TEXT="Problem beim Shutdown">
<icon BUILTIN="messagebox_warning"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1696171082115" ID="ID_150270315" MODIFIED="1696171100640" TEXT="Session-Thread endet nicht rechtzeitig">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
waitGracePeriod: Thread 'Lumiera_Session' failed to terminate after grace period.
</p>
</body>
</html></richcontent>
<icon BUILTIN="info"/>
<node CREATED="1696172256844" ID="ID_352295134" MODIFIED="1696172274686" TEXT="Thread &#x2261; DispatcherLoop"/>
<node CREATED="1696172307166" ID="ID_1506975261" MODIFIED="1696172331575" TEXT="das wird bisher vom term-notification-Functor selber gel&#xf6;scht"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1696172336690" ID="ID_1797539126" MODIFIED="1696172376526" TEXT="Konsequenz &#x27f9; der noch laufende Thread ruft seinen eigenen Destuktor auf">
<icon BUILTIN="broken-line"/>
<node CREATED="1696172493551" ID="ID_1120531407" MODIFIED="1696172509808" TEXT="der Thread-Destrukor wartet kurz, und wirft dann"/>
<node CREATED="1696172517220" ID="ID_1113453961" MODIFIED="1696172534093" TEXT="w&#xfc;rde er nicht werfen, dann w&#xfc;rde sich der Thread kurz danach detachen"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1696172462964" ID="ID_876148747" MODIFIED="1696175328335">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
warum ist das so?
</p>
<p>
ist das sinnvoll?
</p>
</body>
</html></richcontent>
<icon BUILTIN="help"/>
<node CREATED="1696172561670" ID="ID_620791350" MODIFIED="1696172587782" TEXT="running state &#x2259; DispatcherLoop-Objekt existiert"/>
<node COLOR="#435e98" CREATED="1696172623600" ID="ID_1471623002" MODIFIED="1696175317007" TEXT="damit wollte ich eine sichere Kopplung herstellen">
<icon BUILTIN="idea"/>
<node CREATED="1696172642005" ID="ID_921992168" MODIFIED="1696172651550" TEXT="DispatcherLoop ist ein RAII-Objekt"/>
<node CREATED="1696172681686" ID="ID_1541411027" MODIFIED="1696172692065" TEXT="dem enstpricht auch die explizite Barriere"/>
<node CREATED="1696172695380" ID="ID_1254306173" MODIFIED="1696172729082" TEXT="SteamDispatcher::start und endRunningState sind synchronisiert"/>
<node CREATED="1696172817924" ID="ID_1141803561" MODIFIED="1696172876819" TEXT="alternativ m&#xfc;&#xdf;te man die Verbindung zwischen beiden Konzepten explizit herstellen"/>
<node CREATED="1696172881485" ID="ID_1067400081" MODIFIED="1696172894911" TEXT="und br&#xe4;uchte daf&#xfc;r einen anderen Thread + Thread-&#xdc;berwachung / join()"/>
<node COLOR="#338800" CREATED="1696172907108" ID="ID_434799338" MODIFIED="1696172917688" TEXT="&#x27f9; es pa&#xdf;t also mit dem Konzept zusammen"/>
</node>
<node COLOR="#338800" CREATED="1696172925590" ID="ID_130436239" MODIFIED="1696175313092" TEXT="ist diese Kopplung sicher?">
<node CREATED="1696172988445" ID="ID_822132261" MODIFIED="1696172995959" TEXT="f&#xfc;r den Start...">
<node COLOR="#066645" CREATED="1696172997319" ID="ID_1455213267" MODIFIED="1696176686628" TEXT="ja ...">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
</node>
<node CREATED="1696172997319" ID="ID_984430515" MODIFIED="1696173486889" TEXT="mit der latenten Gefahr des Blockens">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1696173058257" ID="ID_483471033" MODIFIED="1696173083204" TEXT="nur wenn der Thread gleich beim Start scheitert"/>
<node CREATED="1696173122482" ID="ID_302416524" MODIFIED="1696173160233" TEXT="oder wenn der erzeugende Konstruktor nach dem Thread-Start scheitert"/>
<node CREATED="1696173189872" ID="ID_782472492" MODIFIED="1696173447331" TEXT="beides ist nahezu unm&#xf6;glich (und grenzt an ein unstabiles System)">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
in beiden F&#228;llen wird die Barriere als erstes aufgerufen
</p>
<ul>
<li>
im Haupt-Thread wird das Thread-Handle als Letztes konstruiert &#8212; und da gibt es die synchronizes-with - Garantie
</li>
<li>
im neuen Thread passiert au&#223;erdem nur die Konstruktion eines noch leeren Fehler-Strings &#8212; alles danach ist per try-catch gesichert
</li>
</ul>
</body></html></richcontent>
</node>
</node>
</node>
<node CREATED="1696173490663" ID="ID_124664616" MODIFIED="1696173497466" TEXT="f&#xfc;r den Stop">
<node COLOR="#066645" CREATED="1696173526081" ID="ID_1081334982" MODIFIED="1696176686628" TEXT="ebenfalls ...">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
</node>
<node CREATED="1696174068329" ID="ID_888374698" MODIFIED="1696174098634" TEXT="und zwar weil es nichts Zuverl&#xe4;ssigeres gibt als Selbstmord">
<icon BUILTIN="ksmiletris"/>
</node>
<node CREATED="1696174292902" ID="ID_866561914" MODIFIED="1696174342106" TEXT="aber vom SteamDispatcher-dtor g&#xe4;be es eine L&#xfc;cke">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1696174343863" ID="ID_210073839" MODIFIED="1696174470614" TEXT="ebenfalls ehr unwahrscheinlich (Singleton!)">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
SteamDispatcher ist ein Service und wird in lib::Depend gemanaged. Derartige Singletons werden zwar irgendwann in der Shutdown-Phase bereinigt, aber normalerweise treten wir erst in die Shutdown-Phase ein, nachdem allen Subsystemen zumindest ein Shutdown signalisiert wurde.
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1696174472359" ID="ID_1149398789" MODIFIED="1696174497192" TEXT="von dort w&#xfc;rde der runningLoop_-SmartPtr einfach gel&#xf6;scht"/>
<node CREATED="1696174634290" ID="ID_1749494407" MODIFIED="1696174650666" TEXT="ohne den Session-Thread zum Terminieren aufzufordern">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1696174655799" ID="ID_1216532720" MODIFIED="1696174669186" TEXT="diese L&#xfc;cke ist nicht ohne Weiteres zu schlie&#xdf;en">
<icon BUILTIN="stop-sign"/>
<node CREATED="1696174702895" ID="ID_1380801993" MODIFIED="1696174725175" TEXT="das m&#xfc;&#xdf;te der DispatcherLoop-dtor machen"/>
<node CREATED="1696174725742" ID="ID_378849236" MODIFIED="1696174735656" TEXT="er m&#xfc;&#xdf;te dem Thread den Shutdown signalisieren"/>
<node CREATED="1696174736196" ID="ID_1866488488" MODIFIED="1696174747575" TEXT="leider erfordert das Sync-and-Wait"/>
<node CREATED="1696174749107" ID="ID_171253555" MODIFIED="1696174769351" TEXT="und w&#xfc;rde im Falle eines verklemmten Thread h&#xe4;ngenbleiben"/>
</node>
<node CREATED="1696174926711" ID="ID_417247305" MODIFIED="1696177074324" TEXT="insofern ist dann ein Application-Terminate die bessere L&#xf6;sung">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...man bekommt <i>das</i>&#160;nun automatisch, f&#252;r die andere L&#246;sung m&#252;&#223;te diffiziler Code geschrieben werden, der die Gefahr bringt, den Shutdown-Vorgang insgesamt zu blocken. Oder man m&#252;&#223;te ein &#187;try-lock&#171; machen mit Timeout; das ist noch gar nicht auf das API herausgef&#252;hrt, w&#228;re also noch mehr komplizierter Code. Und w&#252;rde letzten Endes doch nicht verhindern k&#246;nnen, da&#223; <i>genau in den problematischen F&#228;llen </i>der Thread nicht aufwacht/nicht reagiert und dann doch noch die Applikation terminiert wird
</p>
</body>
</html></richcontent>
<linktarget COLOR="#bc3e72" DESTINATION="ID_417247305" ENDARROW="Default" ENDINCLINATION="206;0;" ID="Arrow_ID_1906425600" SOURCE="ID_925946621" STARTARROW="None" STARTINCLINATION="206;0;"/>
<icon BUILTIN="yes"/>
</node>
</node>
<node CREATED="1696174904566" ID="ID_745420059" MODIFIED="1696174921027" TEXT="die eigentliche Thrad-Funktion ist per try-catch gesch&#xfc;tzt">
<icon BUILTIN="idea"/>
</node>
<node COLOR="#435e98" CREATED="1696176370511" ID="ID_1759926688" MODIFIED="1696176643937" TEXT="wie sicher ist der Selbstmord-Vorgang selber?">
<icon BUILTIN="help"/>
<node CREATED="1696176433703" ID="ID_1123914019" MODIFIED="1696176459264" TEXT="termNotification ist in der Closure gespeichert"/>
<node CREATED="1696176503014" ID="ID_1090075543" MODIFIED="1696176600301" TEXT="diese wird als Argument in die Thread-Fuktion kopiert"/>
<node COLOR="#338800" CREATED="1696176619520" ID="ID_1033213746" MODIFIED="1696177174667" TEXT="&#x27f9; geh&#xf6;rt zum garantierten Scope">
<linktarget COLOR="#87c5b7" DESTINATION="ID_1033213746" ENDARROW="Default" ENDINCLINATION="313;0;" ID="Arrow_ID_1257203311" SOURCE="ID_1904486724" STARTARROW="None" STARTINCLINATION="167;0;"/>
</node>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1696176922895" ID="ID_894080515" MODIFIED="1696176963529" TEXT="Fazit">
<icon BUILTIN="yes"/>
<node CREATED="1696176949523" ID="ID_907429283" MODIFIED="1696176950503" TEXT="sinnvoll und sicher"/>
<node CREATED="1696176957868" ID="ID_569990793" MODIFIED="1696176957868" TEXT="Thread managt sich selber"/>
</node>
</node>
<node COLOR="#338800" CREATED="1696176966281" ID="ID_1071243890" MODIFIED="1696179922757" TEXT="L&#xf6;sung: Thread koppelt sich selber ab">
<linktarget COLOR="#8dbdb4" DESTINATION="ID_1071243890" ENDARROW="Default" ENDINCLINATION="-743;-551;" ID="Arrow_ID_572192244" SOURCE="ID_174464195" STARTARROW="None" STARTINCLINATION="376;26;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1696176982865" ID="ID_1686523145" MODIFIED="1696179853242" TEXT="wo genau? zwei M&#xf6;glichkeiten">
<icon BUILTIN="info"/>
<node COLOR="#5b280f" CREATED="1696176995637" ID="ID_532167398" MODIFIED="1696177004072" TEXT="im Destruktor">
<icon BUILTIN="button_cancel"/>
<node CREATED="1696177005660" ID="ID_1745890395" MODIFIED="1696177036396" TEXT="dann w&#xfc;rde das automatisch stets gelten, wenn das Objekt zerst&#xf6;rt wird"/>
<node COLOR="#932528" CREATED="1696177037104" ID="ID_925946621" MODIFIED="1696177080240" TEXT="also auch in den Grenzf&#xe4;llen, in denen der Thread nicht gestoppt werden konnte">
<arrowlink COLOR="#bc3e72" DESTINATION="ID_417247305" ENDARROW="Default" ENDINCLINATION="206;0;" ID="Arrow_ID_1906425600" STARTARROW="None" STARTINCLINATION="206;0;"/>
<icon BUILTIN="stop-sign"/>
</node>
</node>
<node CREATED="1696177085505" ID="ID_108805274" MODIFIED="1696177094514" TEXT="explizit in der Thread-Funktion">
<icon BUILTIN="forward"/>
<node CREATED="1696177106759" ID="ID_1374675857" MODIFIED="1696177125522" TEXT="dann passiert es nur, wenn der Thread wirklich dem Ende entgegenl&#xe4;uft"/>
<node CREATED="1696177143357" ID="ID_1904486724" MODIFIED="1696177174667" TEXT="und erwiesenerma&#xdf;en nur noch Storage verwendet, die in der Thread-Funktion selber liegt">
<arrowlink COLOR="#87c5b7" DESTINATION="ID_1033213746" ENDARROW="Default" ENDINCLINATION="313;0;" ID="Arrow_ID_1257203311" STARTARROW="None" STARTINCLINATION="167;0;"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1696177190359" ID="ID_889014785" MODIFIED="1696179846631" TEXT="also in DispatcherLoop::runSessionThread">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1696177262410" ID="ID_1515122146" MODIFIED="1696179845361" TEXT="mu&#xdf; daf&#xfc;r die detach()-Funktion herausf&#xfc;hren">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1696179742816" ID="ID_1577887214" MODIFIED="1696179842760" TEXT="und gegen bereits beendete Threads absichern">
<icon BUILTIN="button_ok"/>
<node CREATED="1696179766628" ID="ID_1678833575" MODIFIED="1696179775663" TEXT="denn nun wird detach ggfs. mehrfach aufgerufen"/>
<node CREATED="1696179776747" ID="ID_1341493089" MODIFIED="1696179836199" TEXT="und einer davon wird einen Thread antreffen, der nicht mehr joinable() ist &#x27f9; &#x21af;"/>
</node>
</node>
</node>
</node>
</node>
</node>
@ -92304,9 +92417,16 @@ 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" FOLDED="true" HGAP="23" ID="ID_1624761863" MODIFIED="1689294849730" TEXT="Test/Debug" VSHIFT="35">
<node CREATED="1689294635406" FOLDED="true" HGAP="23" ID="ID_1624761863" MODIFIED="1696182854609" TEXT="Test/Debug" VSHIFT="35">
<cloud COLOR="#e4d4ac"/>
<icon BUILTIN="info"/>
<node CREATED="1696182724524" ID="ID_1871189508" MODIFIED="1696182799932" TEXT="Test-parameter">
<node CREATED="1696182751233" ID="ID_1536557329" MODIFIED="1696182765784" TEXT="target/test-suite &lt;TestKlasse&gt;"/>
<node CREATED="1696182767484" ID="ID_776777098" MODIFIED="1696182788837" TEXT="scons check TESTSUITES=&lt;substring-match&gt;"/>
<node CREATED="1696182802127" ID="ID_746155609" MODIFIED="1696182846274" TEXT="Resource-limits &#xd83e;&#xdc32; test.conf">
<icon BUILTIN="idea"/>
</node>
</node>
<node CREATED="1689294864822" ID="ID_1556429085" MODIFIED="1689294870249" TEXT="NoBug">
<node CREATED="1689294871597" ID="ID_1116343087" MODIFIED="1689294877880" TEXT="Logging-Tracing">
<node CREATED="1689294901089" ID="ID_249859430" MODIFIED="1689294914759" TEXT="export NOBUG_LOG=debugging:WARN,logging:INFO,test:TRACE,diff:TRACE,command:TRACE">