From 901d82d3e2b29864bd1dc19a45d52567abdca727 Mon Sep 17 00:00:00 2001 From: Anthony Geay Date: Tue, 16 Feb 2016 17:40:59 +0100 Subject: [PATCH 1/1] Correction of bug MANTIS23234 CEA1726. --- src/engine/ElementaryNode.cxx | 10 ++-- src/engine/ElementaryNode.hxx | 1 + src/runtime/PythonNode.cxx | 9 ++++ src/runtime/PythonNode.hxx | 1 + .../Test/StdAloneYacsLoaderTest1.py | 47 +++++++++++++++++++ 5 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/engine/ElementaryNode.cxx b/src/engine/ElementaryNode.cxx index 1b237e9bd..c92608532 100644 --- a/src/engine/ElementaryNode.cxx +++ b/src/engine/ElementaryNode.cxx @@ -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::iterator iter=_setOfOutputPort.begin();iter!=_setOfOutputPort.end();iter++) (*iter)->exInit(); for(list::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); } diff --git a/src/engine/ElementaryNode.hxx b/src/engine/ElementaryNode.hxx index 07fe8a485..cce5f0aa4 100644 --- a/src/engine/ElementaryNode.hxx +++ b/src/engine/ElementaryNode.hxx @@ -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(); diff --git a/src/runtime/PythonNode.cxx b/src/runtime/PythonNode.cxx index acadec57e..ddf37d0cb 100644 --- a/src/runtime/PythonNode.cxx +++ b/src/runtime/PythonNode.cxx @@ -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"); diff --git a/src/runtime/PythonNode.hxx b/src/runtime/PythonNode.hxx index 3f31caebc..6ef4bafff 100644 --- a/src/runtime/PythonNode.hxx +++ b/src/runtime/PythonNode.hxx @@ -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(); diff --git a/src/yacsloader_swig/Test/StdAloneYacsLoaderTest1.py b/src/yacsloader_swig/Test/StdAloneYacsLoaderTest1.py index 776905907..962f579d8 100644 --- a/src/yacsloader_swig/Test/StdAloneYacsLoaderTest1.py +++ b/src/yacsloader_swig/Test/StdAloneYacsLoaderTest1.py @@ -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 -- 2.30.2