threads management fixed
[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     static __threadLock m_RunnerLock;
29     static __threadLock m_ParseLock;
30     static __threadLock m_StoreCommandLock;
31
32     static __threadSignal m_ConsoleExecDone;
33     static __threadSignalLock m_ConsoleExecDoneLock;
34
35     static __threadSignal m_AwakeRunner;
36     static __threadSignalLock m_AwakeRunnerLock;
37
38     static __threadSignal m_AvailableRunner;
39     static __threadSignalLock m_AvailableRunnerLock;
40
41     static __threadSignal m_StartPending;
42     static __threadSignalLock m_StartPendingLock;
43
44     static __threadSignal m_CommandStored;
45     static __threadSignalLock m_CommandStoredLock;
46
47     static __threadSignal m_RunMe;
48     static __threadSignalLock m_RunMeLock;
49
50     // used to avoid "Spurious Wakeups"
51     static bool m_AvailableRunnerWasSignalled;
52     static bool m_ConsoleExecDoneWasSignalled;
53     static bool m_AwakeRunnerWasSignalled;
54     static bool m_StartPendingWasSignalled;
55     static bool m_CommandStoredWasSignalled;
56     static bool m_RunMeWasSignalled;
57
58 #ifdef DEBUG_THREAD
59     static __threadKey m_tkMain;
60     static __threadKey m_tkReadAndExec;
61     static __threadKey m_tkConsole;
62 #endif // DEBUG_THREAD
63
64 public :
65     static void initialize(void);
66
67     static void LockParser(void);
68     static void UnlockParser(void);
69     static void LockStoreCommand(void);
70     static void UnlockStoreCommand(void);
71     static void LockRunner(void);
72     static void UnlockRunner(void);
73
74     static void SendAvailableRunnerSignal(void);
75     static void WaitForAvailableRunnerSignal(void);
76     static void SendConsoleExecDoneSignal(void);
77     static void WaitForConsoleExecDoneSignal(void);
78     static void SendAwakeRunnerSignal(void);
79     static void WaitForAwakeRunnerSignal(void);
80     static void SendStartPendingSignal(void);
81     static void WaitForStartPendingSignal(void);
82     static void SendCommandStoredSignal(void);
83     static void WaitForCommandStoredSignal(void);
84     static void SendRunMeSignal(void);
85     static void WaitForRunMeSignal(void);
86
87 #ifdef DEBUG_THREAD
88     static void SetThreadKey(__threadKey tkMain, __threadKey tkReadAndExec, __threadKey tkConsole);
89     static void PrintDebugHead();
90 private :
91     static void PrintDebug(const char* pcfunName);
92 #endif // DEBUG_THREAD
93
94
95 };
96
97 #endif /* !__THREADMANAGEMENT_HXX__ */