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