1 // SUPERV GraphExecutor : contains classes that permit execution of graphs and particularly the execution automaton
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : DataFlowBase_FiniteStateMachine.cxx
25 // Author : Jean Rahuel, CEA
35 #include "DataFlowExecutor_FiniteStateMachine.hxx"
37 void * start_function( void *p ) ;
40 #define VoidState SUPERV::VoidState
41 #define ToSuspendStartState SUPERV::ToSuspendStartState
42 #define ToSuspendState SUPERV::ToSuspendState
43 #define ToSuspendDoneState SUPERV::ToSuspendDoneState
44 #define ToKillState SUPERV::ToKillState
45 #define ToKillDoneState SUPERV::ToKillDoneState
46 #define ToStopState SUPERV::ToStopState
50 #define UnKnownState GraphExecutor::UnKnownState
51 #define DataUndefState GraphExecutor::DataUndefState
52 #define DataWaitingState GraphExecutor::DataWaitingState
53 #define DataReadyState GraphExecutor::DataReadyState
54 #define SuspendedReadyState GraphExecutor::SuspendedReadyState
55 #define SuspendedReadyToResumeState GraphExecutor::SuspendedReadyToResumeState
56 #define ResumedReadyState GraphExecutor::ResumedReadyState
57 #define KilledReadyState GraphExecutor::KilledReadyState
58 #define StoppedReadyState GraphExecutor::StoppedReadyState
59 #define ExecutingState GraphExecutor::ExecutingState
60 #define SuspendedExecutingState GraphExecutor::SuspendedExecutingState
61 #define ResumedExecutingState GraphExecutor::ResumedExecutingState
62 #define KilledExecutingState GraphExecutor::KilledExecutingState
63 #define StoppedExecutingState GraphExecutor::StoppedExecutingState
64 #define SuccessedExecutingState GraphExecutor::SuccessedExecutingState
65 #define ErroredExecutingState GraphExecutor::ErroredExecutingState
66 #define SuspendedSuccessedState GraphExecutor::SuspendedSuccessedState
67 #define SuspendedErroredState GraphExecutor::SuspendedErroredState
68 #define SuspendedSuccessedToReStartState GraphExecutor::SuspendedSuccessedToReStartState
69 #define SuspendedErroredToReStartState GraphExecutor::SuspendedErroredToReStartState
70 #define ResumedSuccessedState GraphExecutor::ResumedSuccessedState
71 #define ResumedErroredState GraphExecutor::ResumedErroredState
72 #define KilledSuccessedState GraphExecutor::KilledSuccessedState
73 #define KilledErroredState GraphExecutor::KilledErroredState
74 #define StoppedSuccessedState GraphExecutor::StoppedSuccessedState
75 #define StoppedErroredState GraphExecutor::StoppedErroredState
76 #define SuccessedState GraphExecutor::SuccessedState
77 #define ErroredState GraphExecutor::ErroredState
78 #define SuspendedState GraphExecutor::SuspendedState
79 #define KilledState GraphExecutor::KilledState
80 #define StoppedState GraphExecutor::StoppedState
81 #define ReStartedState GraphExecutor::ReStartedState
82 #define LoadingState GraphExecutor::LoadingState
83 #define NumberOfAutomatonStates GraphExecutor::NumberOfAutomatonStates
87 #define UndefinedEvent GraphExecutor::UndefinedEvent
88 #define NewThreadEvent GraphExecutor::NewThreadEvent
89 #define SuspendEvent GraphExecutor::SuspendEvent
90 #define ToResumeEvent GraphExecutor::ToResumeEvent
91 #define ResumeEvent GraphExecutor::ResumeEvent
92 #define KillEvent GraphExecutor::KillEvent
93 #define StopEvent GraphExecutor::StopEvent
94 #define ExecuteEvent GraphExecutor::ExecuteEvent
95 #define SuccessEvent GraphExecutor::SuccessEvent
96 #define ErrorEvent GraphExecutor::ErrorEvent
97 #define ReStartEvent GraphExecutor::ReStartEvent
98 #define ReStartAndSuspendEvent GraphExecutor::ReStartAndSuspendEvent
99 #define NoDataReadyEvent GraphExecutor::NoDataReadyEvent
100 #define SomeDataReadyEvent GraphExecutor::SomeDataReadyEvent
101 #define NotAllDataReadyEvent GraphExecutor::NotAllDataReadyEvent
102 #define AllDataReadyEvent GraphExecutor::AllDataReadyEvent
103 #define ReadyEvent GraphExecutor::ReadyEvent
104 #define SuspendedReadyEvent GraphExecutor::SuspendedReadyEvent
105 #define ResumedReadyEvent GraphExecutor::ResumedReadyEvent
106 #define KilledReadyEvent GraphExecutor::KilledReadyEvent
107 #define StoppedReadyEvent GraphExecutor::StoppedReadyEvent
108 #define ExecutingEvent GraphExecutor::ExecutingEvent
109 #define SuspendedExecutingEvent GraphExecutor::SuspendedExecutingEvent
110 #define ResumedExecutingEvent GraphExecutor::ResumedExecutingEvent
111 #define KilledExecutingEvent GraphExecutor::KilledExecutingEvent
112 #define StoppedExecutingEvent GraphExecutor::StoppedExecutingEvent
113 #define SuccessedExecutingEvent GraphExecutor::SuccessedExecutingEvent
114 #define ErroredExecutingEvent GraphExecutor::ErroredExecutingEvent
115 #define SuspendedSuccessedEvent GraphExecutor::SuspendedSuccessedEvent
116 #define SuspendedErroredEvent GraphExecutor::SuspendedErroredEvent
117 #define ResumedSuccessedEvent GraphExecutor::ResumedSuccessedEvent
118 #define ResumedErroredEvent GraphExecutor::ResumedErroredEvent
119 #define KilledEvent GraphExecutor::KilledEvent
120 #define StoppedEvent GraphExecutor::StoppedEvent
121 #define ToReStartEvent GraphExecutor::ToReStartEvent
122 #define ReStartedEvent GraphExecutor::ReStartedEvent
123 #define ReStartedAndSuspendEvent GraphExecutor::ReStartedAndSuspendEvent
124 #define EndExecuteEvent GraphExecutor::EndExecuteEvent
125 #define NumberOfEvents GraphExecutor::NumberOfEvents
127 GraphExecutor::FiniteStateMachine::FiniteStateMachine() {
128 MESSAGE( "FiniteStateMachine::FiniteStateMachine" ) ;
130 _ControlStateName[ VoidState ] = "VoidState" ;
131 _ControlStateName[ ToSuspendStartState ]= "ToSuspendStartState" ;
132 _ControlStateName[ ToSuspendState ] = "ToSuspendState" ;
133 _ControlStateName[ ToSuspendDoneState ] = "ToSuspendDoneState" ;
134 _ControlStateName[ ToKillState ] = "ToKillState" ;
135 _ControlStateName[ ToKillDoneState ] = "ToKillDoneState" ;
136 _ControlStateName[ ToStopState ] = "ToStopState" ;
138 _StateName[ UnKnownState ] = "UnKnownState" ;
139 _StateName[ DataUndefState ] = "DataUndefState" ;
140 _StateName[ DataWaitingState ] = "DataWaitingState" ;
141 _StateName[ DataReadyState ] = "DataReadyState" ;
142 _StateName[ SuspendedReadyState ] = "SuspendedReadyState" ;
143 _StateName[ SuspendedReadyToResumeState ] = "SuspendedReadyToResumeState" ;
144 _StateName[ ResumedReadyState ] = "ResumedReadyState" ;
145 _StateName[ KilledReadyState ] = "KilledReadyState" ;
146 _StateName[ StoppedReadyState ] = "StoppedReadyState" ;
147 _StateName[ ExecutingState ] = "ExecutingState" ;
148 _StateName[ SuspendedExecutingState ] = "SuspendedExecutingState" ;
149 _StateName[ ResumedExecutingState ] = "ResumedExecutingState" ;
150 _StateName[ KilledExecutingState ] = "KilledExecutingState" ;
151 _StateName[ StoppedExecutingState ] = "StoppedExecutingState" ;
152 _StateName[ SuccessedExecutingState ] = "SuccessedExecutingState" ;
153 _StateName[ ErroredExecutingState ] = "ErroredExecutingState" ;
154 _StateName[ SuspendedSuccessedState ] = "SuspendedSuccessedState" ;
155 _StateName[ SuspendedErroredState ] = "SuspendedErroredState" ;
156 _StateName[ SuspendedSuccessedToReStartState ] = "SuspendedSuccessedToReStartState" ;
157 _StateName[ SuspendedErroredToReStartState ] = "SuspendedErroredToReStartState" ;
158 _StateName[ ResumedSuccessedState ] = "ResumedSuccessedState" ;
159 _StateName[ ResumedErroredState ] = "ResumedErroredState" ;
160 _StateName[ KilledSuccessedState ] = "KilledSuccessedState" ;
161 _StateName[ KilledErroredState ] = "KilledErroredState" ;
162 _StateName[ StoppedSuccessedState ] = "StoppedSuccessedState" ;
163 _StateName[ StoppedErroredState ] = "StoppedErroredState" ;
164 _StateName[ SuccessedState ] = "SuccessedState" ;
165 _StateName[ ErroredState ] = "ErroredState" ;
166 _StateName[ SuspendedState ] = "SuspendedState" ;
167 _StateName[ KilledState ] = "KilledState" ;
168 _StateName[ StoppedState ] = "StoppedState" ;
169 _StateName[ ReStartedState ] = "ReStartedState" ;
170 _StateName[ LoadingState ] = "LoadingState" ;
172 _EventName[ UndefinedEvent ] = "UndefinedEvent" ;
173 _EventName[ NewThreadEvent ] = "NewThreadEvent" ;
174 _EventName[ SuspendEvent ] = "SuspendEvent" ;
175 _EventName[ ToResumeEvent ] = "ToResumeEvent" ;
176 _EventName[ ResumeEvent ] = "ResumeEvent" ;
177 _EventName[ KillEvent ] = "KillEvent" ;
178 _EventName[ StopEvent ] = "StopEvent" ;
179 _EventName[ ExecuteEvent ] = "ExecuteEvent" ;
180 _EventName[ SuccessEvent ] = "SuccessEvent" ;
181 _EventName[ ErrorEvent ] = "ErrorEvent" ;
182 _EventName[ ToReStartEvent ] = "ToReStartEvent" ;
183 _EventName[ ReStartEvent ] = "ReStartEvent" ;
184 _EventName[ ReStartAndSuspendEvent ] = "ReStartAndSuspendEvent" ;
185 _EventName[ NoDataReadyEvent ] = "NoDataReadyEvent" ;
186 _EventName[ SomeDataReadyEvent ] = "SomeDataReadyEvent" ;
187 _EventName[ NotAllDataReadyEvent ] = "NotAllDataReadyEvent" ;
188 _EventName[ AllDataReadyEvent ] = "AllDataReadyEvent" ;
189 _EventName[ ReadyEvent ] = "ReadyEvent" ;
190 _EventName[ SuspendedReadyEvent ] = "SuspendedReadyEvent" ;
191 _EventName[ ResumedReadyEvent ] = "ResumedReadyEvent" ;
192 _EventName[ KilledReadyEvent ] = "KilledReadyEvent" ;
193 _EventName[ StoppedReadyEvent ] = "StoppedReadyEvent" ;
194 _EventName[ ExecutingEvent ] = "ExecutingEvent" ;
195 _EventName[ SuspendedExecutingEvent ] = "SuspendedExecutingEvent" ;
196 _EventName[ ResumedExecutingEvent ] = "ResumedExecutingEvent" ;
197 _EventName[ KilledExecutingEvent ] = "KilledExecutingEvent" ;
198 _EventName[ StoppedExecutingEvent ] = "StoppedExecutingEvent" ;
199 _EventName[ SuccessedExecutingEvent ] = "SuccessedExecutingEvent" ;
200 _EventName[ ErroredExecutingEvent ] = "ErroredExecutingEvent" ;
201 _EventName[ SuspendedSuccessedEvent ] = "SuspendedSuccessedEvent" ;
202 _EventName[ SuspendedErroredEvent ] = "SuspendedErroredEvent" ;
203 _EventName[ ResumedSuccessedEvent ] = "ResumedSuccessedEvent" ;
204 _EventName[ ResumedErroredEvent ] = "ResumedErroredEvent" ;
205 _EventName[ KilledEvent ] = "KilledEvent" ;
206 _EventName[ StoppedEvent ] = "StoppedEvent" ;
207 _EventName[ ReStartedEvent ] = "ReStartedEvent" ;
208 _EventName[ ReStartedAndSuspendEvent ]= "ReStartedAndSuspendEvent" ;
209 _EventName[ EndExecuteEvent ] = "EndExecuteEvent" ;
211 _ActionName[ ErrorAction ] = "ErrorAction" ;
212 _ActionName[ VoidAction ] = "VoidAction" ;
213 _ActionName[ executeAction ] = "executeAction" ;
214 _ActionName[ ExecuteAction ] = "ExecuteAction" ;
215 _ActionName[ DataWaiting_SomeDataReadyAction ] = "DataWaiting_SomeDataReadyAction" ;
216 _ActionName[ DataUndef_NotAllDataReadyAction ] = "DataUndef_NotAllDataReadyAction";
217 _ActionName[ DataUndef_AllDataReadyAction ] = "DataUndef_AllDataReadyAction" ;
219 _ActionName[ DataReady_SuspendAction ] = "DataReady_SuspendAction" ;
220 _ActionName[ SuspendedReady_ResumeAction ] = "SuspendedReady_ResumeAction" ;
221 _ActionName[ DataReady_KillAction ] = "DataReady_KillAction" ;
222 _ActionName[ DataReady_StopAction ] = "DataReady_StopAction" ;
224 _ActionName[ DataReady_ExecuteAction ] = "DataReady_ExecuteAction" ;
226 _ActionName[ Executing_SuspendAction ] = "Executing_SuspendAction" ;
227 _ActionName[ SuspendedExecuting_ResumeAction ] = "SuspendedExecuting_ResumeAction" ;
228 _ActionName[ Executing_KillAction ] = "Executing_KillAction" ;
229 _ActionName[ Executing_StopAction ] = "Executing_StopAction" ;
231 _ActionName[ Executing_SuccessAction ] = "Executing_SuccessAction" ;
232 // _ActionName[ Executing_ErrorAction ] = "Executing_ErrorAction" ;
233 _ActionName[ Errored_ExecutingAction ] = "Errored_ExecutingAction" ;
234 _ActionName[ Successed_SuccessAction ] = "Successed_SuccessAction" ;
235 _ActionName[ Errored_ErrorAction ] = "Errored_ErrorAction" ;
237 _ActionName[ Successed_SuspendAction ] = "Successed_SuspendAction" ;
238 _ActionName[ Errored_SuspendAction ] = "Errored_SuspendAction" ;
239 _ActionName[ SuspendedSuccessed_ResumeAction ] = "SuspendedSuccessed_ResumeAction" ;
240 _ActionName[ SuspendedErrored_ResumeAction ] = "SuspendedErrored_ResumeAction" ;
241 _ActionName[ Successed_KillAction ] = "Successed_KillAction" ;
242 _ActionName[ Errored_KillAction ] = "Errored_KillAction" ;
243 _ActionName[ Successed_StopAction ] = "Successed_StopAction" ;
244 _ActionName[ Errored_StopAction ] = "Errored_StopAction" ;
246 _ActionName[ SuspendedSuccessed_ReStartAction ] = "SuspendedSuccessed_ReStartAction" ;
247 _ActionName[ SuspendedErrored_ReStartAction ] = "SuspendedErrored_ReStartAction" ;
248 _ActionName[ SuspendedSuccessed_ReStartAndSuspendAction ] = "SuspendedSuccessed_ReStartAndSuspendAction" ;
249 _ActionName[ SuspendedErrored_ReStartAndSuspendAction ] = "SuspendedErrored_ReStartAndSuspendAction" ;
251 _GraphStateName[ SUPERV::UndefinedState ] = "UndefinedState" ;
252 _GraphStateName[ SUPERV::NoState ] = "NoState" ;
253 _GraphStateName[ SUPERV::EditingState ] = "EditingState" ;
254 _GraphStateName[ SUPERV::SuspendState ] = "SuspendState" ;
255 _GraphStateName[ SUPERV::WaitingState ] = "WaitingState" ;
256 _GraphStateName[ SUPERV::ReadyState ] = "ReadyState" ;
257 _GraphStateName[ SUPERV::SuspendReadyState ] = "SuspendReadyState" ;
258 _GraphStateName[ SUPERV::RunningState ] = "RunningState" ;
259 _GraphStateName[ SUPERV::DoneState ] = "DoneState" ;
260 _GraphStateName[ SUPERV::ErrorState ] = "ErrorState" ;
261 _GraphStateName[ SUPERV::SuspendDoneState ] = "SuspendDoneState" ;
262 _GraphStateName[ SUPERV::SuspendErroredState ] = "SuspendErroredState" ;
263 _GraphStateName[ SUPERV::KillState ] = "KillState" ;
264 _GraphStateName[ SUPERV::StopState ] = "StopState" ;
267 // NewStates = _TransitionTable[ States ] [ Events ]
268 // associated action = _ActionTable[ NewStates ] [ Events ]
269 for ( i = 0 ; i < NumberOfAutomatonStates ; i++ ) {
270 for ( j = 0 ; j < NumberOfEvents ; j++ ) {
271 // id est = SameState and VoidAction
272 _TransitionTable[ i ][ j ] = (GraphExecutor::AutomatonState ) i ;
273 _ActionTable[ i ][ j ] = GraphExecutor::ErrorAction ;
276 // OneEvent ===> Change of State and associated Action :
277 // _TransitionTable[ OldState ][ OneEvent ] gives a NewState
278 // _Action[ NewState ][ OneEvent ] gives what to do
281 // NoDataReadyEvent :
282 _TransitionTable[ DataUndefState ][ NoDataReadyEvent ] = DataWaitingState ;
283 _ActionTable[ DataWaitingState ][ NoDataReadyEvent ] = VoidAction ;
284 // SomeDataReadyEvent :
285 _TransitionTable[ DataWaitingState ][ SomeDataReadyEvent ] = DataUndefState ;
286 _ActionTable[ DataUndefState ][ SomeDataReadyEvent ] = DataWaiting_SomeDataReadyAction;
287 _TransitionTable[ DataReadyState ][ SomeDataReadyEvent ] = DataUndefState ;
288 _ActionTable[ DataUndefState ][ SomeDataReadyEvent ] = DataWaiting_SomeDataReadyAction;
289 // NotAllDataReadyEvent :
290 _TransitionTable[ DataUndefState ][ NotAllDataReadyEvent ] = DataWaitingState ;
291 _ActionTable[ DataWaitingState ][ NotAllDataReadyEvent ] = DataUndef_NotAllDataReadyAction;
293 _TransitionTable[ DataUndefState ][ AllDataReadyEvent ] = DataReadyState ;
294 _ActionTable[ DataReadyState ][ AllDataReadyEvent ] = DataUndef_AllDataReadyAction ;
296 // DATAS-READY-CONTROL :
298 _TransitionTable[ DataReadyState ][ SuspendEvent ] = SuspendedReadyState ;
299 _ActionTable[ SuspendedReadyState ][ SuspendEvent ] = DataReady_SuspendAction;
301 _TransitionTable[ SuspendedReadyState ][ ToResumeEvent ] = SuspendedReadyToResumeState ;
302 _ActionTable[ SuspendedReadyToResumeState ][ ToResumeEvent ] = VoidAction ;
304 _TransitionTable[ SuspendedReadyToResumeState ][ ResumeEvent ] = ResumedReadyState ;
305 _ActionTable[ ResumedReadyState ][ ResumeEvent] = SuspendedReady_ResumeAction ;
307 _TransitionTable[ SuspendedReadyState ][ KillEvent ] = KilledReadyState ;
309 _TransitionTable[ SuspendedReadyState ][ StopEvent ] = StoppedReadyState ;
311 _TransitionTable[ DataReadyState ][ KillEvent ] = KilledReadyState ;
312 _ActionTable[ KilledReadyState ][ KillEvent] = DataReady_KillAction ;
314 _TransitionTable[ DataReadyState ][ StopEvent ] = StoppedReadyState ;
315 _ActionTable[ StoppedReadyState ][ StopEvent] = DataReady_StopAction ;
319 _TransitionTable[ SuspendedReadyToResumeState ][ ExecuteEvent ] = ExecutingState ;
321 _TransitionTable[ ResumedReadyState ][ ExecuteEvent ] = ExecutingState ;
323 _TransitionTable[ DataReadyState ][ ExecuteEvent ] = ExecutingState ;
325 _TransitionTable[ ReStartedState ][ ExecuteEvent ] = ExecutingState ;
326 _ActionTable[ ExecutingState ][ ExecuteEvent ] = DataReady_ExecuteAction;
330 _TransitionTable[ ExecutingState ][ SuspendEvent ] = SuspendedExecutingState ;
331 _ActionTable[ SuspendedExecutingState ][ SuspendEvent ] = Executing_SuspendAction;
333 _TransitionTable[ SuspendedExecutingState ][ ResumeEvent ] = ResumedExecutingState ;
334 _ActionTable[ ResumedExecutingState ][ ResumeEvent] = SuspendedExecuting_ResumeAction;
336 _TransitionTable[ ResumedExecutingState ][ ExecuteEvent ] = ExecutingState ;
338 _TransitionTable[ SuspendedExecutingState ][ KillEvent ] = KilledExecutingState ;
340 _TransitionTable[ SuspendedExecutingState ][ StopEvent ] = StoppedExecutingState ;
342 _TransitionTable[ ExecutingState ][ KillEvent ] = KilledExecutingState ;
343 _ActionTable[ KilledExecutingState ][ KillEvent] = Executing_KillAction;
344 _TransitionTable[ KilledExecutingState ][ KillEvent ] = KilledState ;
345 _ActionTable[ KilledState ][ KillEvent] = VoidAction;
347 _TransitionTable[ ExecutingState ][ StopEvent ] = StoppedExecutingState ;
348 _ActionTable[ StoppedExecutingState ][ StopEvent] = Executing_StopAction;
349 _TransitionTable[ StoppedExecutingState ][ StopEvent ] = StoppedState ;
350 _ActionTable[ StoppedState ][ StopEvent] = VoidAction;
354 _TransitionTable[ ExecutingState ][ SuccessEvent ] = SuccessedExecutingState ;
355 _ActionTable[ SuccessedExecutingState ][ SuccessEvent ] = Executing_SuccessAction;
356 // SuspendedExecutingState : NO ResumeEvent 13-03-2003
357 _TransitionTable[ SuspendedExecutingState ][ SuccessEvent ] = SuccessedExecutingState ;
358 _ActionTable[ SuccessedExecutingState ][ SuccessEvent ] = Executing_SuccessAction;
359 //JR 24.03.2005 : Debug for PAL8176 : abort of GOTONode
361 _TransitionTable[ SuccessedState ][ ErrorEvent ] = ErroredExecutingState ;
362 // _ActionTable[ ErroredExecutingState ][ ErrorEvent ] = Executing_ErrorAction;
363 _ActionTable[ ErroredExecutingState ][ ErrorEvent ] = Errored_ExecutingAction;
365 _TransitionTable[ ExecutingState ][ ErrorEvent ] = ErroredExecutingState ;
366 // _ActionTable[ ErroredExecutingState ][ ErrorEvent ] = Executing_ErrorAction;
367 _ActionTable[ ErroredExecutingState ][ ErrorEvent ] = Errored_ExecutingAction;
368 // SuspendedExecutingState : NO ResumeEvent 13-03-2003
369 _TransitionTable[ SuspendedExecutingState ][ ErrorEvent ] = ErroredExecutingState ;
370 // _ActionTable[ ErroredExecutingState ][ ErrorEvent ] = Executing_ErrorAction;
371 _ActionTable[ ErroredExecutingState ][ ErrorEvent ] = Errored_ExecutingAction;
374 // SuccessedExecutingState - SuccessEvent
375 _TransitionTable[ SuccessedExecutingState ][ SuccessEvent ] = SuccessedState ;
376 _ActionTable[ SuccessedState ][ SuccessEvent ] = Successed_SuccessAction ;
377 // ErroredExecutingState - ErrorEvent
378 _TransitionTable[ ErroredExecutingState ][ ErrorEvent ] = ErroredState ;
379 _ActionTable[ ErroredState ][ ErrorEvent ] = Errored_ErrorAction ;
381 // SuccessedState - SuspendEvent
382 _TransitionTable[ SuccessedExecutingState ][ SuspendEvent ] = SuspendedSuccessedState ;
383 _ActionTable[ SuspendedSuccessedState ][ SuspendEvent ] = Successed_SuspendAction;
384 // ErroredState - SuspendEvent
385 _TransitionTable[ ErroredExecutingState ][ SuspendEvent ] = SuspendedErroredState ;
386 _ActionTable[ SuspendedErroredState ][ SuspendEvent ] = Errored_SuspendAction;
388 // SuccessedState - KillEvent
389 _TransitionTable[ SuccessedExecutingState ][ KillEvent ] = KilledSuccessedState ;
390 _ActionTable[ KilledSuccessedState ][ KillEvent ] = Successed_KillAction;
391 // ErroredState - KillEvent
392 _TransitionTable[ ErroredExecutingState ][ KillEvent ] = KilledErroredState ;
393 _ActionTable[ KilledErroredState ][ KillEvent ] = Errored_KillAction;
395 // SuccessedState - StopEvent
396 _TransitionTable[ SuccessedExecutingState ][ StopEvent ] = StoppedSuccessedState ;
397 _ActionTable[ StoppedSuccessedState ][ StopEvent ] = Successed_StopAction;
398 // ErroredState - StopEvent
399 _TransitionTable[ ErroredExecutingState ][ StopEvent ] = StoppedErroredState ;
400 _ActionTable[ StoppedErroredState ][ StopEvent ] = Errored_StopAction;
402 // SuspendedSuccessedState - ResumeEvent
403 _TransitionTable[ SuspendedSuccessedState ][ ResumeEvent ] = ResumedSuccessedState ;
404 _ActionTable[ ResumedSuccessedState ][ ResumeEvent ] = SuspendedSuccessed_ResumeAction;
406 _TransitionTable[ ResumedSuccessedState ][ ResumedSuccessedEvent ] = SuccessedState ;
407 _ActionTable[ SuccessedState ][ ResumedSuccessedEvent] = Successed_SuccessAction;
409 // SuspendedErroredState - ResumeEvent
410 _TransitionTable[ SuspendedErroredState ][ ResumeEvent ] = ResumedErroredState ;
411 _ActionTable[ ResumedErroredState ][ ResumeEvent ] = SuspendedErrored_ResumeAction;
412 _TransitionTable[ ResumedErroredState ][ ResumedErroredEvent ] = ErroredState ;
413 _ActionTable[ ErroredState ][ ResumedErroredEvent ] = Errored_ErrorAction;
415 // SuccessedState - KillEvent
416 _TransitionTable[ SuccessedState ][ KillEvent ] = KilledSuccessedState ;
417 _ActionTable[ KilledSuccessedState ][ KillEvent] = Successed_KillAction;
418 _TransitionTable[ KilledSuccessedState ][ KillEvent ] = KilledState ;
419 _ActionTable[ KilledState ][ KillEvent ] = VoidAction;
420 // ErroredState - KillEvent
421 _TransitionTable[ ErroredState ][ KillEvent ] = KilledErroredState ;
422 _ActionTable[ KilledErroredState ][ KillEvent] = Errored_KillAction;
423 _TransitionTable[ KilledErroredState ][ KillEvent ] = KilledState ;
424 _ActionTable[ KilledState ][ KillEvent ] = VoidAction;
426 // SuccessedState - StopEvent
427 _TransitionTable[ SuccessedState ][ StopEvent ] = StoppedSuccessedState ;
428 _ActionTable[ StoppedSuccessedState ][ StopEvent] = Successed_StopAction;
429 _TransitionTable[ StoppedSuccessedState ][ StopEvent ] = StoppedState ;
430 _ActionTable[ StoppedState ][ StopEvent ] = VoidAction;
431 // ErroredState - StopEvent
432 _TransitionTable[ ErroredState ][ StopEvent ] = StoppedErroredState ;
433 _ActionTable[ StoppedErroredState ][ StopEvent] = Errored_StopAction;
434 _TransitionTable[ StoppedErroredState ][ StopEvent ] = StoppedState ;
435 _ActionTable[ StoppedState ][ StopEvent ] = VoidAction;
438 _TransitionTable[ SuspendedSuccessedState ][ ToReStartEvent ] = SuspendedSuccessedToReStartState ;
439 _ActionTable[ SuspendedSuccessedToReStartState ][ ToReStartEvent] = VoidAction ;
441 _TransitionTable[ SuspendedSuccessedToReStartState ][ ReStartEvent ] = ReStartedState ;
442 _TransitionTable[ SuspendedSuccessedToReStartState ][ ReStartAndSuspendEvent ] = ReStartedState ;
444 _TransitionTable[ SuspendedErroredState ][ ToReStartEvent ] = SuspendedErroredToReStartState ;
445 _ActionTable[ SuspendedErroredToReStartState ][ ToReStartEvent] = VoidAction ;
447 _TransitionTable[ SuspendedErroredToReStartState ][ ReStartEvent ] = ReStartedState ;
448 _TransitionTable[ SuspendedErroredToReStartState ][ ReStartAndSuspendEvent ] = ReStartedState ;
450 _ActionTable[ ReStartedState ][ ReStartEvent] = SuspendedSuccessed_ReStartAction;
451 _ActionTable[ ReStartedState ][ ReStartAndSuspendEvent] = SuspendedSuccessed_ReStartAndSuspendAction;
453 pthread_mutex_init( &_MutexJoinWait , NULL ) ;
454 if ( pthread_cond_init( &_JoinWait , NULL ) ) {
455 perror("pthread_cond_init( &_JoinWait , NULL )") ;
459 if ( pthread_create( &_JoinThreadNo , NULL , start_function , this ) ) {
460 char * msg = "Cannot pthread_create " ;
464 pthread_mutex_init( &_MutexPythonWait , NULL ) ;
465 _MutexPythonLocked = false ;
467 _GraphExecutingNumber = 0 ;
468 _PyInitModule = false ;
470 MESSAGE( "FiniteStateMachine::FiniteStateMachine _TransitionTable " ) ;
473 void * start_function( void *p ) {
474 GraphExecutor::FiniteStateMachine *anAutomaton = (GraphExecutor::FiniteStateMachine *) p;
475 if ( pthread_setcanceltype( PTHREAD_CANCEL_ASYNCHRONOUS , NULL ) ) {
476 perror("pthread_setcanceltype ") ;
479 if ( pthread_setcancelstate( PTHREAD_CANCEL_ENABLE , NULL ) ) {
480 perror("pthread_setcancelstate ") ;
483 anAutomaton->JoinThread() ;
484 pthread_exit( PTHREAD_CANCELED ) ;
487 int GraphExecutor::FiniteStateMachine::ExecNumber() {
490 int RetVal = _ExecNumber ;
491 _GraphExecutingNumber += 1 ;
496 void GraphExecutor::FiniteStateMachine::Executed() {
498 _GraphExecutingNumber -= 1 ;
499 if ( _GraphExecutingNumber == 0 ) {
500 map< string , PyObject * >::iterator aPyFunction ;
501 for ( aPyFunction = _MapOfPyFunctions.begin() ; aPyFunction != _MapOfPyFunctions.end() ; aPyFunction++ ) {
502 if ( !strcmp( aPyFunction->first.c_str() , "PyObjRef" ) ||
503 !strcmp( aPyFunction->first.c_str() , "PyObjIor" ) ) {
504 MESSAGE( "GraphExecutor::FiniteStateMachine::Executed " << aPyFunction->first << " keeped ..."
508 MESSAGE( "GraphExecutor::FiniteStateMachine::Executed " << aPyFunction->first << " erased ..."
510 _MapOfPyFunctions.erase( aPyFunction->first ) ;
515 MESSAGE( "GraphExecutor::FiniteStateMachine::Executed _GraphExecutingNumber "
516 << _GraphExecutingNumber << " != 0 ==> no erase" ) ;
522 void GraphExecutor::FiniteStateMachine::PyInitModule( bool aPyInitModule ) {
523 _PyInitModule = aPyInitModule ;
526 bool GraphExecutor::FiniteStateMachine::PyInitModule() {
527 bool InitedModule = _PyInitModule ;
528 _PyInitModule = true ;
529 return InitedModule ;
532 void GraphExecutor::FiniteStateMachine::PyLock() {
533 // cout << pthread_self() << " GraphExecutor::FiniteStateMachine::PyLock " << &_MutexPythonWait << endl ;
534 if ( pthread_mutex_lock( &_MutexPythonWait ) ) {
535 perror( "GraphExecutor::FiniteStateMachine::PyLock" ) ;
538 _MutexPythonLocked = true ;
539 // cout << pthread_self() << " GraphExecutor::FiniteStateMachine::PyLocked " << &_MutexPythonWait << endl ;
542 void GraphExecutor::FiniteStateMachine::PyUnLock() {
543 // cout << pthread_self() << " GraphExecutor::FiniteStateMachine::PyUnLock " << &_MutexPythonWait << endl ;
544 if ( pthread_mutex_unlock( &_MutexPythonWait ) ) {
545 perror( "GraphExecutor::FiniteStateMachine::PyUnLock" ) ;
548 _MutexPythonLocked = false ;
549 // cout << pthread_self() << " GraphExecutor::FiniteStateMachine::PyUnLocked " << &_MutexPythonWait << endl ;
552 void GraphExecutor::FiniteStateMachine::PyLockReset() {
553 if ( _MutexPythonLocked ) {
558 #define PyFunctionTrace 0
559 PyObject * GraphExecutor::FiniteStateMachine::PyFunction( const char * aPyFuncName ) {
561 PyObject * RetVal = NULL ;
562 bool PyObjRefIor = !strcmp( aPyFuncName , "PyObjRef" ) || !strcmp( aPyFuncName , "PyObjIor" ) ;
563 PyObject * PyFunctionMapped = _MapOfPyFunctions[ aPyFuncName ] ;
564 if ( _GraphExecutingNumber > 1 && !PyObjRefIor ) {
565 RetVal = PyFunctionMapped ;
567 MESSAGE( "GraphExecutor::FiniteStateMachine::PyFunction( '" << aPyFuncName << "' ) --> " ) ;
569 MESSAGE( RetVal << " ob_refcnt " << RetVal->ob_refcnt ) ;
577 RetVal = PyFunctionMapped ;
579 MESSAGE( "GraphExecutor::FiniteStateMachine::PyFunction( '" << aPyFuncName << "' ) --> " ) ;
580 if ( RetVal && PyObjRefIor ) {
581 MESSAGE( RetVal << " " << RetVal->ob_refcnt ) ;
584 MESSAGE( RetVal << " " << RetVal->ob_refcnt ) ;
595 bool GraphExecutor::FiniteStateMachine::PyFunction( const char * aPyFuncName , PyObject * aPyFunction ) {
597 bool RetVal = false ;
598 if ( _MapOfPyFunctions[ aPyFuncName ] != NULL ) {
600 PyObject * aPyFunc = _MapOfPyFunctions[ aPyFuncName ] ;
601 MESSAGE( "GraphExecutor::FiniteStateMachine::PyFunction( '" << aPyFuncName << "' , aPyFunction "
602 << aPyFunction << " ) ob_refcnt " << aPyFunction->ob_refcnt << " already mapped : "
603 << aPyFunc << " ob_refcnt " << aPyFunc->ob_refcnt ) ;
607 _MapOfPyFunctions[ aPyFuncName ] = aPyFunction ;
609 MESSAGE( "GraphExecutor::FiniteStateMachine::PyFunction( '" << aPyFuncName << "' ) " << aPyFunction
610 << " ) ob_refcnt " << aPyFunction->ob_refcnt << " mapped" ) ;
618 bool GraphExecutor::FiniteStateMachine::ErasePyFunction( const char * aPyFuncName ) {
621 MESSAGE( "GraphExecutor::FiniteStateMachine::ErasePyFunction( '" << aPyFuncName << "' )" ) ;
623 if ( _MapOfPyFunctions[ aPyFuncName ] != NULL ) {
624 _MapOfPyFunctions.erase( aPyFuncName ) ;
631 GraphBase::Graph * GraphExecutor::FiniteStateMachine::MapGraph( const char * aGraphName ) {
632 GraphBase::Graph * aGraph = _MapOfGraphs[ aGraphName ] ;
633 //cout << "MapGraph " << aGraphName << " --> " << aGraph << endl ;
637 bool GraphExecutor::FiniteStateMachine::MapGraph( GraphBase::Graph * aGraph , const char * aGraphName ) {
638 if ( MapGraph( aGraphName ) ) {
641 _MapOfGraphs[ aGraphName ] = aGraph ;
645 void GraphExecutor::FiniteStateMachine::EraseGraph( const char * aGraphName ) {
646 _MapOfGraphs.erase( aGraphName ) ;
649 bool GraphExecutor::FiniteStateMachine::GraphName( const char * aGraphName ) {
650 return _MapOfGraphNames[ aGraphName ] ;
653 string GraphExecutor::FiniteStateMachine::GraphInstanceName( const char * aGraphName ) {
654 int GraphInstanceNumber = _MapOfGraphNames[ aGraphName ] ;
655 if ( GraphInstanceNumber ) {
656 _MapOfGraphNames[ aGraphName ] = GraphInstanceNumber + 1 ;
659 GraphInstanceNumber = 0 ;
660 _MapOfGraphNames[ aGraphName ] = GraphInstanceNumber + 1 ;
662 string theGraphInstanceName = string( aGraphName ) ;
663 if ( GraphInstanceNumber ) {
664 theGraphInstanceName += "_" ;
666 // astr << GraphInstanceNumber << ends ;
667 astr << GraphInstanceNumber ;
668 theGraphInstanceName += astr.str() ;
670 //cout << "GraphExecutor::FiniteStateMachine::GraphInstanceName( " << aGraphName << " ) --> "
671 // << theGraphInstanceName << endl ;
672 return theGraphInstanceName ;
676 void GraphExecutor::FiniteStateMachine::JoinThread() {
677 if ( pthread_mutex_lock( &_MutexJoinWait ) ) {
678 perror("FiniteStateMachine:JoinThread pthread_mutex_lock ") ;
681 while ( _JoinThread ) {
682 while ( _ThreadList.size() == 0) {
683 // MESSAGE( pthread_self() << " FiniteStateMachine:Join pthread_cond_wait" );
684 if ( pthread_cond_wait( &_JoinWait , &_MutexJoinWait ) ) {
685 perror("FiniteStateMachine:JoinThread pthread_cond_wait ") ;
688 pthread_t _Thread = _ThreadList.front() ;
689 // MESSAGE( pthread_self() << " FiniteStateMachine:JoinThread pthread_cond_waited : " << _Thread )
690 // MESSAGE( pthread_self() << " FiniteStateMachine:JoinThread pthread_join : " << _Thread );
691 int joinsts = pthread_join( _Thread , NULL ) ;
693 perror("FiniteStateMachine:JoinThread pthread_join ") ;
694 MESSAGE( pthread_self() << " FiniteStateMachine:JoinThread pthread_join : " << _Thread
699 // MESSAGE( pthread_self() << " FiniteStateMachine:JoinThread pthread_joined : " << _Thread );
700 _ThreadList.pop_front() ;
703 if ( pthread_mutex_unlock( &_MutexJoinWait ) ) {
704 perror("FiniteStateMachine:JoinThread pthread_mutex_unlock ") ;
709 void GraphExecutor::FiniteStateMachine::JoinThread( pthread_t aThread ) {
710 if ( pthread_mutex_lock( &_MutexJoinWait ) ) {
711 perror("Join pthread_mutex_lock ") ;
714 // MESSAGE(pthread_self() << " JoinThread pthread_cond_signal for " << aThread)
715 _ThreadList.push_back( aThread ) ;
716 if ( pthread_cond_signal( &_JoinWait ) ) {
717 perror("Join pthread_cond_signal ") ;
719 // MESSAGE( pthread_self() << " JoinThread pthread_cond_signaled for " << aThread)
721 if ( pthread_mutex_unlock( &_MutexJoinWait ) ) {
722 perror("Join pthread_mutex_unlock ") ;
727 ostream & operator<< (ostream &f ,const GraphExecutor::AutomatonState & aState ) {
729 case GraphExecutor::UnKnownState :
732 case GraphExecutor::DataUndefState :
733 f << "DataUndefState";
735 case GraphExecutor::DataWaitingState :
736 f << "DataWaitingState";
738 case GraphExecutor::DataReadyState :
739 f << "DataReadyState";
741 case GraphExecutor::SuspendedReadyState :
742 f << "SuspendedReadyState";
744 case GraphExecutor::SuspendedReadyToResumeState :
745 f << "SuspendedReadyToResumeState";
747 case GraphExecutor::ResumedReadyState :
748 f << "ResumedReadyState";
750 case GraphExecutor::KilledReadyState :
751 f << "KilledReadyState";
753 case GraphExecutor::StoppedReadyState :
754 f << "StoppedReadyState";
756 case GraphExecutor::ExecutingState :
757 f << "ExecutingState";
759 case GraphExecutor::SuspendedExecutingState :
760 f << "SuspendedExecutingState";
762 case GraphExecutor::ResumedExecutingState :
763 f << "ResumedExecutingState";
765 case GraphExecutor::KilledExecutingState :
766 f << "KilledExecutingState";
768 case GraphExecutor::StoppedExecutingState :
769 f << "StoppedExecutingState";
771 case GraphExecutor::SuccessedExecutingState :
772 f << "SuccessedExecutingState";
774 case GraphExecutor::ErroredExecutingState :
775 f << "ErroredExecutingState";
777 case GraphExecutor::SuspendedSuccessedState :
778 f << "SuspendedSuccessedState";
780 case GraphExecutor::SuspendedErroredState :
781 f << "SuspendedErroredState";
783 case GraphExecutor::ResumedSuccessedState :
784 f << "ResumedSuccessedState";
786 case GraphExecutor::ResumedErroredState :
787 f << "ResumedErroredState";
789 case GraphExecutor::KilledSuccessedState :
790 f << "KilledSuccessedState";
792 case GraphExecutor::KilledErroredState :
793 f << "KilledErroredState";
795 case GraphExecutor::StoppedSuccessedState :
796 f << "StoppedSuccessedState";
798 case GraphExecutor::StoppedErroredState :
799 f << "StoppedErroredState";
801 case GraphExecutor::SuccessedState :
802 f << "SuccessedState";
804 case GraphExecutor::ErroredState :
807 case GraphExecutor::SuspendedState :
808 f << "SuspendedState";
810 case GraphExecutor::KilledState :
813 case GraphExecutor::StoppedState :
816 case GraphExecutor::SuspendedSuccessedToReStartState :
817 f << "SuspendedSuccessedToReStartState";
819 case GraphExecutor::SuspendedErroredToReStartState :
820 f << "SuspendedErroredToReStartState";
822 case GraphExecutor::ReStartedState :
823 f << "ReStartedState";
825 case GraphExecutor::LoadingState :
829 f << "GraphExecutor::AutomatonState_?";