mem leak fixed about the default visitor
[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 #include <memory>
19
20 #include "exp.hxx"
21 #include "runvisitor.hxx"
22
23 extern "C"
24 {
25 #include "dynlib_core.h"
26 }
27
28 class CORE_IMPEXP Runner
29 {
30 public :
31     Runner(ast::Exp* _theProgram, ast::RunVisitor *_visitor) : m_theProgram(_theProgram), m_visitor(_visitor), m_isConsoleCommand(false), m_isInterruptible(true)
32     { }
33
34     Runner(ast::Exp* _theProgram, ast::RunVisitor *_visitor, bool _isConsoleCommand, bool _isInterruptible) : m_theProgram(_theProgram), m_visitor(_visitor), m_isConsoleCommand(_isConsoleCommand), m_isInterruptible(_isInterruptible)
35     { }
36
37     ~Runner()
38     {
39         delete m_theProgram;
40     }
41
42     ast::RunVisitor *getVisitor()
43     {
44         return m_visitor.get();
45     }
46
47     ast::Exp* getProgram()
48     {
49         return m_theProgram;
50     }
51
52     bool isConsoleCommand()
53     {
54         return m_isConsoleCommand;
55     }
56
57     bool isInterruptible()
58     {
59         return m_isInterruptible;
60     }
61
62 private :
63     ast::Exp* m_theProgram;
64     std::unique_ptr<ast::RunVisitor> m_visitor;
65     bool m_isConsoleCommand;
66     bool m_isInterruptible;
67
68     // static members to manage execution
69 };
70
71 class StaticRunner
72 {
73 public:
74     static void launch(void);
75     static void setRunner(Runner* _RunMe);
76     static Runner* getRunner(void);
77     static bool isRunnerAvailable(void);
78     static bool isInterruptibleCommand(void);
79     static void setInterruptibleCommand(bool _isInterruptible);
80     static void execAndWait(ast::Exp* _theProgram, ast::RunVisitor *_visitor,
81                             bool _isInterruptible, bool _isPrioritary, bool _isConsoleCommand);
82     static void exec(ast::Exp* _theProgram, ast::RunVisitor *_visitor);
83
84 private:
85     static std::atomic<Runner*> m_RunMe;
86     static std::atomic<bool> m_bInterruptibleCommand;
87 };
88
89 extern "C"
90 {
91     void StaticRunner_launch(void);
92     int StaticRunner_isRunnerAvailable(void);
93     int StaticRunner_isInterruptibleCommand(void);
94     void StaticRunner_setInterruptibleCommand(int val);
95 }
96
97 #endif /* !__RUNNER_HXX__ */