thread management fixed.
[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  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #ifndef __RUNNER_HXX__
14 #define __RUNNER_HXX__
15
16 #include <iostream>
17 #include "exp.hxx"
18 #include "execvisitor.hxx"
19
20 extern "C"
21 {
22 #include "Thread_Wrapper.h"
23 #include "dynlib_core.h"
24
25     __threadSignal* getAstPendingSignal();
26 }
27
28 #include "threadId.hxx"
29
30
31 class CORE_IMPEXP Runner
32 {
33 private :
34     Runner(ast::Exp* _theProgram, ast::ExecVisitor *_visitor)
35     {
36         m_theProgram = _theProgram;
37         m_visitor = _visitor;
38     }
39
40     ~Runner()
41     {
42         delete m_theProgram;
43         delete m_visitor;
44     }
45
46 public :
47
48     static void init();
49
50     static void execAndWait(ast::Exp* _theProgram, ast::ExecVisitor *_visitor,
51                             bool _isInterruptible, bool _isPrioritary, bool _isConsoleCommand);
52
53     void exec(ast::Exp* _theProgram, ast::ExecVisitor *_visitor);
54
55     ast::ExecVisitor *getVisitor()
56     {
57         return m_visitor;
58     }
59
60     ast::Exp* getProgram()
61     {
62         return m_theProgram;
63     }
64
65     __threadId getThreadId(void)
66     {
67         return m_threadId;
68     }
69
70     void setThreadId(__threadId _threadId)
71     {
72         m_threadId = _threadId;
73     }
74
75     __threadKey getThreadKey(void)
76     {
77         return m_threadKey;
78     }
79
80     static __threadSignal* getAstPendingSignal(void)
81     {
82         return &m_AstPending;
83     }
84
85     static __threadSignal* getConsoleExecDone(void)
86     {
87         return &m_consoleExecDone;
88     }
89
90     void setThreadKey(__threadKey _threadId)
91     {
92         m_threadKey = _threadId;
93     }
94
95     static void UnlockPrompt();
96
97     static void LockPrompt();
98
99 private :
100     static void *launch(void *args);
101
102 private :
103     __threadKey m_threadKey;
104     __threadId m_threadId;
105     ast::Exp*           m_theProgram;
106     ast::ExecVisitor*   m_visitor;
107
108 private :
109     static __threadSignal m_consoleExecDone;
110     static __threadSignal m_awakeScilab;
111     static __threadSignalLock m_awakeScilabLock;
112     static __threadLock m_lock;
113     static __threadLock m_PrioritaryLock;
114     static __threadSignal m_AstPending;
115     static __threadSignalLock m_AstPendingLock;
116 };
117 #endif /* !__RUNNER_HXX__ */