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_OutNode.hxx
25 // Author : Jean Rahuel, CEA
29 #ifndef _DATAFLOWEXECUTOR_OUTNODE_HXX
30 #define _DATAFLOWEXECUTOR_OUTNODE_HXX
32 #include "SALOME_Component_i.hxx"
34 #include "DataFlowExecutor_InNode.hxx"
36 #include "DataFlowBase_StreamGraph.hxx"
38 namespace GraphExecutor {
40 // class OutNode : public GraphBase::Graph {
41 class OutNode : public GraphBase::Base {
45 GraphBase::StreamGraph * _StreamGraph ;
46 GraphBase::Graph * _Graph ;
48 int _Graph_prof_debug ;
53 GraphExecutor::AutomatonState _State ;
54 SUPERV::ControlState _ControlState ;
57 Engines_Container_i * _SuperVisionContainer ;
58 pthread_t _MainThreadId ;
59 pthread_mutex_t _PyMutexWait ;
60 pthread_mutex_t _MutexWait ;
61 pthread_cond_t _EventWait ;
62 pthread_cond_t _JoinWait ;
64 int _Threads ; // Number of threads
65 int _SuspendedThreads ;
66 list< char * > _EventNodes ;
67 list< GraphExecutor::NodeEvent > _Events ;
68 list< GraphExecutor::AutomatonState > _States ;
74 bool LoadNodes( const GraphBase::ListOfSNodes &aNodes ) ;
75 bool LoadLinks( const GraphBase::ListOfSLinks &aLinks ) ;
76 bool LoadDatas( const GraphBase::ListOfSLinks &aDatas ) ;
80 // scan (reverse) the _EventNodes queue and leave only 1 (the last one that came)
81 // event for every node
87 OutNode( CORBA::ORB_ptr ORB, SALOME_NamingService* ptrNamingService ,
88 const char *DataFlowName ,
89 const char * DebugFileName ,
90 const SUPERV::KindOfNode aKindOfNode );
91 OutNode( CORBA::ORB_ptr ORB, SALOME_NamingService* ptrNamingService ,
92 const SALOME_ModuleCatalog::Service& DataFlowService ,
93 const char *DataFlowComponentName ,
94 const char *DataFlowInterfaceName ,
95 const char *DataFlowName ,
96 const SUPERV::KindOfNode DataFlowkind ,
97 const SUPERV::SDate DataFlowFirstCreation ,
98 const SUPERV::SDate DataFlowLastModification ,
99 const char * DataFlowEditorRelease ,
100 const char * DataFlowAuthor ,
101 const char * DataFlowComputer ,
102 const char * DataFlowComment ,
103 const char * DebugFileName ) ;
106 void Set_prof_debug( CORBA::ORB_ptr ORB , const char * DebugFileName ) ;
107 GraphBase::StreamGraph * StreamGraph() {
108 return _StreamGraph ; } ;
109 GraphBase::StreamGraph * StreamGraph() const {
110 return _StreamGraph ; } ;
111 GraphBase::Graph * Graph() {
113 GraphBase::Graph * Graph() const {
116 bool LoadDataFlow( const GraphBase::SGraph * aDataFlow ) ;
117 // bool LoadXml( const char* myFileName ) ;
118 bool LoadInfo( const GraphBase::SNode &aDataFlowInfo ) ;
120 GraphExecutor::InNode * AddNode(
121 const SALOME_ModuleCatalog::Service& NodeService ,
122 GraphBase::ListOfFuncName aFuncName ,
123 GraphBase::ListOfPythonFunctions aPythonFunction ,
124 const char * NodeComponentName ,
125 const char * NodeInterfaceName ,
126 const char * NodeName ,
127 const SUPERV::KindOfNode NodeKindOfNode = SUPERV::ComputingNode ,
128 const SUPERV::SDate NodeFirstCreation = SUPERV::SDate() ,
129 const SUPERV::SDate NodeLastModification = SUPERV::SDate() ,
130 const char * NodeEditorRelease = NULLSTRING ,
131 const char * NodeAuthor = NULLSTRING ,
132 const char * NodeComputer = NULLSTRING ,
133 const char * NodeComment = NULLSTRING ,
134 const int NodeX = 0 ,
135 const int NodeY = 0 ) ;
137 bool IsValid() { if ( !_Valid )
140 bool IsExecutable() { if ( !_Executable )
141 return Executable() ;
142 return _Executable ; } ;
144 bool Run( const bool AndSuspend ) ;
145 bool Run( const char * aNodeName , const char * AtNodeName ,
146 const bool AndSuspend ) ;
148 void PyInitialized( bool init ) {
149 _PyInitialized = init ; } ;
150 bool PyInitialized() {
151 return _PyInitialized ; } ;
153 void CheckAllDone() ;
155 Engines_Container_i * SuperVisionContainer() ;
156 const pthread_t MainThreadId() const ;
157 void PThreadLock( pthread_mutex_t * aMutex , char * errmsg ) ;
158 void PThreadUnLock( pthread_mutex_t * aMutex , char * errmsg ) ;
159 void PyThreadLock() ;
160 void PyThreadUnLock() ;
163 void ExitThread( pthread_t ThreadNumber = 0 ) ;
164 void SuspendThread() ;
165 void ResumeThread() ;
166 long Threads() { return _Threads ; } ;
167 long SuspendedThreads() { return _SuspendedThreads ; } ;
170 pthread_t ThreadNo() {
171 return _Graph->ThreadNo() ; } ;
172 long Thread( const char * NodeName ) ;
174 bool PushEvent( GraphExecutor::InNode * aNode ,
175 GraphExecutor::NodeEvent anEvent ,
176 GraphExecutor::AutomatonState aState ) ;
178 bool StateWait( SUPERV::GraphState aState ) ;
179 bool Event( char ** aNodeName ,
180 SUPERV::GraphEvent & anEvent ,
181 SUPERV::GraphState & aState ,
183 bool EventW( char ** aNodeName ,
184 SUPERV::GraphEvent & anEvent ,
185 SUPERV::GraphState & aState ) ;
186 bool EventWait( char ** aNodeName ,
187 SUPERV::GraphEvent & anEvent ,
188 SUPERV::GraphState & aState ) ;
192 void SendSomeDataReady( const char * aNodeName ) ;
194 void State(GraphExecutor::AutomatonState aState ) ;
195 const char * StateName(GraphExecutor::AutomatonState aState ) {
196 return theAutomaton->StateName( aState ) ; }
198 SUPERV::GraphState State() ;
199 SUPERV::GraphState State( const char * NodeName ) ;
200 SUPERV::GraphState State( const char * NodeName ,
201 const char * ServiceParameterName ) ;
203 SUPERV::GraphEvent AutomatonGraphEvent(GraphExecutor::NodeEvent anEvent) ;
204 SUPERV::GraphState AutomatonGraphState(GraphExecutor::AutomatonState anAutomatonState) ;
206 GraphExecutor::AutomatonState AutomatonState() ;
207 GraphExecutor::AutomatonState AutomatonState( const char * NodeName ) ;
209 SUPERV::ControlState ControlState() ;
210 SUPERV::ControlState ControlState( const char * aNodeName ) ;
211 void ControlClear() ;
212 void ControlClear( const char * aNodeName ) ;
214 bool ContainerKill() ;
226 void Done( bool aDone ) { _Done = aDone ; } ;
227 bool Done() { return _Done ; } ;
232 bool IsWaiting( const char * NodeName ) ;
233 bool IsReady( const char * NodeName ) ;
234 bool IsRunning( const char * NodeName ) ;
235 bool IsDone( const char * NodeName ) ;
236 bool IsSuspended( const char * NodeName ) ;
237 bool IsDone( const char * NodeName ,
238 const char * ServiceParameterName ) ;
239 long LastLevelDone() ;
244 bool SuspendedWait() ;
245 bool ReadyWait( const char * NodeName ) ;
246 bool RunningWait( const char * NodeName ) ;
247 bool DoneWait( const char * NodeName ) ;
248 bool SuspendedWait( const char * NodeName ) ;
250 const CORBA::Any *GetInData( const char *ToNodeName ,
251 const char *ToParameterName ) ;
252 const CORBA::Any *GetOutData( const char *FromNodeName ,
253 const char *FromParameterName ) ;
254 const long CpuUsed() ;
255 const long CpuUsed( const char *aNodeName ) ;