tclsci plugged
[scilab.git] / scilab / modules / ast / includes / system_env / threadmanagement.hxx
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2015 - Scilab-Enterprises - Cedric Delamarre
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 __THREADMANAGEMENT_HXX__
14 #define __THREADMANAGEMENT_HXX__
15
16 extern "C"
17 {
18 #include "Thread_Wrapper.h"
19 #include "dynamiclibrary.h"
20 #include "dynlib_ast.h"
21 }
22
23 //#define DEBUG_THREAD
24
25 class EXTERN_AST ThreadManagement
26 {
27 private :
28
29     static __threadLock m_RunnerLock;
30     static __threadLock m_ParseLock;
31     static __threadLock m_StoreCommandLock;
32     static __threadLock m_ScilabReadLock;
33
34     static __threadSignal m_ConsoleExecDone;
35     static __threadSignalLock m_ConsoleExecDoneLock;
36
37     static __threadSignal m_AwakeRunner;
38     static __threadSignalLock m_AwakeRunnerLock;
39
40     static __threadSignal m_AvailableRunner;
41     static __threadSignalLock m_AvailableRunnerLock;
42
43     static __threadSignal m_StartPending;
44     static __threadSignalLock m_StartPendingLock;
45
46     static __threadSignal m_CommandStored;
47     static __threadSignalLock m_CommandStoredLock;
48
49     static __threadSignal m_RunMe;
50     static __threadSignalLock m_RunMeLock;
51
52     static __threadSignal m_EmptyQueue;
53     static __threadSignalLock m_EmptyQueueLock;
54
55     // used to avoid "Spurious Wakeups"
56     static bool m_AvailableRunnerWasSignalled;
57     static bool m_ConsoleExecDoneWasSignalled;
58     static bool m_AwakeRunnerWasSignalled;
59     static bool m_StartPendingWasSignalled;
60     static bool m_CommandStoredWasSignalled;
61     static bool m_RunMeWasSignalled;
62     static bool m_EmptyQueueWasSignalled;
63
64 #ifdef DEBUG_THREAD
65     static __threadKey m_tkMain;
66     static __threadKey m_tkReadAndExec;
67     static __threadKey m_tkConsole;
68 #endif // DEBUG_THREAD
69
70 public :
71     static void initialize(void);
72
73     static void LockParser(void);
74     static void UnlockParser(void);
75     static void LockStoreCommand(void);
76     static void UnlockStoreCommand(void);
77     static void LockRunner(void);
78     static void UnlockRunner(void);
79     static void LockScilabRead(void);
80     static void UnlockScilabRead(void);
81
82     static void SendAvailableRunnerSignal(void);
83     static void WaitForAvailableRunnerSignal(void);
84     static void SendConsoleExecDoneSignal(void);
85     static void WaitForConsoleExecDoneSignal(void);
86     static void SendAwakeRunnerSignal(void);
87     static void WaitForAwakeRunnerSignal(void);
88     static void SendStartPendingSignal(void);
89     static void WaitForStartPendingSignal(void);
90     static void SendCommandStoredSignal(void);
91     static void WaitForCommandStoredSignal(void);
92     static void SendRunMeSignal(void);
93     static void WaitForRunMeSignal(void);
94
95 #ifdef DEBUG_THREAD
96     static void SetThreadKey(__threadKey tkMain, __threadKey tkReadAndExec, __threadKey tkConsole);
97     static void PrintDebugHead();
98 private :
99     static void PrintDebug(const char* pcfunName);
100 #endif // DEBUG_THREAD
101
102 };
103
104 #endif /* !__THREADMANAGEMENT_HXX__ */