3c2df7ebb2c29db7d2c774384de6953d459b1c78
[scilab.git] / scilab / modules / core / src / cpp / pause.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2019-2019 - ESI Group - Cedric Delamarre
4  *
5  * This file is hereby licensed under the terms of the GNU GPL v2.0,
6  * pursuant to article 5.3.4 of the CeCILL v.2.1.
7  * This file was originally licensed under the terms of the CeCILL v2.1,
8  * and continues to be available under such terms.
9  * For more information, see the COPYING file which you should have received
10  * along with this program.
11  *
12  */
13
14 #include "configvariable.hxx"
15 #include "threadmanagement.hxx"
16 #include "runner.hxx"
17
18 extern "C" {
19 #include "pause.h"
20 }
21
22 void pause(void)
23 {
24     ConfigVariable::IncreasePauseLevel();
25
26     //return to console so change mode to 2
27     int iOldMode = ConfigVariable::getPromptMode();
28     ConfigVariable::setPromptMode(2);
29
30     // save current runner
31     Runner* rCurrent = StaticRunner::getCurrentRunner();
32
33     // send the good signal to unlock wait
34     // ie: unlock console thread to display prompt again
35     StaticRunner::sendExecDoneSignal();
36
37     int iPauseLevel = ConfigVariable::getPauseLevel();
38     while (ConfigVariable::getPauseLevel() == iPauseLevel)
39     {
40         ThreadManagement::SendAwakeRunnerSignal();
41         ThreadManagement::WaitForRunMeSignal();
42         if(StaticRunner::isRunnerAvailable())
43         {
44             StaticRunner::launch();
45         }
46     }
47
48     // set back the runner to know wich "execution done" signal send
49     // StaticRunner::sendExecDoneSignal
50     StaticRunner::setCurrentRunner(rCurrent);
51
52     //return from console so change mode to initial
53     ConfigVariable::setPromptMode(iOldMode);
54 }