Salome HOME
Correction of bug MANTIS23234 CEA1726.
authorAnthony Geay <anthony.geay@edf.fr>
Tue, 16 Feb 2016 16:40:59 +0000 (17:40 +0100)
committerAnthony Geay <anthony.geay@edf.fr>
Tue, 16 Feb 2016 16:50:20 +0000 (17:50 +0100)
src/engine/ElementaryNode.cxx
src/engine/ElementaryNode.hxx
src/runtime/PythonNode.cxx
src/runtime/PythonNode.hxx
src/yacsloader_swig/Test/StdAloneYacsLoaderTest1.py

index 1b237e9bd753e1894c82ec61fa811749e5cfd7fd..c92608532737687451e29f7c29a21699adb380c7 100644 (file)
@@ -85,10 +85,8 @@ ElementaryNode::~ElementaryNode()
     delete *iter4;
 }
 
-void ElementaryNode::init(bool start)
+void ElementaryNode::initCommonPartWithoutStateManagement(bool start)
 {
-  DEBTRACE("ElementaryNode::init " << getName() << " " << start << " " << _state);
-
   for(list<OutputPort *>::iterator iter=_setOfOutputPort.begin();iter!=_setOfOutputPort.end();iter++)
     (*iter)->exInit();
   for(list<InputPort *>::iterator iter2=_setOfInputPort.begin();iter2!=_setOfInputPort.end();iter2++)
@@ -99,6 +97,12 @@ void ElementaryNode::init(bool start)
       exDisabledState(); // to refresh propagation of DISABLED state
       return;
     }
+}
+
+void ElementaryNode::init(bool start)
+{
+  DEBTRACE("ElementaryNode::init " << getName() << " " << start << " " << _state);
+  initCommonPartWithoutStateManagement(start);
   setState(YACS::READY);
 }
 
index 07fe8a485a740b4fbe629e20246b23168bab3e05..cce5f0aa4fc27dc6ba43900962d60ed3149dedcb 100644 (file)
@@ -129,6 +129,7 @@ namespace YACS
       virtual void addDatastreamPortToInitMultiService(const std::string & port_name,
                                                        int number) {}
     protected:
+      void initCommonPartWithoutStateManagement(bool start);
       // Management of multi property
       virtual void createMultiDatastreamPorts();
 
index acadec57ee9efccb5dd2744ad336c99951948328..ddf37d0cb39ebaaebc18708616e2b9b6a1f77da9 100644 (file)
@@ -812,6 +812,15 @@ PyFuncNode::~PyFuncNode()
     }
 }
 
+void PyFuncNode::init(bool start)
+{
+  initCommonPartWithoutStateManagement(start);
+  if(start) //complete initialization
+    setState(YACS::READY);
+  else if(_state > YACS::LOADED)// WARNING FuncNode has internal vars (CEA usecase) ! Partial initialization (inside a loop). Exclusivity of funcNode.
+    setState(YACS::TORECONNECT);
+}
+
 void PyFuncNode::checkBasicConsistency() const throw(YACS::Exception)
 {
   DEBTRACE("checkBasicConsistency");
index 3f31caebc481dbb08ab3621b9a5d21d78b1f80a3..6ef4bafffd94f0f5c808ff5454bd9cffab45e7bb 100644 (file)
@@ -109,6 +109,7 @@ namespace YACS
       PyFuncNode(const PyFuncNode& other, ComposedNode *father);
       PyFuncNode(const std::string& name);
       virtual ~PyFuncNode();
+      virtual void init(bool start=true);
       virtual void checkBasicConsistency() const throw(Exception);
       virtual void execute();
       virtual void load();
index 776905907b0062f84865162a7244ba5786c76599..962f579d840b84fde31b1cacbcbd2ef3e7988e24 100644 (file)
@@ -129,6 +129,53 @@ class StdAloneYacsLoaderTest1(unittest.TestCase):
     self.assertEqual(p.getChildByName("node2").getOutputPort("o1").get(),['aaa','bcbcbc'])
     pass
 
+  def test3(self):
+    """ Non regression test Mantis 23234 CEA1726"""
+    fname="test23234.xml"
+    p=self.r.createProc("Test23234")
+    ti=p.createType("int","int")
+    initNode=self.r.createScriptNode("","init")
+    initNode_n=initNode.edAddOutputPort("n",ti)
+    initNode.setScript("n=10")
+    p.edAddChild(initNode)
+    #
+    endNode=self.r.createScriptNode("","checkResu")
+    endNode_n=endNode.edAddInputPort("n",ti)
+    endNode_tot=endNode.edAddInputPort("tot",ti)
+    endNode_error=endNode.edAddOutputPort("error",ti)
+    endNode.setScript("error=tot-n*(n+1)/2")
+    p.edAddChild(endNode)
+    #
+    fl=self.r.createForLoop("ForLoop_sum_1_n")
+    p.edAddChild(fl)
+    #
+    p.edAddCFLink(initNode,fl)
+    p.edAddCFLink(fl,endNode)
+    #
+    summ=self.r.createFuncNode("","sum")
+    summ_i=summ.edAddInputPort("i",ti)
+    summ_total=summ.edAddOutputPort("total",ti)
+    summ.setScript("""n=0
+def sum(i):
+   global n
+   n+=i+1
+   return n""")
+    summ.setFname("sum")
+    fl.edAddChild(summ)
+    #
+    p.edAddLink(fl.edGetIndexPort(),summ_i)
+    p.edAddLink(initNode_n,fl.edGetNbOfTimesInputPort())
+    p.edAddLink(initNode_n,endNode_n)
+    p.edAddLink(summ_total,endNode_tot)
+    #
+    p.saveSchema(fname)
+    ex=pilot.ExecutorSwig()
+    self.assertEqual(p.getState(),pilot.READY)
+    ex.RunW(p,0)
+    self.assertEqual(p.getState(),pilot.DONE)
+    self.assertEqual(endNode_error.getPyObj(),0)
+    pass
+
   def tearDown(self):
     del self.r
     del self.l