draft request to halt the dispatcher loop

This commit is contained in:
Fischlurch 2016-12-15 06:21:59 +01:00
parent 86f446c197
commit 7e65dda771
5 changed files with 61 additions and 23 deletions

View file

@ -76,7 +76,7 @@ namespace lumiera {
virtual ~Subsys();
/** a human readable name */
virtual operator string () const =0;
virtual operator string() const =0;
/** define a dependency to another Subsys
@ -111,11 +111,11 @@ namespace lumiera {
* the SigTerm passed to #start must be invoked.
* @note called within a locked context (barrier)
* @warning must not block nor throw. */
virtual void triggerShutdown () noexcept =0;
virtual void triggerShutdown() noexcept =0;
const std::vector<Subsys*>
getPrerequisites () { return prereq_; }
getPrerequisites() { return prereq_; }
private:

View file

@ -51,6 +51,7 @@ namespace control {
{
bool canDispatch_{false};
bool blocked_ {false};
bool mustHalt_ {false};
unique_ptr<SessionCommandService> commandService_;
@ -68,8 +69,8 @@ namespace control {
{
try {
Lock sync(this);
commandService_.reset();
this->join();
commandService_.reset(); // redundant call, ensure the session interface is reliably closed
this->join(); // block until the loop thread terminates and is reaped
INFO (session, "Proc-Dispatcher stopped.");
}
ERROR_LOG_AND_IGNORE(session, "Stopping the Proc-Dispatcher");
@ -110,6 +111,15 @@ namespace control {
return 0;
}
void
requestStop() noexcept
{
Lock sync(this);
commandService_.reset(); // closes Session interface
mustHalt_ = true;
UNIMPLEMENTED("*must* notify loop thread"); /////////////////TODO really?
}
private:
void
run (Subsys::SigTerm sigTerm)
@ -117,7 +127,7 @@ namespace control {
string errorMsg;
try
{
TODO ("actually do something in the loop");
TODO ("actually do something in the loop"); /////////////////////////////////////////TODO *** THIS NEXT TO IMPLEMENT !!!! ***
sleep(2);
}
catch (lumiera::Error& problem)
@ -173,12 +183,17 @@ namespace control {
}
/** */
/** signal to the loop thread that it needs to terminate.
* @warning dangerous operation; must not block nor throw
*
* @todo need to re-check the logic, once the loop is fully implemented; ensure there is nothing on this call path that can block or throw!!!
*/
void
ProcDispatcher::requestStop()
ProcDispatcher::requestStop() noexcept
{
Lock sync(this);
UNIMPLEMENTED ("trigger shutdown into the dispacher loop thread");
if (runningLoop_)
runningLoop_->requestStop();
}

View file

@ -72,7 +72,7 @@ namespace control {
bool start (Subsys::SigTerm);
bool isRunning();
void requestStop();
void requestStop() noexcept;
void activate();
void deactivate();

View file

@ -81,7 +81,7 @@ namespace proc {
class SessionSubsystem
: public Subsys
{
operator string () const { return "Session"; }
operator string() const { return "Session"; }
/** @remarks there is no need explicitly to start the session core,
* since it will usually be pulled up as prerequisite */
@ -98,13 +98,13 @@ namespace proc {
}
void
triggerShutdown () noexcept override
triggerShutdown() noexcept override
{
ProcDispatcher::instance().requestStop();
}
bool
checkRunningState () noexcept override
checkRunningState() noexcept override
{
return ProcDispatcher::instance().isRunning();
}
@ -115,7 +115,7 @@ namespace proc {
class PlayOutSubsysDescriptor
: public Subsys
{
operator string () const { return "PlayOut"; }
operator string() const { return "PlayOut"; }
/** determine, if any output system is required to start up explicitly.
* Moreover, extract configuration variations for specific kinds of output
@ -142,14 +142,14 @@ namespace proc {
void
triggerShutdown () noexcept override
triggerShutdown() noexcept override
{
play::OutputDirector::instance().triggerDisconnect (completedSignal_);
}
bool
checkRunningState () noexcept override
checkRunningState() noexcept override
{
return play::OutputDirector::instance().isOperational();
}

View file

@ -508,7 +508,7 @@
<icon BUILTIN="pencil"/>
</node>
<node CREATED="1481777039358" ID="ID_395609084" MODIFIED="1481777050096" TEXT="Shutdown sauber regeln">
<node CREATED="1481777054755" ID="ID_1551225439" MODIFIED="1481777106485">
<node CREATED="1481777054755" ID="ID_1551225439" MODIFIED="1481778421924">
<richcontent TYPE="NODE"><html>
<head>
@ -523,11 +523,14 @@
</body>
</html>
</richcontent>
<icon BUILTIN="button_ok"/>
<node CREATED="1481778397600" ID="ID_1997192349" MODIFIED="1481778409498" TEXT="bereits wenn Anhalten signalisiert wird"/>
<node CREATED="1481778409942" ID="ID_100284739" MODIFIED="1481778419113" TEXT="zur Sicherheit nochmal im dtor"/>
</node>
<node CREATED="1481777114203" ID="ID_1156396729" MODIFIED="1481777121886" TEXT="Lock, um Deadlock zu vermeitden"/>
<node CREATED="1481777122306" ID="ID_1506554988" MODIFIED="1481777133445" TEXT="alles im dtor -&gt; noexcept"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1481777210447" ID="ID_1392452935" MODIFIED="1481777289370" TEXT="TODO: sicherstellen da&#xdf; join nicht blockt">
<arrowlink COLOR="#5a97df" DESTINATION="ID_1789585729" ENDARROW="Default" ENDINCLINATION="8475;0;" ID="Arrow_ID_1930701586" STARTARROW="None" STARTINCLINATION="8475;0;"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1481777210447" ID="ID_1392452935" MODIFIED="1481778497944" TEXT="TODO: sicherstellen da&#xdf; join nicht blockt">
<arrowlink COLOR="#5a97df" DESTINATION="ID_1789585729" ENDARROW="Default" ENDINCLINATION="6300;584;" ID="Arrow_ID_1930701586" STARTARROW="None" STARTINCLINATION="8475;0;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
@ -10989,8 +10992,8 @@
<node CREATED="1481688529539" ID="ID_1972961763" MODIFIED="1481688540109" TEXT="SessionManager ist zust&#xe4;ndig"/>
<node CREATED="1481688544921" ID="ID_1934560784" MODIFIED="1481688561386" TEXT="wenn Session geladen, ist ProcDispatcher freigegeben"/>
<node CREATED="1481688562830" ID="ID_708961458" MODIFIED="1481688582024" TEXT="SessionSubsystem startet processing loop im ProcDispatcher"/>
<node CREATED="1481777252497" ID="ID_1789585729" MODIFIED="1481777279294" TEXT="Shutdown">
<linktarget COLOR="#5a97df" DESTINATION="ID_1789585729" ENDARROW="Default" ENDINCLINATION="8475;0;" ID="Arrow_ID_1930701586" SOURCE="ID_1392452935" STARTARROW="None" STARTINCLINATION="8475;0;"/>
<node CREATED="1481777252497" ID="ID_1789585729" MODIFIED="1481778497944" TEXT="Shutdown">
<linktarget COLOR="#5a97df" DESTINATION="ID_1789585729" ENDARROW="Default" ENDINCLINATION="6300;584;" ID="Arrow_ID_1930701586" SOURCE="ID_1392452935" STARTARROW="None" STARTINCLINATION="8475;0;"/>
<node CREATED="1481777297635" ID="ID_483368010" MODIFIED="1481777305432" TEXT="Deadlock-Gefahr">
<icon BUILTIN="messagebox_warning"/>
</node>
@ -11002,14 +11005,34 @@
</node>
<node CREATED="1481777355747" ID="ID_1804595708" MODIFIED="1481777364326" TEXT="Subsystem-&gt;end">
<node CREATED="1481777368330" ID="ID_1933237483" MODIFIED="1481777374277" TEXT="Halte-Nachricht"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1481777374801" ID="ID_1844558240" MODIFIED="1481777385577" TEXT="sicherstellen, da&#xdf; Loop anh&#xe4;lt">
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1481777374801" ID="ID_1844558240" MODIFIED="1481778660075" TEXT="sicherstellen, da&#xdf; Loop anh&#xe4;lt">
<arrowlink COLOR="#f70841" DESTINATION="ID_1748096848" ENDARROW="Default" ENDINCLINATION="-200;-90;" ID="Arrow_ID_506637666" STARTARROW="None" STARTINCLINATION="-132;97;"/>
<icon BUILTIN="flag-pink"/>
</node>
<node CREATED="1481777397542" ID="ID_1147135932" MODIFIED="1481777409960" TEXT="DispatcherLoop tot"/>
<node CREATED="1481777397542" ID="ID_1147135932" MODIFIED="1481778447806" TEXT="DispatcherLoop stirbt"/>
<node CREATED="1481777410972" ID="ID_457965735" MODIFIED="1481777418982" TEXT="sigTerm"/>
<node CREATED="1481778453137" ID="ID_1895977623" MODIFIED="1481778465907" TEXT="bewirkt reapen des LoopThread"/>
</node>
</node>
</node>
<node CREATED="1481778538165" HGAP="37" ID="ID_522398894" MODIFIED="1481778549049" TEXT="ProcDispatcher" VSHIFT="12">
<node CREATED="1481778549940" ID="ID_676848252" MODIFIED="1481778556025" TEXT="DispatcherLoop">
<icon BUILTIN="pencil"/>
<node CREATED="1481778741546" ID="ID_684867533" MODIFIED="1481778755694" TEXT="&#xf6;ffnet Session-Interface">
<icon BUILTIN="button_ok"/>
</node>
<node CREATED="1481778565298" ID="ID_1803510423" MODIFIED="1481778569181" TEXT="Schleifen-Logik">
<node CREATED="1481778570153" ID="ID_6904207" MODIFIED="1481778579395" TEXT="beruht auf CondVar / wait"/>
</node>
<node CREATED="1481778590790" ID="ID_1748096848" MODIFIED="1481778652116" TEXT="Anhalten">
<linktarget COLOR="#f70841" DESTINATION="ID_1748096848" ENDARROW="Default" ENDINCLINATION="-200;-90;" ID="Arrow_ID_506637666" SOURCE="ID_1844558240" STARTARROW="None" STARTINCLINATION="-132;97;"/>
<node CREATED="1481778666820" ID="ID_1860590145" MODIFIED="1481778688685" TEXT="trigger-Variable mustHalt_"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1481778708207" ID="ID_1311208726" MODIFIED="1481778716670" TEXT="Builder-Steuerung">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node CREATED="1448314932726" ID="ID_669869188" MODIFIED="1448314941137" POSITION="right" TEXT="Render"/>
<node BACKGROUND_COLOR="#c9d1da" COLOR="#2d2198" CREATED="1439664045448" HGAP="240" ID="ID_21531707" MODIFIED="1439664212589" POSITION="left" TEXT="Info" VSHIFT="-500">