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
es ergeben sich zwei Schwierigkeiten...
@@ -79490,9 +79486,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
Er ist aus mehreren Gründen gut
@@ -79525,9 +79519,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
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
...indem man testet, daß eine bestimmte Berechnung stattgefunden hat
@@ -80022,9 +80012,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
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
### Lumiera halted due to an unexpected Error ###
@@ -80099,9 +80085,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
...das ist interessant, 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
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.
...denn das sollte sich nur während der Konstruktoren auswirken, und die sind ja alle "durch", gemäß Barriere
dafür braucht man heutzutage nun wirklich kein Lock mehr
aber hier schläft der Dispatcher-Thrad gar nicht — sondern wartet auf das Lock
@@ -80627,9 +80600,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
⟹ der Test-Controller-Thread kommt gar nicht dazu,
@@ -80648,16 +80619,13 @@ Date: Thu Apr 20 18:53:17 2023 +0200
ein verschleppter Error-State
...und zwar an der einzigen Stelle, an der das zuverlässig möglich ist: im Konstruktur von Exceptions
Debugger ⟹ Lock-Guard-Destruktor wird nicht aufgerufen
die Exception fliegt ja aus dem Konstruktor vom Guard
(ja dann KANNs ja gar nicht funktionieren)
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
die Gleichwertigkeit von Error-Flag und Exception wird nun in Frage gestellt
Plan: künftig sollen Error-Flags nur noch aus C-Code stammen
solange ich nur Detail-Komponenten gebaut habe, konnte ich von komplett definiertem Kontext (Unit-Test) ausgehen; damit waren Exceptions vor allem etwas, was man pro forma noch mit einbaut, aber letztlich nur „über die Mauer wirft“
die verschleppte Exception ist aber nur der Anlaß
der Grund ist ein Bug im Objekt-Monitor
+ waitGracePeriod: Thread 'Lumiera_Session' failed to terminate after grace period.
+
+ warum ist das so?
+
+ ist das sinnvoll?
+
+ in beiden Fällen wird die Barriere als erstes aufgerufen
+
+ 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.
+
+ ...man bekommt das 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ß genau in den problematischen Fällen der Thread nicht aufwacht/nicht reagiert und dann doch noch die Applikation terminiert wird
+
Des weiteren ist nicht klar, was die Kopplung zwischen Exception und Error-State soll
+
+
+