Threads execution managemement.
[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, bool _isPriorityThread);
51
52     void exec(ast::Exp* _theProgram, ast::ExecVisitor *_visitor);
53
54     ast::ExecVisitor *getVisitor()
55     {
56         return m_visitor;
57     }
58
59     ast::Exp* getProgram()
60     {
61         return m_theProgram;
62     }
63
64     __threadId getThreadId(void)
65     {
66         return m_threadId;
67     }
68
69     void setThreadId(__threadId _threadId)
70     {
71         m_threadId = _threadId;
72     }
73
74     __threadKey getThreadKey(void)
75     {
76         return m_threadKey;
77     }
78
79     static __threadSignal* getAstPendingSignal(void)
80     {
81         return &m_AstPending;
82     }
83
84     void setThreadKey(__threadKey _threadId)
85     {
86         m_threadKey = _threadId;
87     }
88
89     static void UnlockPrompt();
90
91     static void LockPrompt();
92
93 private :
94     static void *launch(void *args);
95
96 private :
97     __threadKey m_threadKey;
98     __threadId m_threadId;
99     ast::Exp*           m_theProgram;
100     ast::ExecVisitor*   m_visitor;
101
102 private :
103     static __threadSignal m_awakeScilab;
104     static __threadSignalLock m_awakeScilabLock;
105     static __threadLock m_lock;
106     static __threadLock m_PrioritaryLock;
107     static __threadSignal m_AstPending;
108     static __threadSignalLock m_AstPendingLock;
109 };
110 #endif /* !__RUNNER_HXX__ */