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:
parent
9cb0a9b680
commit
d879ae7fbd
5 changed files with 239 additions and 112 deletions
|
|
@ -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(); }
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -263,7 +263,8 @@ namespace control {
|
|||
}
|
||||
// leave the Session thread...
|
||||
// send notification of subsystem shutdown
|
||||
notifyEnd (&errorMsg);
|
||||
thread_.detach();
|
||||
notifyEnd (&errorMsg); // invokes ~DispatcherLoop()
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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};
|
||||
|
|
|
|||
|
|
@ -79415,9 +79415,7 @@ Date:   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ß der zuletzt gesetzte Identifier plötzlich auf allen Threads auftaucht
|
||||
|
|
@ -79463,9 +79461,7 @@ Date:   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ä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:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1695946643647" ID="ID_175299311" MODIFIED="1695946663576" TEXT="ansonsten könnte man das nämlich auf vector<string> festlegen"/>
|
||||
<node CREATED="1695946673835" ID="ID_1137129563" MODIFIED="1695946859221" TEXT="der Name "stingify" ist gut, aber nicht variierbar">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Er ist aus mehreren Gründen gut
|
||||
|
|
@ -79525,9 +79519,7 @@ Date:   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ß sie nur lesen können)
|
||||
|
|
@ -80009,9 +80001,7 @@ Date:   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ß eine bestimmte Berechnung stattgefunden hat
|
||||
|
|
@ -80022,9 +80012,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node COLOR="#338800" CREATED="1696007745882" ID="ID_523093343" MODIFIED="1696007928650" TEXT="Zeitmessung ⟹ 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:   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:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node CREATED="1696024808008" ID="ID_609747317" MODIFIED="1696025021431" TEXT="zirkulärer Bezug ⟹ template parameter deduction unmöglich">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...das ist <i>interessant,</i> aber nicht kritisch; und zwar weil ich den Test jetzt umgeschrieben habe auf ein Lambda, und gar keine eigenständige Klasse mehr verwende — viel spannender ist, daß der C++ - Compiler überhaupt schafft, solchen Code zu „knacken“
|
||||
|
|
@ -80517,24 +80501,21 @@ Date:   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ö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:   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ängt">
|
||||
<node COLOR="#435e98" CREATED="1696036468258" FOLDED="true" ID="ID_604722459" MODIFIED="1696180251352" TEXT="umgestellter Code hä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:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1696037199267" ID="ID_791125343" MODIFIED="1696037224734" TEXT="Mischzustand: der Dispatcher-Thread lä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's nicht">
|
||||
|
|
@ -80569,29 +80550,23 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<font NAME="SansSerif" SIZE="11"/>
|
||||
<node CREATED="1696038385875" ID="ID_1012862043" MODIFIED="1696038434994" TEXT="wäre aber unwahrscheinlich">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...denn das sollte sich nur während der Konstruktoren auswirken, und die sind ja alle "durch", gemäß Barriere
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1696038437552" ID="ID_1876729224" MODIFIED="1696038477225" TEXT="außerdem geht's da nur um Inkrementieren">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
dafü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üft: die alte Variante mit Lock hängt genauso">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -80603,9 +80578,7 @@ Date:   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ächlich (Debugger)"/>
|
||||
<node CREATED="1696119072544" ID="ID_1846378296" MODIFIED="1696119107817">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
aber hier schläft der Dispatcher-Thrad gar nicht — sondern <b>wartet auf das Lock</b>
|
||||
|
|
@ -80627,9 +80600,7 @@ Date:   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>
|
||||
⟹ der Test-Controller-Thread kommt gar nicht dazu,
|
||||
|
|
@ -80648,16 +80619,13 @@ Date:   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:   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ü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ässig mö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ührt das zu Problemen">
|
||||
<icon BUILTIN="clanbomber"/>
|
||||
|
|
@ -80719,16 +80684,13 @@ Date:   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 ⟹ 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:   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> 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:   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 „vorsorglich“ den Error-State auswertet,
|
||||
|
|
@ -80797,79 +80751,63 @@ Date:   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> 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ü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ß sich diese Probleme nun häufen liegt an der »Integration«">
|
||||
<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> noch mit einbaut, aber letztlich nur „über die Mauer wirft“
|
||||
</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ß</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> ist ein <b>Bug</b> 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 »convenience-shortcut« hat eine Lücke geöffnet">
|
||||
|
|
@ -80883,6 +80821,13 @@ Date:   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ä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:   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 ü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 ü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 ≡ DispatcherLoop"/>
|
||||
<node CREATED="1696172307166" ID="ID_1506975261" MODIFIED="1696172331575" TEXT="das wird bisher vom term-notification-Functor selber gelöscht"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1696172336690" ID="ID_1797539126" MODIFIED="1696172376526" TEXT="Konsequenz ⟹ 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ürde er nicht werfen, dann wü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 ≙ 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üßte man die Verbindung zwischen beiden Konzepten explizit herstellen"/>
|
||||
<node CREATED="1696172881485" ID="ID_1067400081" MODIFIED="1696172894911" TEXT="und bräuchte dafür einen anderen Thread + Thread-Überwachung / join()"/>
|
||||
<node COLOR="#338800" CREATED="1696172907108" ID="ID_434799338" MODIFIED="1696172917688" TEXT="⟹ es paß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ü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öglich (und grenzt an ein unstabiles System)">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
in beiden Fällen wird die Barriere als erstes aufgerufen
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
im Haupt-Thread wird das Thread-Handle als Letztes konstruiert — und da gibt es die synchronizes-with - Garantie
|
||||
</li>
|
||||
<li>
|
||||
im neuen Thread passiert außerdem nur die Konstruktion eines noch leeren Fehler-Strings — 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ü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ässigeres gibt als Selbstmord">
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
<node CREATED="1696174292902" ID="ID_866561914" MODIFIED="1696174342106" TEXT="aber vom SteamDispatcher-dtor gäbe es eine Lü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ürde der runningLoop_-SmartPtr einfach gelö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ücke ist nicht ohne Weiteres zu schließen">
|
||||
<icon BUILTIN="stop-sign"/>
|
||||
<node CREATED="1696174702895" ID="ID_1380801993" MODIFIED="1696174725175" TEXT="das müßte der DispatcherLoop-dtor machen"/>
|
||||
<node CREATED="1696174725742" ID="ID_378849236" MODIFIED="1696174735656" TEXT="er müß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ürde im Falle eines verklemmten Thread hängenbleiben"/>
|
||||
</node>
|
||||
<node CREATED="1696174926711" ID="ID_417247305" MODIFIED="1696177074324" TEXT="insofern ist dann ein Application-Terminate die bessere Lösung">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...man bekommt <i>das</i> nun automatisch, für die andere Lösung müßte diffiziler Code geschrieben werden, der die Gefahr bringt, den Shutdown-Vorgang insgesamt zu blocken. Oder man müßte ein »try-lock« machen mit Timeout; das ist noch gar nicht auf das API herausgeführt, wäre also noch mehr komplizierter Code. Und würde letzten Endes doch nicht verhindern können, daß <i>genau in den problematischen Fä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ü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="⟹ gehö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ö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ö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ürde das automatisch stets gelten, wenn das Objekt zerstört wird"/>
|
||||
<node COLOR="#932528" CREATED="1696177037104" ID="ID_925946621" MODIFIED="1696177080240" TEXT="also auch in den Grenzfä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äuft"/>
|
||||
<node CREATED="1696177143357" ID="ID_1904486724" MODIFIED="1696177174667" TEXT="und erwiesenermaß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ß dafür die detach()-Funktion herausfü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 ⟹ ↯"/>
|
||||
</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 <TestKlasse>"/>
|
||||
<node CREATED="1696182767484" ID="ID_776777098" MODIFIED="1696182788837" TEXT="scons check TESTSUITES=<substring-match>"/>
|
||||
<node CREATED="1696182802127" ID="ID_746155609" MODIFIED="1696182846274" TEXT="Resource-limits �� 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">
|
||||
|
|
|
|||
Loading…
Reference in a new issue