License Header change: Removed the LICENSE_END before beta
[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  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13 *
14 */
15
16 #ifndef __THREADMANAGEMENT_HXX__
17 #define __THREADMANAGEMENT_HXX__
18
19 extern "C"
20 {
21 #include "Thread_Wrapper.h"
22 #include "dynamiclibrary.h"
23 #include "dynlib_ast.h"
24 }
25
26 //#define DEBUG_THREAD
27
28 class EXTERN_AST ThreadManagement
29 {
30 private :
31
32     static __threadLock m_RunnerLock;
33     static __threadLock m_ParseLock;
34     static __threadLock m_StoreCommandLock;
35     static __threadLock m_ScilabReadLock;
36
37     static __threadSignal m_ConsoleExecDone;
38     static __threadSignalLock m_ConsoleExecDoneLock;
39
40     static __threadSignal m_AwakeRunner;
41     static __threadSignalLock m_AwakeRunnerLock;
42
43     static __threadSignal m_AvailableRunner;
44     static __threadSignalLock m_AvailableRunnerLock;
45
46     static __threadSignal m_StartPending;
47     static __threadSignalLock m_StartPendingLock;
48
49     static __threadSignal m_CommandStored;
50     static __threadSignalLock m_CommandStoredLock;
51
52     static __threadSignal m_RunMe;
53     static __threadSignalLock m_RunMeLock;
54
55     static __threadSignal m_EmptyQueue;
56     static __threadSignalLock m_EmptyQueueLock;
57
58     // used to avoid "Spurious Wakeups"
59     static bool m_AvailableRunnerWasSignalled;
60     static bool m_ConsoleExecDoneWasSignalled;
61     static bool m_AwakeRunnerWasSignalled;
62     static bool m_StartPendingWasSignalled;
63     static bool m_CommandStoredWasSignalled;
64     static bool m_RunMeWasSignalled;
65     static bool m_EmptyQueueWasSignalled;
66
67 #ifdef DEBUG_THREAD
68     static __threadKey m_tkMain;
69     static __threadKey m_tkReadAndExec;
70     static __threadKey m_tkConsole;
71 #endif // DEBUG_THREAD
72
73 public :
74     static void initialize(void);
75
76     static void LockParser(void);
77     static void UnlockParser(void);
78     static void LockStoreCommand(void);
79     static void UnlockStoreCommand(void);
80     static void LockRunner(void);
81     static void UnlockRunner(void);
82     static void LockScilabRead(void);
83     static void UnlockScilabRead(void);
84
85     static void SendAvailableRunnerSignal(void);
86     static void WaitForAvailableRunnerSignal(void);
87     static void SendConsoleExecDoneSignal(void);
88     static void WaitForConsoleExecDoneSignal(void);
89     static void SendAwakeRunnerSignal(void);
90     static void WaitForAwakeRunnerSignal(void);
91     static void SendStartPendingSignal(void);
92     static void WaitForStartPendingSignal(void);
93     static void SendCommandStoredSignal(void);
94     static void WaitForCommandStoredSignal(void);
95     static void SendRunMeSignal(void);
96     static void WaitForRunMeSignal(void);
97
98 #ifdef DEBUG_THREAD
99     static void SetThreadKey(__threadKey tkMain, __threadKey tkReadAndExec, __threadKey tkConsole);
100     static void PrintDebugHead();
101 private :
102     static void PrintDebug(const char* pcfunName);
103 #endif // DEBUG_THREAD
104
105 };
106
107 #endif /* !__THREADMANAGEMENT_HXX__ */