5b2b6467d4033257badf45bbf2145f45386440c5
[scilab.git] / scilab / modules / core / includes / runner.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2010-2010 - DIGITEO - Bruno JOFRET
4  *  Copyright (C) 2014-2015 - Scilab Enterprises - Cedric Delamarre
5  *
6  *  This file must be used under the terms of the CeCILL.
7  *  This source file is licensed as described in the file COPYING, which
8  *  you should have received as part of this distribution.  The terms
9  *  are also available at
10  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14 #ifndef __RUNNER_HXX__
15 #define __RUNNER_HXX__
16
17 #include <atomic>
18
19 #include "exp.hxx"
20 #include "runvisitor.hxx"
21
22 extern "C"
23 {
24 #include "dynlib_core.h"
25 }
26
27 class CORE_IMPEXP Runner
28 {
29 public :
30     Runner(ast::Exp* _theProgram, ast::RunVisitor *_visitor)
31     {
32         m_theProgram = _theProgram;
33         m_visitor = _visitor;
34         m_isConsoleCommand = false;
35         m_isInterruptible = true;
36     }
37
38     Runner(ast::Exp* _theProgram, ast::RunVisitor *_visitor, bool _isConsoleCommand, bool _isInterruptible)
39     {
40         m_theProgram = _theProgram;
41         m_visitor = _visitor;
42         m_isConsoleCommand = _isConsoleCommand;
43         m_isInterruptible = _isInterruptible;
44     }
45
46     ~Runner()
47     {
48         delete m_theProgram;
49         delete m_visitor;
50     }
51
52     ast::RunVisitor *getVisitor()
53     {
54         return m_visitor;
55     }
56
57     ast::Exp* getProgram()
58     {
59         return m_theProgram;
60     }
61
62     bool isConsoleCommand()
63     {
64         return m_isConsoleCommand;
65     }
66
67     bool isInterruptible()
68     {
69         return m_isInterruptible;
70     }
71
72 private :
73     ast::Exp* m_theProgram;
74     ast::RunVisitor* m_visitor;
75     bool m_isConsoleCommand;
76     bool m_isInterruptible;
77
78     // static members to manage execution
79 };
80
81 class StaticRunner
82 {
83 public:
84     static void launch(void);
85     static void setRunner(Runner* _RunMe);
86     static Runner* getRunner(void);
87     static bool isRunnerAvailable(void);
88     static bool isInterruptibleCommand(void);
89     static void setInterruptibleCommand(bool _isInterruptible);
90     static void execAndWait(ast::Exp* _theProgram, ast::RunVisitor *_visitor,
91                             bool _isInterruptible, bool _isPrioritary, bool _isConsoleCommand);
92     static void exec(ast::Exp* _theProgram, ast::RunVisitor *_visitor);
93
94 private:
95     static std::atomic<Runner*> m_RunMe;
96     static std::atomic<bool> m_bInterruptibleCommand;
97 };
98
99 extern "C"
100 {
101     void StaticRunner_launch(void);
102     int StaticRunner_isRunnerAvailable(void);
103     int StaticRunner_isInterruptibleCommand(void);
104     void StaticRunner_setInterruptibleCommand(int val);
105 }
106
107 #endif /* !__RUNNER_HXX__ */