Scilab debugger updates
[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_DebuggerExecDone;
41     static __threadSignalLock m_DebuggerExecDoneLock;
42
43     static __threadSignal m_AwakeRunner;
44     static __threadSignalLock m_AwakeRunnerLock;
45
46     static __threadSignal m_AvailableRunner;
47     static __threadSignalLock m_AvailableRunnerLock;
48
49     static __threadSignal m_StartPending;
50     static __threadSignalLock m_StartPendingLock;
51
52     static __threadSignal m_CommandStored;
53     static __threadSignalLock m_CommandStoredLock;
54
55     static __threadSignal m_RunMe;
56     static __threadSignalLock m_RunMeLock;
57
58     static __threadSignal m_EmptyQueue;
59     static __threadSignalLock m_EmptyQueueLock;
60
61     // used to avoid "Spurious Wakeups"
62     static bool m_AvailableRunnerWasSignalled;
63     static bool m_ConsoleExecDoneWasSignalled;
64     static bool m_DebuggerExecDoneWasSignalled;
65     static bool m_AwakeRunnerWasSignalled;
66     static bool m_StartPendingWasSignalled;
67     static bool m_CommandStoredWasSignalled;
68     static bool m_RunMeWasSignalled;
69     static bool m_EmptyQueueWasSignalled;
70
71 #ifdef DEBUG_THREAD
72     static __threadKey m_tkMain;
73     static __threadKey m_tkReadAndExec;
74     static __threadKey m_tkConsole;
75 #endif // DEBUG_THREAD
76
77 public :
78     static void initialize(void);
79
80     static void LockParser(void);
81     static void UnlockParser(void);
82     static void LockStoreCommand(void);
83     static void UnlockStoreCommand(void);
84     static void LockRunner(void);
85     static void UnlockRunner(void);
86     static void LockScilabRead(void);
87     static void UnlockScilabRead(void);
88
89     static void SendAvailableRunnerSignal(void);
90     static void WaitForAvailableRunnerSignal(void);
91     static void SendConsoleExecDoneSignal(void);
92     static void WaitForConsoleExecDoneSignal(void);
93     static void SendDebuggerExecDoneSignal(void);
94     static void WaitForDebuggerExecDoneSignal(bool bResume);
95     static void SendAwakeRunnerSignal(void);
96     static void WaitForAwakeRunnerSignal(void);
97     static void SendStartPendingSignal(void);
98     static void WaitForStartPendingSignal(void);
99     static void SendCommandStoredSignal(void);
100     static void WaitForCommandStoredSignal(void);
101     static void SendRunMeSignal(void);
102     static void WaitForRunMeSignal(void);
103
104 #ifdef DEBUG_THREAD
105     static void SetThreadKey(__threadKey tkMain, __threadKey tkReadAndExec, __threadKey tkConsole);
106     static void PrintDebugHead();
107 private :
108     static void PrintDebug(const char* pcfunName);
109 #endif // DEBUG_THREAD
110
111 };
112
113 #endif /* !__THREADMANAGEMENT_HXX__ */