Salome HOME
The final values of InPorts of EndSwitchNodes in a loop may be wrong
[modules/superv.git] / src / GraphExecutor / DataFlowExecutor_InNodeThreads.cxx
index 835c0e11d5693a9e87817aa783ce3a89f74f1c0f..7ae01e5426cc6b925a8f85ccb8dc080106af583c 100644 (file)
@@ -54,10 +54,8 @@ using namespace std;
 #include CORBA_CLIENT_HEADER(SALOME_Component)
 #include "SALOME_LifeCycleCORBA.hxx"
 
-//#include "StreamGraph_Impl.hxx"
-
-//#include "DataFlowExecutor_OutNode.hxx"
 #include "DataFlowExecutor_DataFlow.hxx"
+#include "DataFlowEditor_DataFlow.hxx"   // GraphEditor package must be built BEFORE
 
 
 static void UpperCase(std::string& rstr)
@@ -159,6 +157,7 @@ void GraphExecutor::InNode::RunningAction() {
   cdebug << pthread_self() << "/" << ThreadNo()
          << "RunningAction pthread_cond_broadcast _RunningWait "
          << Name() << endl ;
+// That activate the pthread_cond_wait for RunninWait
   if ( pthread_cond_broadcast( &_RunningWait ) ) {
     perror("Running pthread_cond_broadcast ") ;
   }
@@ -451,17 +450,20 @@ void GraphExecutor::InNode::ThreadStartedAction() {
     exit( 0 ) ;
   }
   if ( !_ThreadStartedSync ) {
-    cdebug << "pthread_cond " << Name() << " ThreadStarted pthread_cond_wait"
+    cdebug << pthread_self() << "/" << ThreadNo()
+           << "pthread_cond " << Name() << " ThreadStarted pthread_cond_wait"
            << endl ;
     _ThreadStartedSync = true ;
     if ( pthread_cond_wait( &_ThreadStartedWait , &_MutexWait ) ) {
       perror("ThreadStarted pthread_cond_wait ") ;
     }
-    cdebug << "pthread_cond " << Name() << " ThreadStarted pthread_cond_waited"
+    cdebug << pthread_self() << "/" << ThreadNo()
+           << "pthread_cond " << Name() << " ThreadStarted pthread_cond_waited"
            << endl ;
   }
   else {
-    cdebug << "pthread_cond " << Name() << " NO ThreadStarted pthread_cond_wait"
+    cdebug << pthread_self() << "/" << ThreadNo()
+           << "pthread_cond " << Name() << " NO ThreadStarted pthread_cond_wait"
            << endl ;
 //Debug :
     _ThreadStartedSync = false ;  
@@ -469,7 +471,8 @@ void GraphExecutor::InNode::ThreadStartedAction() {
       perror("ThreadStart pthread_cond_signal ") ;
     }
 //Debug
-    cdebug << "pthread_cond " << Name() << " NO ThreadStarted pthread_cond_signaled"
+    cdebug << pthread_self() << "/" << ThreadNo()
+           << "pthread_cond " << Name() << " NO ThreadStarted pthread_cond_signaled"
            << endl ;
   }
   if ( pthread_mutex_unlock( &_MutexWait ) ) {
@@ -484,17 +487,20 @@ void GraphExecutor::InNode::ThreadStartAction() {
     exit( 0 ) ;
   }
   if ( _ThreadStartedSync ) {
-    cdebug << "pthread_cond " << Name() << " ThreadStart pthread_cond_signal"
+    cdebug << pthread_self() << "/" << ThreadNo()
+           << "pthread_cond " << Name() << " ThreadStart pthread_cond_signal"
            << endl ;
     _ThreadStartedSync = false ;  
     if ( pthread_cond_signal( &_ThreadStartedWait ) ) {
       perror("ThreadStart pthread_cond_broadcast ") ;
     }
-    cdebug << "pthread_cond " << Name() << " ThreadStart pthread_cond_signaled"
+    cdebug << pthread_self() << "/" << ThreadNo()
+           << "pthread_cond " << Name() << " ThreadStart pthread_cond_signaled"
            << endl ;
   }
   else {
-    cdebug << "pthread_cond " << Name() << " NO ThreadStart pthread_cond_signal"
+    cdebug << pthread_self() << "/" << ThreadNo()
+           << "pthread_cond " << Name() << " NO ThreadStart pthread_cond_signal"
            << endl ;
     _ThreadStartedSync = true ;
 //Debug :
@@ -502,7 +508,8 @@ void GraphExecutor::InNode::ThreadStartAction() {
       perror("ThreadStarted pthread_cond_wait ") ;
     }
 //Debug
-    cdebug << "pthread_cond " << Name() << " NO ThreadStart pthread_cond_waited"
+    cdebug << pthread_self() << "/" << ThreadNo()
+           << "pthread_cond " << Name() << " NO ThreadStart pthread_cond_waited"
            << endl ;
   }
   if ( pthread_mutex_unlock( &_MutexWait ) ) {
@@ -591,7 +598,7 @@ int GraphExecutor::InNode::executeAction() {
 }
 
 void GraphExecutor::InNode::coutbegin() {
-  cdebug << ThreadNo() << " " << pthread_self() << " run_function begin"
+  cdebug << pthread_self() << "/" << ThreadNo() << " run_function begin"
          << " " << Name() << " " << Automaton()->StateName( State() ) << endl ;
 }
 void GraphExecutor::InNode::coutexit() {
@@ -611,6 +618,8 @@ void * run_function(void *p) {
     exit(0) ;
   }
   aNode->ThreadStartAction() ;
+//  cout << "run_function " << aNode->Name() << "->ExecuteAction() Coupled : " << aNode->CoupledNode()
+//       << endl ;
   aNode->ExecuteAction() ;
   char * msg = new char[40] ;
   sprintf( msg , "%d" , (int ) aNode->ThreadNo() ) ;
@@ -626,12 +635,12 @@ void * run_function(void *p) {
 int GraphExecutor::InNode::ExecuteAction() {
   int sts ;
 
-//  const char * nextactionname = Automaton()->ActionName( _NextAction ) ;
-//  const char * statename = Automaton()->StateName( State() ) ;
-//  const char * nextstatename = Automaton()->StateName( _NextState ) ;
-//  cdebug << pthread_self() << "/" << ThreadNo() << " --> ExecuteAction "
-//         << nextactionname << " "  << statename << " NextState "
-//         << nextstatename << endl ;
+  const char * nextactionname = Automaton()->ActionName( _NextAction ) ;
+  const char * statename = Automaton()->StateName( State() ) ;
+  const char * nextstatename = Automaton()->StateName( _NextState ) ;
+  cdebug_in << pthread_self() << "/" << ThreadNo() << " --> ExecuteAction "
+            << nextactionname << " "  << statename << " NextState "
+            << nextstatename << endl ;
 
   State( _NextState ) ;
   switch ( _NextAction ) {
@@ -762,8 +771,8 @@ int GraphExecutor::InNode::ExecuteAction() {
     return 0 ;
   }
   }
-//  cdebug << pthread_self() << "/" << ThreadNo() << "<-- ExecuteAction "
-//         << Automaton()->ActionName( nextaction ) << endl ;
+  cdebug_out << pthread_self() << "/" << ThreadNo() << "<-- ExecuteAction "
+             << nextactionname << endl ;
   return sts ;
 }
 
@@ -786,25 +795,34 @@ int GraphExecutor::InNode::DataWaiting_SomeDataReadyAction() {
   unsigned int k;
   int InReady = 0 ;
   int res = 1;
-  bool LoopFinished = false ;
   bool LoopBeginning = false ;
+  bool LoopFinished = false ;
   bool SwitchFinished = false ;
 
-  if ( IsEndLoopNode() && !GetChangeNodeInLoop()->GetOutPort()->BoolValue() ) {
-    LoopFinished = true ; // End of Loop
+  if ( IsLoopNode() ) {
+    GraphBase::OutPort * anOutLoopPort = GetChangeNodeInLoop()->GetOutPort() ;
+    if ( anOutLoopPort && anOutLoopPort->BoolValue() ) {
+      LoopBeginning = true ; // Beginning of Loop
+    }
   }
-  if ( IsLoopNode() && GetChangeNodeInLoop()->GetOutPort()->BoolValue() ) {
-    LoopBeginning = true ; // Beginning of Loop
+  if ( IsEndLoopNode() ) {
+    GraphBase::OutPort * anOutLoopPort = GetChangeNodeInLoop()->GetOutPort() ;
+    if ( anOutLoopPort && !anOutLoopPort->BoolValue() ) {
+      LoopFinished = true ; // End of Loop
+    }
   }
-  if ( IsEndSwitchNode() && !GetChangeNodeInGate()->GetOutPort()->BoolValue() ) {
-    SwitchFinished = true ; // End of Switch
+  if ( IsEndSwitchNode() ) {
+    GraphBase::OutPort * anOutGateSwitchPort = GetChangeNodeInGate()->GetOutPort() ;
+    if ( anOutGateSwitchPort && !anOutGateSwitchPort->BoolValue() ) {
+      SwitchFinished = true ; // End of Switch
+    }
   }
   cdebug << pthread_self() << "/" << ThreadNo() << " " << Name() << " LoopFinished " << LoopFinished
          << " LoopBeginning " << LoopBeginning << " SwitchFinished " << SwitchFinished << endl ;
   for ( k = 0 ; k < (unsigned int ) GetNodeInPortsSize() ; k++ ) {
     GraphBase::InPort * anInPort = GetChangeNodeInPort(k) ;
     GraphBase::OutPort * anOutPort = anInPort->GetOutPort() ;
-    cdebug << pthread_self() << "/" << ThreadNo() << " " << Name() << " InPort " << anInPort->PortName() << endl ;
+    cdebug << pthread_self() << "/" << ThreadNo() << " " << Name() << " InPort " << anInPort->PortName() << " " << anInPort->State() << " " << anInPort->PortStatus() << endl ;
     if ( anInPort->IsGate() && anOutPort == NULL ) {
       InReady += 1 ;
       anInPort->State( SUPERV::ReadyState ) ;
@@ -816,9 +834,9 @@ int GraphExecutor::InNode::DataWaiting_SomeDataReadyAction() {
       if ( anInPort->State() == SUPERV::ReadyState ) {
         InReady += 1 ;
         cdebug << pthread_self() << "/" << ThreadNo() << " " << Name() << " "
-               << anInPort->PortName() << " Was Done from "
-               << anOutPort->NodeName() << " " << anOutPort->PortName()
-               << " ReadyState " ;
+               << anInPort->PortName() << " Was Done from Node "
+               << anOutPort->NodeName() << "( " << anOutPort->PortName()
+               << ") ReadyState " ;
 #ifdef _DEBUG_
         if ( GraphBase::Base::_prof_debug ) {
           anOutPort->StringValue( *GraphBase::Base::_fdebug ) ;
@@ -830,9 +848,9 @@ int GraphExecutor::InNode::DataWaiting_SomeDataReadyAction() {
         anInPort->State( SUPERV::ReadyState ) ;
         InReady += 1 ;
         cdebug << pthread_self() << "/" << ThreadNo() << " " << Name() << " "
-               << anInPort->PortName() << " Was Done from "
-               << anOutPort->NodeName() << " " << anOutPort->PortName()
-               << " LoopBeginning " << LoopBeginning ;
+               << anInPort->PortName() << " Was Done from Node "
+               << anOutPort->NodeName() << "( " << anOutPort->PortName()
+               << ") LoopBeginning " << LoopBeginning ;
 #ifdef _DEBUG_
         if ( GraphBase::Base::_prof_debug ) {
           anOutPort->StringValue( *GraphBase::Base::_fdebug ) ;
@@ -844,9 +862,9 @@ int GraphExecutor::InNode::DataWaiting_SomeDataReadyAction() {
         anInPort->State( SUPERV::ReadyState ) ;
         InReady += 1 ;
         cdebug << pthread_self() << "/" << ThreadNo() << " " << Name() << " "
-               << anInPort->PortName() << " Was Done from "
-               << anOutPort->NodeName() << " " << anOutPort->PortName()
-               << " LoopFinished" ;
+               << anInPort->PortName() << " Was Done from Node "
+               << anOutPort->NodeName() << "( " << anOutPort->PortName()
+               << ") LoopFinished" ;
 #ifdef _DEBUG_
         if ( GraphBase::Base::_prof_debug ) {
           anOutPort->StringValue( *GraphBase::Base::_fdebug ) ;
@@ -858,9 +876,9 @@ int GraphExecutor::InNode::DataWaiting_SomeDataReadyAction() {
         anInPort->State( SUPERV::ReadyState ) ;
         InReady += 1 ;
         cdebug << pthread_self() << "/" << ThreadNo() << " " << Name() << " "
-               << anInPort->PortName() << " Was Done from "
-               << anOutPort->NodeName() << " " << anOutPort->PortName()
-               << " SwitchFinished" ;
+               << anInPort->PortName() << " Was Done from Node "
+               << anOutPort->NodeName() << "( " << anOutPort->PortName()
+               << ") SwitchFinished" ;
 #ifdef _DEBUG_
         if ( GraphBase::Base::_prof_debug ) {
           anOutPort->StringValue( *GraphBase::Base::_fdebug ) ;
@@ -870,8 +888,8 @@ int GraphExecutor::InNode::DataWaiting_SomeDataReadyAction() {
       }
       else {
         cdebug << pthread_self() << "/" << ThreadNo() << " " << Name() << " "
-               << anInPort->PortName() << " Was NOT Done from "
-               << anOutPort->NodeName() << " " << anOutPort->PortName() << " "
+               << anInPort->PortName() << " Was NOT Done from Node "
+               << anOutPort->NodeName() << "( " << anOutPort->PortName() << ") "
                << " " << Automaton()->StateName( State() ) << " DataConnected "
                << anInPort->IsDataConnected() << " LoopBeginning "
                << LoopBeginning << endl ;
@@ -886,9 +904,9 @@ int GraphExecutor::InNode::DataWaiting_SomeDataReadyAction() {
         InReady += 1 ;
         anInPort->State( SUPERV::ReadyState ) ;
         cdebug << pthread_self() << "/" << ThreadNo() << " " << Name() << " "
-               << anInPort->PortName() << " Gate is Opened from "
-               << anOutPort->NodeName() << " " << anOutPort->PortName()
-               << " " ;
+               << anInPort->PortName() << " Gate is Opened from Node "
+               << anOutPort->NodeName() << "( " << anOutPort->PortName()
+               << ") " ;
 #ifdef _DEBUG_
         if ( GraphBase::Base::_prof_debug ) {
           anOutPort->StringValue( *GraphBase::Base::_fdebug ) ;
@@ -899,9 +917,9 @@ int GraphExecutor::InNode::DataWaiting_SomeDataReadyAction() {
       else if ( LoopFinished ) {
         anInPort->State( SUPERV::ReadyState ) ;
         cdebug << pthread_self() << "/" << ThreadNo() << " " << Name() << " "
-               << anInPort->PortName() << " GATE IS CLOSED from "
-               << anOutPort->NodeName() << " " << anOutPort->PortName()
-               << " LoopFinished" ;
+               << anInPort->PortName() << " GATE IS CLOSED from Node "
+               << anOutPort->NodeName() << "( " << anOutPort->PortName()
+               << ") LoopFinished" ;
 #ifdef _DEBUG_
         if ( GraphBase::Base::_prof_debug ) {
           anOutPort->StringValue( *GraphBase::Base::_fdebug ) ;
@@ -911,9 +929,9 @@ int GraphExecutor::InNode::DataWaiting_SomeDataReadyAction() {
       }
       else {
         cdebug << pthread_self() << "/" << ThreadNo() << " " << Name() << " "
-               << anInPort->PortName() << " GATE IS CLOSED from "
-               << anOutPort->NodeName() << " " << anOutPort->PortName()
-               << " " ;
+               << anInPort->PortName() << " GATE IS CLOSED from Node "
+               << anOutPort->NodeName() << "( " << anOutPort->PortName()
+               << ") " ;
 #ifdef _DEBUG_
         if ( GraphBase::Base::_prof_debug ) {
           anOutPort->StringValue( *GraphBase::Base::_fdebug ) ;
@@ -926,8 +944,9 @@ int GraphExecutor::InNode::DataWaiting_SomeDataReadyAction() {
       InReady += 1 ;
       anInPort->State( SUPERV::ReadyState ) ;
       cdebug << pthread_self() << "/" << ThreadNo() << " " << Name() << " "
-             << anInPort->PortName() << " " << anInPort->PortStatus() << " is Done from "
-             << anOutPort->NodeName() << " " << anOutPort->PortName() << " " << anOutPort->PortStatus() << " " ;
+             << anInPort->PortName() << " " << anInPort->PortStatus() << " is Done from Node "
+             << anOutPort->NodeName() << "( " << anOutPort->PortName() << ") "
+             << anOutPort->PortStatus() << " " ;
 #ifdef _DEBUG_
       if ( GraphBase::Base::_prof_debug ) {
         anOutPort->StringValue( *GraphBase::Base::_fdebug ) ;
@@ -936,7 +955,9 @@ int GraphExecutor::InNode::DataWaiting_SomeDataReadyAction() {
       cdebug << endl ;
 // MacroNode : give immediately the value to the corresponding graph
       if ( IsMacroNode() ) {
-        GraphExecutor::DataFlow * aMacroGraph = GraphMacroNode()->CoupledNode()->GraphExecutor() ;
+        cout << "SomeDataReadyAction " << GraphMacroNode() << " " << GraphMacroNode()->Name()
+             << " coupled to " << GraphMacroNode()->CoupledNode() << endl ;
+        GraphExecutor::DataFlow * aMacroGraph = GraphMacroNode()->CoupledNode()->GraphEditor()->Executor() ;
         cdebug << "SomeDataReadyAction MacroNode " << aMacroGraph->Graph()->Name() << " --> InputOfAny "
                << InReady << "/" << GetNodeInPortsSize() << " InPorts are Ready" << endl ;
 //        GraphMacroNode()->MacroObject()->InputOfAny( anInPort->PortName() , *anOutPort->Value() ) ;
@@ -944,9 +965,11 @@ int GraphExecutor::InNode::DataWaiting_SomeDataReadyAction() {
       }
     }
     else {
-      cdebug << pthread_self() << "/" << ThreadNo() << " " << Name() << " "
-             << anInPort->PortName() << " " << anInPort->PortStatus() << " is NOT Done from "
-             << anOutPort->NodeName() << " " << anOutPort->PortName() << " " << anOutPort->PortStatus() << " " ;
+      cdebug << pthread_self() << "/" << ThreadNo() << " Node " << Name() << "( "
+             << anInPort->PortName() << ") " << anInPort->PortStatus()
+             << " is NOT Done from Node "
+             << anOutPort->NodeName() << "( " << anOutPort->PortName() << ") "
+             << anOutPort->PortStatus() << " " ;
     }
   }
 
@@ -1155,9 +1178,16 @@ int GraphExecutor::InNode::DataReady_ExecuteAction() {
                 ControlState() == SUPERV::ToKillDoneState ||
                 ControlState() == SUPERV::ToStopState ) {
       cdebug << ThreadNo() << "StartComponent Error or ToKillState" << endl ;
+      MESSAGE(pthread_self() << "Executor::InNode::DataReady_ExecuteAction of " << Name()
+              << " ControlState " << Automaton()->ControlStateName( ControlState() )
+              << " BEFORE execution ThreadNo " << ThreadNo() ) ;
       Err = true ;
     }
     else {
+      if ( ControlState() == SUPERV::ToSuspendState ) {
+        cdebug << ThreadNo() << "ToSuspendState before running." << endl ;
+        MESSAGE(ThreadNo() << "ToSuspendState before running.") ;
+      }
       if ( !Err ) {
 //        ostringstream astr ;
 //        astr << "Graph " << _OutNode->Graph()->Name() << " Run of Node " << Name() ;
@@ -1173,7 +1203,8 @@ int GraphExecutor::InNode::DataReady_ExecuteAction() {
         }
         if ( IsOneOfInLineNodes() ) {
           cdebug << " , PyFuncName '" << InLineNode()->PyFuncName() << "' PyRunMethod "
-                 << InLineNode()->PyRunMethod() << " length " << (*InLineNode()->PythonFunction()).length() ;
+                 << InLineNode()->PyRunMethod() << " length "
+                 << (*InLineNode()->PythonFunction()).length() ;
        }
         cdebug << ")" << endl ;
 
@@ -1183,107 +1214,146 @@ int GraphExecutor::InNode::DataReady_ExecuteAction() {
           SetPyCpuUsed() ;
           try {
 //            if ( IsInLineNode() && (*InLineNode()->PythonFunction()).length() &&
+            bool ItIsaLoop = false ;
             bool CopyInOut = false ;
            if ( IsInLineNode() && /*InLineNode()->PyRunMethod() &&*/
                  strlen( InLineNode()->PyFuncName() ) ) {
-//              cdebug << ThreadNo() << " !ObjInterface " << Name() << " PyFuncName '"
-//                     << InLineNode()->PyFuncName()
-//                     << "' IsInLineNode PyDynInvoke"  << endl ;
+              cdebug << ThreadNo() << " !ObjInterface " << Name() << " PyFuncName '"
+                     << InLineNode()->PyFuncName()
+                     << "' IsInLineNode PyDynInvoke"  << endl ;
               StsPyDynInvoke = PyDynInvoke( InLineNode()->PyRunMethod() ,
                                             InLineNode()->PyFuncName() ,
                                             &InParametersList[0] , ServiceInParameter().length() ,
                                             &OutParametersList[0] , ServiceOutParameter().length() ) ;
-           }
+              if ( !StsPyDynInvoke ) {
+                RemovePyDynInvoke( InLineNode()->PyFuncName() ) ;
+             }     }
             else if ( IsLoopNode() ) {
+              ItIsaLoop = true ;
               bool CopyOutIn = false ;
-              if ( GetNodeInLoop()->GetOutPort()->BoolValue() && /*InLineNode()->PyRunMethod() &&*/
-                   strlen( InLineNode()->PyFuncName() ) ) { // InLoop Port
-//                cdebug << ThreadNo() << " !ObjInterface " << Name()
-//                       << " IsLoopNode PyDynInvoke '" << InLineNode()->PyFuncName()
-//                       << "'" << endl ;
-                StsPyDynInvoke = PyDynInvoke( InLineNode()->PyRunMethod() ,
-                                              InLineNode()->PyFuncName() ,
-                                              &InParametersList[1] , ServiceInParameter().length() ,
-                                              &OutParametersList[1] , ServiceOutParameter().length() ) ;
-                CopyOutIn = true ;
+// Switch between Init() and Next()
+// if InLoop port is true and does not come from EndLoop ==> execute Init
+// if InLoop port is false or come from EndLoop ==> execute Next
+//              GraphExecutor::InNode * anEndLoopNode = (GraphExecutor::InNode * ) CoupledNode()->GetInNode() ;
+//              if ( GetNodeInLoop()->GetOutPort()->BoolValue() &&
+              if ( _InitLoop ) {
+                if ( strlen( InLineNode()->PyFuncName() ) ) { // InLoop Port = true ==> Init()
+                  cdebug << ThreadNo() << " !ObjInterface " << Name()
+                         << " IsLoopNode PyDynInvoke '" << InLineNode()->PyFuncName()
+                         << "' InitLoop " << LoopNode()->PyRunMethod() << endl ;
+                  StsPyDynInvoke = PyDynInvoke( InLineNode()->PyRunMethod() ,
+                                                InLineNode()->PyFuncName() ,
+                                                &InParametersList[1] , ServiceInParameter().length() ,
+                                                &OutParametersList[1] , ServiceOutParameter().length() ) ;
+                if ( !StsPyDynInvoke ) {
+                  RemovePyDynInvoke( InLineNode()->PyFuncName() ) ;
+               }
+                  CopyOutIn = true ;
+               }
+                else {
+                  cdebug << ThreadNo() << " !ObjInterface " << Name()
+                         << " IsLoopNode NO PyDynInvoke Void PyFuncName InitLoop" << endl ;
+               }
+                cdebug << ThreadNo() << " !ObjInterface " << Name()
+                       << " IsLoopNode _InitLoop Reset after Init() Python Function" << endl ;
+                _InitLoop = false ;
              }
               else if ( LoopNode()->PyNextMethod() &&
-                        strlen( LoopNode()->PyNextName() ) ){
-//                cdebug << ThreadNo() << " !ObjInterface " << Name()
-//                       << " IsLoopNode PyDynInvoke '" << LoopNode()->PyNextName()
-//                       << "'" << endl ;
+                        strlen( LoopNode()->PyNextName() ) ){ // InLoop Port = false ==> Next()
+                cdebug << ThreadNo() << " !ObjInterface " << Name()
+                       << " IsLoopNode PyDynInvoke '" << LoopNode()->PyNextName()
+                       << "' " << LoopNode()->PyNextMethod() << endl ;
                 StsPyDynInvoke = PyDynInvoke( LoopNode()->PyNextMethod() ,
                                               LoopNode()->PyNextName() ,
                                               &InParametersList[1] , ServiceInParameter().length() ,
                                               &OutParametersList[1] , ServiceOutParameter().length() ) ;
+                if ( !StsPyDynInvoke ) {
+                  RemovePyDynInvoke( LoopNode()->PyNextName() ) ;
+               }
                 CopyOutIn = true ;
              }
-              if ( StsPyDynInvoke && CopyOutIn ) {
-//                cdebug << ThreadNo() << " !ObjInterface " << Name()
-//                       << " IsLoopNode PyDynInvoke '" << LoopNode()->PyMoreName()
-//                       << "' Copy of " << ServiceInParameter().length()
-//                       << " OutParameters" << endl ;
-                int i ;
-                for ( i = 1 ; i <= (int ) ServiceInParameter().length() ; i++ ) {
-                  InParametersList[i].Value = OutParametersList[i].Value ;
-                  InParametersList[i].Name = OutParametersList[i].Name ;
+              else {
+                cdebug << ThreadNo() << " !ObjInterface " << Name()
+                       << " IsLoopNode NO PyDynInvoke Void PyFuncName NextLoop" << endl ;
+             }
+              if ( StsPyDynInvoke ) {
+                if ( CopyOutIn ) {
+                  cdebug << ThreadNo() << " !ObjInterface " << Name()
+                         << " IsLoopNode PyDynInvoke '" << LoopNode()->PyMoreName()
+                         << "' Copy of " << ServiceInParameter().length()
+                         << " OutParameters" << endl ;
+                  int i ;
+// Start at 1 : Do not copy InLoop ( InLoop == true <==> Init ; InLoop == false <==> Next )
+                  for ( i = 1 ; i <= (int ) ServiceInParameter().length() ; i++ ) {
+                    InParametersList[i].Value = OutParametersList[i].Value ;
+                    InParametersList[i].Name = OutParametersList[i].Name ;
 //#if 0
-                  switch ( InParametersList[i].Value.type()->kind() ) {
-                  case CORBA::tk_string :
-                    char * t;
-                    InParametersList[i].Value >>= t ;
-                    cdebug << "ArgOut->In" << i << " : "
-                           << InParametersList[i].Name.c_str()
-                           << " Value(string) " << t << endl ;
-                    break ;
-                  case CORBA::tk_double :
-                    double d;
-                    InParametersList[i].Value >>= d;
-                    cdebug << "ArgOut->In" << i << " : "
-                           << InParametersList[i].Name.c_str()
-                           << " Value(double) " << d << endl ;
-                    break ;
-                  case CORBA::tk_long :
-                    long l;
-                    InParametersList[i].Value >>= l;
-                    cdebug << "ArgOut->In" << i << " : "
-                           << InParametersList[i].Name.c_str()
-                           << " Value(long) " << l << endl ;
-                    break ;
-                  case CORBA::tk_objref :
-                    CORBA::Object_ptr obj ;
-                    char * retstr ;
-                    try {
-                      InParametersList[i].Value >>= obj ;
-                      retstr = ObjectToString( obj );
+                    switch ( InParametersList[i].Value.type()->kind() ) {
+                    case CORBA::tk_string :
+                      char * t;
+                      InParametersList[i].Value >>= t ;
                       cdebug << "ArgOut->In" << i << " : "
                              << InParametersList[i].Name.c_str()
-                             << " Value(object reference) " << retstr << endl ;
-                    }
-                    catch ( ... ) {
+                             << " Value(string) " << t << endl ;
+                      break ;
+                    case CORBA::tk_double :
+                      double d;
+                      InParametersList[i].Value >>= d;
                       cdebug << "ArgOut->In" << i << " : "
                              << InParametersList[i].Name.c_str()
-                             << " Value(object reference) Catched ERROR" << endl ;
-                   }
-                    break ;
-                  default :
-                    cdebug << "ArgOut->In" << i << " : "
-                           << InParametersList[i].Name.c_str()
-                           << " Value(other) ERROR" << endl ;
-                 }
+                             << " Value(double) " << d << endl ;
+                      break ;
+                    case CORBA::tk_long :
+                      long l;
+                      InParametersList[i].Value >>= l;
+                      cdebug << "ArgOut->In" << i << " : "
+                             << InParametersList[i].Name.c_str()
+                             << " Value(long) " << l << endl ;
+                      break ;
+                    case CORBA::tk_objref :
+                      CORBA::Object_ptr obj ;
+                      char * retstr ;
+                      try {
+                        InParametersList[i].Value >>= obj ;
+                        retstr = ObjectToString( obj );
+                        cdebug << "ArgOut->In" << i << " : "
+                               << InParametersList[i].Name.c_str()
+                               << " Value(object reference) " << retstr << endl ;
+                      }
+                      catch ( ... ) {
+                        cdebug << "ArgOut->In" << i << " : "
+                               << InParametersList[i].Name.c_str()
+                               << " Value(object reference) Catched ERROR" << endl ;
+                     }
+                      break ;
+                    default :
+                      cdebug << "ArgOut->In" << i << " : "
+                             << InParametersList[i].Name.c_str()
+                             << " Value(other) ERROR" << endl ;
+                   }
 //#endif
+                 }
                }
                 if ( LoopNode()->PyMoreMethod() && strlen( LoopNode()->PyMoreName() ) ) {
+                  cdebug << ThreadNo() << " !ObjInterface " << Name()
+                         << " IsLoopNode PyDynInvoke '" << LoopNode()->PyMoreName()
+                         << "' " << LoopNode()->PyMoreMethod() << endl ;
                   StsPyDynInvoke = PyDynInvoke( LoopNode()->PyMoreMethod() ,
                                                 LoopNode()->PyMoreName() ,
                                                 &InParametersList[1] , ServiceInParameter().length() ,
                                                 &OutParametersList[0] , ServiceOutParameter().length()+1 ) ;
+                  if ( !StsPyDynInvoke ) {
+                    RemovePyDynInvoke( LoopNode()->PyMoreName() ) ;
+                 }
                }
                 else {
+                  cdebug << ThreadNo() << " !ObjInterface " << Name()
+                         << " IsLoopNode PyDynInvoke '" << LoopNode()->PyMoreName()
+                         << "' No MoreMethod" << endl ;
                   CopyInOut = true ;
                }
              }
-              else  if ( !StsPyDynInvoke ) {
+              else {
                 Err = true ;
                 cdebug << ThreadNo() << " InLineNode " << Name() << " "
                        << InLineNode()->PyFuncName() << "/" << LoopNode()->PyNextName()
@@ -1300,6 +1370,9 @@ int GraphExecutor::InNode::DataReady_ExecuteAction() {
                                             InLineNode()->PyFuncName() ,
                                             &InParametersList[0] , ServiceInParameter().length() ,
                                             &OutParametersList[0] , ServiceOutParameter().length() ) ;
+              if ( !StsPyDynInvoke ) {
+                RemovePyDynInvoke( InLineNode()->PyFuncName() ) ;
+             }
            }
 //            else if ( IsGOTONode() && (*GOTONode()->PythonFunction()).length() &&
             else if ( IsGOTONode() && /*InLineNode()->PyRunMethod() &&*/
@@ -1311,6 +1384,9 @@ int GraphExecutor::InNode::DataReady_ExecuteAction() {
                                             InLineNode()->PyFuncName() ,
                                             &InParametersList[0] , ServiceInParameter().length() ,
                                             &OutParametersList[0] , ServiceOutParameter().length() ) ;
+              if ( !StsPyDynInvoke ) {
+                RemovePyDynInvoke( GOTONode()->PyFuncName() ) ;
+             }
            }
 //            else if ( IsEndSwitchNode() && (*InLineNode()->PythonFunction()).length() &&
             else if ( ( IsEndSwitchNode() ) &&
@@ -1322,20 +1398,28 @@ int GraphExecutor::InNode::DataReady_ExecuteAction() {
                                             InLineNode()->PyFuncName() ,
                                             &InParametersList[0] , ServiceInParameter().length() ,
                                             &OutParametersList[0] , ServiceOutParameter().length() ) ;
+              if ( !StsPyDynInvoke ) {
+                RemovePyDynInvoke( InLineNode()->PyFuncName() ) ;
+             }
            }
             else if ( ( IsEndLoopNode() ) &&
                       InLineNode()->PyRunMethod() && strlen( InLineNode()->PyFuncName() ) ) {
-//              cdebug << ThreadNo() << " !ObjInterface " << Name() << " PyFuncName '"
-//                     << InLineNode()->PyFuncName()
-//                     << "' IsSwitchNode PyDynInvoke"  << endl ;
+              cdebug << ThreadNo() << " !ObjInterface " << Name() << " PyFuncName '"
+                     << InLineNode()->PyFuncName()
+                     << "' IsSwitchNode PyDynInvoke"  << endl ;
               StsPyDynInvoke = PyDynInvoke( InLineNode()->PyRunMethod() ,
                                             InLineNode()->PyFuncName() ,
                                             &InParametersList[0] , ServiceInParameter().length() + 1 ,
                                             &OutParametersList[0] , ServiceOutParameter().length() + 1 ) ;
+              if ( !StsPyDynInvoke ) {
+                RemovePyDynInvoke( InLineNode()->PyFuncName() ) ;
+             }
            }
+
 //            else if ( (*InLineNode()->PythonFunction()).length() == 0 ||
-            if ( InLineNode()->PyRunMethod() == NULL ||
-                 strlen( InLineNode()->PyFuncName() ) == 0 || CopyInOut ) {
+            if ( (!ItIsaLoop && ( InLineNode()->PyRunMethod() == NULL ||
+                                  strlen( InLineNode()->PyFuncName() ) == 0 ) ) || CopyInOut ) {
+// This is a void Python Function : without code (No PyFuncName)
 //              cdebug << ThreadNo() << " !ObjInterface " << Name()
 //                     << " Copy of " << ServiceInParameter().length()
 //                     << " OutParameters" << endl ;
@@ -1345,8 +1429,12 @@ int GraphExecutor::InNode::DataReady_ExecuteAction() {
               if ( IsLoopNode() || IsEndLoopNode() ) {
                 argout0 = 1 ;
                 argin0 = 1 ; // after DoLoop
-                if ( IsLoopNode() ) {
-                  OutParametersList[0].Value = InParametersList[0].Value ; // DoLoop
+                if ( IsLoopNode() ) { // More() is void
+//                  OutParametersList[0].Value = InParametersList[0].Value ; // DoLoop
+                  cdebug << Name() << " Not Beginning of loop and non void EndLoop : DoLoop = EndLoop(DoLoop)"
+                         << endl ;
+                  GraphExecutor::InNode * anEndLoopNode = (GraphExecutor::InNode * ) CoupledNode()->GetInNode() ;
+                  OutParametersList[0].Value = *anEndLoopNode->GetNodeOutLoop()->Value() ; // DoLoop = EndLoop(DoLoop)
                }
              }
               for ( i = 0 ; i < (int ) ServiceInParameter().length() ; i++ ) {
@@ -1441,7 +1529,7 @@ int GraphExecutor::InNode::DataReady_ExecuteAction() {
               }
               catch( ... ) {
                 cdebug << "DynInvoke setProperties catched ERROR" << endl ;
-                Err = true ;
+               Err = true;
              }
            }
             if ( !Err && IsComputingNode() ) {
@@ -1449,16 +1537,18 @@ int GraphExecutor::InNode::DataReady_ExecuteAction() {
                      << " IsComputingNode DynInvoke"  << endl ;
               cdebug << ServiceInParameter().length()-1 << " input parameters and "
                      << ServiceOutParameter().length() << " output parameters" << endl ;
+              IsLoading( false ) ;
               DynInvoke( myObjComponent,
                          ServiceName() ,
                          &InParametersList[1] , ServiceInParameter().length()-1 ,
                          &OutParametersList[0] , ServiceOutParameter().length() ) ;
            }
-            else if ( !Err &&IsFactoryNode() ) {
+            else if ( !Err && IsFactoryNode() ) {
               cdebug << ThreadNo() << " !ObjInterface " << Name()
                      << " IsFactoryNode DynInvoke"  << endl ;
               cdebug << ServiceInParameter().length() << " input parameters and "
                      << ServiceOutParameter().length() << " output parameters" << endl ;
+              IsLoading( false ) ;
               DynInvoke( myObjComponent,
                          ServiceName() ,
                          &InParametersList[0] , ServiceInParameter().length() ,
@@ -1472,20 +1562,29 @@ int GraphExecutor::InNode::DataReady_ExecuteAction() {
             cdebug << ThreadNo() << " !ObjInterface " << Name()
                    << " Node(Component) Dynamic Call Exception catched ERROR"
                    << endl ;
+//Reset of _ThreadId in the Container ...
+            try {
+              myObjComponent->Kill_impl() ;
+           }
+            catch( ... ) {
+           }
          }
         }
       }
     }
   }
-//  else {
-//    sleep( 1 ) ;
-//  }
 
 //  ostringstream astr ;
 //  astr << "Graph " << _OutNode->Graph()->Name() << " Node " << Name() << " is done : "
 //       << Automaton()->StateName( State() ) ;
 //  _OutNode->Graph()->ObjImpl()->sendMessage( NOTIF_STEP, astr.str().c_str() ) ;
+
   if ( Err ) {
+    
+    // if exception or something else - IsLoading( false ) may not NOT has been called
+    if ( IsLoading() )
+      IsLoading( false );
+
     if ( ControlState() == SUPERV::ToKillState ||
          ControlState() == SUPERV::ToKillDoneState ||
          ControlState() == SUPERV::ToStopState ) {
@@ -1518,8 +1617,9 @@ int GraphExecutor::InNode::DataReady_ExecuteAction() {
     SendEvent( NewEvent ) ;
   }
   else {
-    GraphExecutor::DataFlow * aMacroGraph = GraphMacroNode()->CoupledNode()->GraphExecutor() ;
-    cdebug << ThreadNo() << " DataReady_ExecuteAction " << aMacroGraph->Graph()->Name() << " ->DoneWait()"
+    GraphExecutor::DataFlow * aMacroGraph = GraphMacroNode()->CoupledNode()->GraphEditor()->Executor() ;
+    cdebug << ThreadNo() << " DataReady_ExecuteAction " << aMacroGraph << " "
+           << aMacroGraph->Graph()->Name() << " ->DoneWait()"
            << " State " << aMacroGraph->State() << endl;
     aMacroGraph->DoneWait() ;
     cdebug << ThreadNo() << " DataReady_ExecuteAction " << Name() << " State " << aMacroGraph->State() << endl;
@@ -1575,7 +1675,7 @@ int GraphExecutor::InNode::SuspendedExecuting_ResumeAction() {
 }
 
 int GraphExecutor::InNode::Executing_KillAction() {
-  cdebug << ThreadNo() << " Executing_KillAction " << Name() << endl;
+  cdebug << ThreadNo() << " Executing_KillAction " << Name() << " Thread " << ThreadNo()<< endl;
   int RetVal = 0 ;
   if ( pthread_self() == ThreadNo() ) {
     cdebug << "Executing_KillAction would pthread_canceled itself" << endl ;
@@ -1588,10 +1688,10 @@ int GraphExecutor::InNode::Executing_KillAction() {
     perror("Executing_KillAction pthread_cancel error") ;
   }
   else {
-    cdebug << "Executing_KillAction : ThreadId " << ThreadNo()
+    cdebug << pthread_self() << " Executing_KillAction : ThreadId " << ThreadNo()
            << " pthread_canceled" << endl ;
     KillAction() ;
-    _OutNode->ExitThread() ;
+    _OutNode->ExitThread( ThreadNo() ) ;
     _OutNode->PushEvent( this , GraphExecutor::KilledExecutingEvent ,
                          GraphExecutor::KilledExecutingState ) ; 
   }
@@ -1599,16 +1699,16 @@ int GraphExecutor::InNode::Executing_KillAction() {
 }
 
 int GraphExecutor::InNode::Executing_StopAction() {
-  cdebug << ThreadNo() << " Executing_StopAction " << Name() << endl;
+  cdebug << ThreadNo() << " Executing_StopAction " << Name() << " Thread " << ThreadNo() << endl;
   int RetVal = 0 ;
   if ( pthread_cancel( ThreadNo() ) ) {
     perror("Executing_KillAction pthread_cancel error") ;
   }
   else {
-    cdebug << "Executing_KillAction : ThreadId " << ThreadNo()
+    cdebug << pthread_self() << " Executing_KillAction : ThreadId " << ThreadNo()
            << " pthread_canceled" << endl ;
     StopAction() ;
-    _OutNode->ExitThread() ;
+    _OutNode->ExitThread( ThreadNo() ) ;
     _OutNode->PushEvent( this , GraphExecutor::StoppedExecutingEvent ,
                          GraphExecutor::StoppedExecutingState ) ; 
   }
@@ -1619,6 +1719,9 @@ int GraphExecutor::InNode::Executing_SuccessAction() {
 //  cdebug << ThreadNo() << " --> Executing_SuccessAction " << Name() << endl;
   _OutNode->PushEvent( this , GraphExecutor::SuccessedExecutingEvent ,
                        GraphExecutor::SuccessedState ) ; 
+  MESSAGE(pthread_self() << "Executor::InNode::Executing_SuccessAction of " << Name()
+          << " ControlState " << Automaton()->ControlStateName( ControlState() )
+          << " AFTER execution ThreadNo " << ThreadNo() ) ;
   SUPERV::ControlState aControl = ControlState() ;
   switch ( aControl ) {
   case SUPERV::VoidState : {
@@ -1706,16 +1809,21 @@ void GraphExecutor::InNode::SetWaitingStates(GraphExecutor::InNode * EndNode ) {
   State( GraphExecutor::DataWaitingState ) ;
   for ( i = 0 ; i < GetNodeInPortsSize() ; i++ ) {
     GraphBase::InPort * anInPort = GetChangeNodeInPort( i ) ;
-    if ( anInPort->IsGate() ) { // Loop : Open the doors
+    cdebug << "SetWaitingStates InPort " << Name() << "( " << anInPort->PortName() << " ) "
+           << anInPort->PortStatus() << " " << anInPort->State() << endl ;
+// JR Debug 07.01.2005 : Close the Gates instead of open !!!
+    if ( anInPort->IsGate() ) { // Loop : Close the doors
       GraphBase::OutPort * anOutPort = anInPort->GetOutPort() ;
       if ( anOutPort ) {
         CORBA::Any * anAny = new CORBA::Any() ;
-        *anAny <<= (long ) 1 ;
+//        *anAny <<= (long ) 1 ;
+        *anAny <<= (long ) 0 ;
         anOutPort->Value( anAny ) ;
-        anInPort->State( SUPERV::ReadyState ) ;
+        anInPort->State( SUPERV::WaitingState ) ;
       }
     }
-    else if ( anInPort->State() != SUPERV::WaitingState ) {
+    else if ( anInPort->State() != SUPERV::WaitingState &&
+              !anInPort->IsDataConnected() ) {
       if ( !docdebug ) {
         cdebug << ThreadNo()
                << " --> GraphExecutor::InNodeThreads::SetWaitingStates " << Name() << endl;
@@ -1725,23 +1833,41 @@ void GraphExecutor::InNode::SetWaitingStates(GraphExecutor::InNode * EndNode ) {
         anInPort->State( SUPERV::WaitingState ) ;
       }
     }
+    cdebug << "               --> " << Name() << "( " << anInPort->PortName() << " ) "
+           << anInPort->PortStatus() << " " << anInPort->State() << endl ;
   }
   for ( i = 0 ; i < GetNodeOutPortsSize() ; i++ ) {
     GraphBase::OutPort * anOutPort = GetChangeNodeOutPort( i ) ;
     for ( j = 0 ; j < anOutPort->InPortsSize() ; j++ ) {
       if ( !( IsGOTONode() && anOutPort->IsGate() ) &&
-           !( IsEndLoopNode() && ( anOutPort->IsGate() ||
-              anOutPort->IsLoop() ) ) &&
+           !( IsEndLoopNode() && ( anOutPort->IsGate() || anOutPort->IsLoop() ) ) &&
            !anOutPort->IsDataStream() &&
            !anOutPort->ChangeInPorts( j )->IsDataStream() &&
            !anOutPort->ChangeInPorts( j )->IsExternConnected() ) {
         cdebug << ThreadNo()
-               << " GraphExecutor::InNodeThreads::SetWaitingStates "
-               << Name() << "( " << anOutPort->PortName() << " " << anOutPort->PortStatus() << " ) --> InPort "
+               << " InNodeThreads::SetWaitingStates OutPort "
+               << Name() << "/" << anOutPort->ChangeInPorts( j )->NodeName() << "( "
+               << anOutPort->PortName() << " " << anOutPort->PortStatus() << " ) --> InPort "
+               << anOutPort->ChangeInPorts( j )->NodeName() << "( "
                << anOutPort->ChangeInPorts( j )->PortName() << " "
-               << anOutPort->ChangeInPorts( j )->PortStatus() << " from Node "
-               << anOutPort->ChangeInPorts( j )->NodeName() << endl;
-        GraphExecutor::InNode * aNode = (GraphExecutor::InNode * ) _OutNode->Graph()->GetChangeGraphNode( anOutPort->ChangeInPorts( j )->NodeName() )->GetInNode() ;
+               << anOutPort->ChangeInPorts( j )->PortStatus() << " )" << endl;
+       GraphBase::ComputingNode * aToNode ;
+        aToNode = _OutNode->Graph()->GetChangeGraphNode( anOutPort->ChangeInPorts( j )->NodeName() ) ;
+// JR 12.01.2005 : the OutPort linked to the InPort of a EndSwitchNode was changed so final
+//                 values of InPorts of EndSwitchNode may be wrong
+        if ( !aToNode->IsEndSwitchNode() && 
+             strcmp( anOutPort->ChangeInPorts( j )->GetOutPort()->NodeName() , Name() ) ) {
+// After EndLoopNode or GOTONode the Input Ports of LoopNode or LabelNode have their values from
+// EndLoopNode or GOTONode. But if there is several nested loops we should re-establish.
+          cdebug << ThreadNo()
+                 << " InNodeThreads::SetWaitingStates Node " << Name() << " " 
+                 << anOutPort->ChangeInPorts( j )->GetOutPort()->NodeName() << "( "
+                 << anOutPort->ChangeInPorts( j )->GetOutPort()->PortName() << " ) != "
+                 << Name() << " : Restored to " << anOutPort->NodeName() << "( "
+                 << anOutPort->PortName() << " )" << endl ;
+          anOutPort->ChangeInPorts( j )->ChangeOutPort( anOutPort ) ;
+        }
+        GraphExecutor::InNode * aNode = (GraphExecutor::InNode * ) aToNode->GetInNode() ;
         if ( aNode != EndNode ) {
           aNode->SetWaitingStates( EndNode ) ;
        }
@@ -1780,12 +1906,25 @@ int GraphExecutor::InNode::Successed_SuccessAction() {
     else {
       aGateOutPort = GetNodeOutLoop() ;
     }
+    if ( aGateOutPort->InPortsSize() != 1 ) {
+      cdebug << ThreadNo() << " Successed_SuccessAction aGateOutPort->InPortsSize "
+             << aGateOutPort->InPortsSize() << " != 1 ERROR " << Name() << endl ;
+    }
+    GraphExecutor::InNode * aLabelNode = NULL ;
     for ( i = 0 ; i < aGateOutPort->InPortsSize() ; i++ ) {
       const GraphBase::InPort * anInPort = aGateOutPort->InPorts( i ) ;
-      GraphExecutor::InNode * aLabelNode = (GraphExecutor::InNode *) _OutNode->Graph()->GetChangeGraphNode( anInPort->NodeName() )->GetInNode() ;
+      aLabelNode = (GraphExecutor::InNode *) _OutNode->Graph()->GetChangeGraphNode( anInPort->NodeName() )->GetInNode() ;
       cdebug << ThreadNo() << " Successed_SuccessAction " << Name() << " will Loop to HeadNode "
              << aLabelNode->Name() << " from port " << anInPort->PortName() << endl ;
       aLabelNode->SetWaitingStates( this ) ;
+// JR 07.01.2005 Debug : Open the Gate of the coupledNode closed by SetWaitingStates
+      GraphBase::OutPort * anOutPort = aLabelNode->GetChangeNodeInGate()->GetOutPort() ;
+      if ( anOutPort ) {
+        CORBA::Any * anAny = new CORBA::Any() ;
+        *anAny <<= (long ) 1 ;
+        anOutPort->Value( anAny ) ;
+        aLabelNode->GetChangeNodeInGate()->State( SUPERV::ReadyState ) ;
+      }
       for ( j = 0 ; j < aLabelNode->GetNodeInPortsSize() ; j++ ) {
         const GraphBase::InPort * anInPort = aLabelNode->GetNodeInPort( j ) ;
         if ( anInPort->GetOutPort() ) {
@@ -1799,7 +1938,8 @@ int GraphExecutor::InNode::Successed_SuccessAction() {
         if ( !aBusParamOutPort->IsGate() ) {
           GraphBase::InPort * aBusParamChangeInPort = NULL ;
           if ( aBusParamOutPort->IsLoop() ) {
-            aBusParamChangeInPort = aLabelNode->GetChangeNodeInLoop() ;
+// For EndLoop do not copy EndLoop(DoLoop) in Loop(InLoop)
+//            aBusParamChangeInPort = aLabelNode->GetChangeNodeInLoop() ;
          }
           else {
             aBusParamChangeInPort = aLabelNode->GetChangeInPort( aBusParamOutPort->PortName() ) ;
@@ -1809,42 +1949,32 @@ int GraphExecutor::InNode::Successed_SuccessAction() {
             cdebug << ThreadNo() << " Successed_SuccessAction " << Name() << " ChangeOutPort to HeadNode "
                    << aLabelNode->Name() << "(" << aBusParamChangeInPort->PortName() << ") from port "
                    << aBusParamOutPort->PortName() << endl ;
-            if ( !aLabelNode->IsLockedDataWait() ) {
-              res = aLabelNode->SendSomeDataReady( Name() ) ;
-              if ( res ) {
-                if ( firsttoNode == NULL &&
-                     aLabelNode->ThreadNo() == pthread_self() ) {
-                  firsttoNode = aLabelNode ;
-                  cdebug << ThreadNo() << " Successed_SuccessAction firsttoNode "
-                         << aLabelNode->Name() << endl ;
-                }
-                else if ( firstzeroNode == NULL &&
-                          aLabelNode->ThreadNo() == 0 ) {
-                  firstzeroNode = aLabelNode ;
-               }
-                else {
-                  SomeDataNodes.push_back( aLabelNode ) ;
-                  cdebug << ThreadNo() << " Successed_SuccessAction " << Name() << " push "
-                         << aLabelNode->Name() << " " << SomeDataNodes.size() 
-                         << endl ;
-               }
-             }
-           }
-            else {
-              cdebug << ThreadNo()
-                     << " Successed_SuccessAction Loop to HeadNode "
-                     << aLabelNode->Name() << " with datas from " << Name() << "("
-                     << aBusParamOutPort->PortName() << ") to port "
-                     << aBusParamChangeInPort->PortName() << endl;
-           }
-         }
-          else {
-            cdebug << ThreadNo() << " ERROR in Successed_SuccessAction of " << Name()
-                   << " NO port " << aBusParamOutPort->PortName() << " in "
-                   << aLabelNode->Name() << endl;
          }
+       }
+      }
+    }
+
+    if ( aLabelNode && !aLabelNode->IsLockedDataWait() ) {
+      res = aLabelNode->SendSomeDataReady( Name() ) ;
+      if ( res ) {
+        if ( firsttoNode == NULL &&
+             aLabelNode->ThreadNo() == pthread_self() ) {
+          firsttoNode = aLabelNode ;
+          cdebug << ThreadNo() << " Successed_SuccessAction firsttoNode "
+                 << aLabelNode->Name() << endl ;
         }
+        else if ( firstzeroNode == NULL &&
+                  aLabelNode->ThreadNo() == 0 ) {
+          firstzeroNode = aLabelNode ;
+        }
+        else {
+          SomeDataNodes.push_back( aLabelNode ) ;
+          cdebug << ThreadNo() << " Successed_SuccessAction " << Name() << " push "
+                 << aLabelNode->Name() << " " << SomeDataNodes.size() 
+                 << endl ;
+       }
       }
+
       for ( j = 0 ; j < aLabelNode->GetNodeInPortsSize() ; j++ ) {
         const GraphBase::InPort * anInPort = aLabelNode->GetNodeInPort( j ) ;
         if ( anInPort->GetOutPort() ) {
@@ -1952,7 +2082,7 @@ int GraphExecutor::InNode::Successed_SuccessAction() {
           LoopOutPort->PortStatus( DataConnected );
           LoopOutPort->State( SUPERV::ReadyState ) ;
           LoopOutPort->Done( true ) ;
-          CORBA::Any * anAny = new CORBA::Any() ;
+          CORBA::Any * anAny = new CORBA::Any() ; // InitLoop
           *anAny <<= (long ) 1 ;
           LoopOutPort->Value( anAny ) ;
           int j ;
@@ -2074,7 +2204,7 @@ int GraphExecutor::InNode::Successed_SuccessAction() {
 bool GraphExecutor::InNode::SendSomeDataReady( char * FromNodeName ) {
   bool RetVal = false ;
   if ( IsDataFlowNode() ) {
-    cdebug << ThreadNo() << " ----> " << Name()
+    cdebug << ThreadNo() << "InNode::SendSomeDataReady ----> " << Name()
          << " send Result to graph " << Name() << endl;
   }
   else {
@@ -2099,6 +2229,12 @@ bool GraphExecutor::InNode::SendSomeDataReady( char * FromNodeName ) {
 //             << ThreadNo() << " " << endl ;
       State( GraphExecutor::DataWaitingState ) ;
     }
+// We begin that LoopNode if SendSomeDataReady does not come from the corresponding EndLoopNode
+    if ( IsLoopNode() && strcmp( LoopNode()->CoupledNodeName() , FromNodeName ) ) {
+      cdebug << ThreadNo() << "InNode::SendSomeDataReady " << Name() << " Set _InitLoop from "
+             << FromNodeName << endl ;
+      _InitLoop = true ;
+    }
     LockDataWait() ;
     DataFromNode( FromNodeName ) ;
     RetVal = !SendEvent( GraphExecutor::SomeDataReadyEvent );
@@ -2277,6 +2413,7 @@ void GraphExecutor::InNode::InParametersSet( bool & Err ,
                                              int  nInParams ,
                                              ServicesAnyData * InParametersList ) {
   int i ;
+  cdebug << ThreadNo() << " InParametersSet " << Name() << endl ;
   for ( i = 0 ; i < nInParams ; i++ ) {
     ServicesAnyData D = InParametersList[i];
     GraphBase::InPort * anInPort = GetChangeNodeInPort(i) ;
@@ -2292,11 +2429,13 @@ void GraphExecutor::InNode::InParametersSet( bool & Err ,
         *anAny <<= (long ) 0 ;
         theOutPort->Value( anAny ) ;
       }
-      if ( !anInPort->IsDataStream() ) {
+      if ( !anInPort->IsDataStream() &&
+           !anInPort->IsDataConnected() ) {
         anInPort->State( SUPERV::WaitingState ) ;
       }
       D.Name = CORBA::string_dup( anInPort->GetServicesParameter().Parametername ) ;
-      cdebug << ThreadNo() << " ArgIn" << i << " " << anInPort->Kind() ;
+      cdebug << ThreadNo() << " ArgIn" << i << " " << anInPort->Kind()
+             << " " << anInPort->State() ;
       cdebug << "      " << D.Name << " " << anInPort->GetServicesParameter().Parametertype << " : " ;
       D.Value = *theOutPort->Value() ; // CORBA::Any
       string _Type = CORBA::string_dup( anInPort->GetServicesParameter().Parametertype ) ;
@@ -2791,9 +2930,11 @@ bool GraphExecutor::InNode::OutParametersSet( bool Err ,
           bool fromGOTO = false ;
           const char * ToNodeName = anOutPort->ChangeInPorts( j )->NodeName() ;
           if ( !strcmp( ToNodeName , _OutNode->Graph()->Name() ) && _OutNode->Graph()->GraphMacroLevel() != 0 ) {
-            cdebug << "OutParametersSet ToNodeName " << _OutNode->Graph()->CoupledNode()
-                   << " GraphExecutor " << _OutNode->Graph()->CoupledNode()->GraphExecutor() << endl ;
-            _OutNode->Graph()->CoupledNode()->GraphExecutor()->OutputOfAny( _OutNode->Graph()->CoupledNodeName() ,
+            cdebug << "OutParametersSet ToNodeName " << _OutNode->Graph()->Name() << " CoupledNode "
+                   << _OutNode->Graph()->CoupledNodeName() << _OutNode->Graph()->CoupledNode()
+                   << endl ;
+            cdebug << " GraphExecutor " << _OutNode->Graph()->CoupledNode()->GraphEditor()->Executor() << endl ;
+            _OutNode->Graph()->CoupledNode()->GraphEditor()->Executor()->OutputOfAny( _OutNode->Graph()->CoupledNodeName() ,
                                                                             anOutPort->ChangeInPorts( j )->PortName() ,
                                                                             *anOutPort->Value() ) ;
          }