From 28e60ce8c9ce4d1ced9a5b61ef58dc4919864d99 Mon Sep 17 00:00:00 2001 From: Ovidiu Mircescu Date: Tue, 21 Mar 2017 17:19:24 +0100 Subject: [PATCH] Fix the python API of the savestate feature. Proc::savestate is now deprecated. You have to use VisitorSalomeSaveState (c++) or SALOMERuntime.schemaSaveState (python). --- src/engine/Proc.hxx | 2 ++ src/runtime/VisitorSalomeSaveState.cxx | 23 ++++---------- src/runtime/VisitorSalomeSaveState.hxx | 13 ++------ src/runtime_swig/SALOMERuntime.i | 9 ++---- src/yacsloader_swig/Test/testSaveLoadRun.py | 35 ++++++++++++++++++++- 5 files changed, 48 insertions(+), 34 deletions(-) diff --git a/src/engine/Proc.hxx b/src/engine/Proc.hxx index f2a7ea96c..95cc82d57 100644 --- a/src/engine/Proc.hxx +++ b/src/engine/Proc.hxx @@ -98,6 +98,8 @@ namespace YACS virtual void setEdition(bool edition); virtual void modified(); virtual void saveSchema(const std::string& xmlSchemaFile); + //! deprecated. See VisitorSalomeSaveState and schemaSaveState in order + //! to deal with the execution state of ForEachLoop. virtual void saveState(const std::string& xmlStateFile); protected: void removeContainers(); diff --git a/src/runtime/VisitorSalomeSaveState.cxx b/src/runtime/VisitorSalomeSaveState.cxx index 589f76db1..b0957cf93 100644 --- a/src/runtime/VisitorSalomeSaveState.cxx +++ b/src/runtime/VisitorSalomeSaveState.cxx @@ -111,24 +111,13 @@ void VisitorSalomeSaveState::visitForEachLoop(ForEachLoop *node) _out << " " << std::endl; } - -SchemaSaveState::SchemaSaveState(Proc* proc, Executor* exec) -: _p(proc), - _exec(exec) -{ - YASSERT(_p); - YASSERT(_exec); -} - -SchemaSaveState::~SchemaSaveState() -{ -} - -void SchemaSaveState::save(std::string xmlSchemaFile) +void YACS::ENGINE::schemaSaveState(Proc* proc, + Executor* exec, + const std::string& xmlSchemaFile) { - YACS::BASES::AutoLocker alck(&(_exec->getTheMutexForSchedulerUpdate())); - VisitorSalomeSaveState vss(_p); + YACS::BASES::AutoLocker alck(&(exec->getTheMutexForSchedulerUpdate())); + VisitorSalomeSaveState vss(proc); vss.openFileDump(xmlSchemaFile); - _p->accept(&vss); + proc->accept(&vss); vss.closeFileDump(); } diff --git a/src/runtime/VisitorSalomeSaveState.hxx b/src/runtime/VisitorSalomeSaveState.hxx index a979f39a7..ceb4afd1d 100644 --- a/src/runtime/VisitorSalomeSaveState.hxx +++ b/src/runtime/VisitorSalomeSaveState.hxx @@ -36,16 +36,9 @@ namespace YACS virtual void visitForEachLoop(ForEachLoop *node); }; - class YACSLIBENGINE_EXPORT SchemaSaveState - { - public: - SchemaSaveState(Proc* proc, Executor* exec); - virtual ~SchemaSaveState(); - virtual void save(std::string xmlSchemaFile); - private: - Proc* _p; - Executor* _exec; - }; + YACSLIBENGINE_EXPORT void schemaSaveState(Proc* proc, + Executor* exec, + const std::string& xmlSchemaFile); } } #endif // VISITORSALOMESAVESTATE_HXX diff --git a/src/runtime_swig/SALOMERuntime.i b/src/runtime_swig/SALOMERuntime.i index c28691cd3..59ce1a3d0 100644 --- a/src/runtime_swig/SALOMERuntime.i +++ b/src/runtime_swig/SALOMERuntime.i @@ -140,12 +140,9 @@ namespace YACS { namespace ENGINE { - class SchemaSaveState - { - public: - SchemaSaveState(Proc* proc, Executor* exec); - virtual void save(std::string xmlSchemaFile); - }; + void schemaSaveState(Proc* proc, + Executor* exec, + const std::string& xmlSchemaFile); } } diff --git a/src/yacsloader_swig/Test/testSaveLoadRun.py b/src/yacsloader_swig/Test/testSaveLoadRun.py index 95c07735c..a4bc88c3a 100755 --- a/src/yacsloader_swig/Test/testSaveLoadRun.py +++ b/src/yacsloader_swig/Test/testSaveLoadRun.py @@ -1516,7 +1516,7 @@ o2=2*i1 myRun.start() import time time.sleep(5) - p.saveState(xmlStateFileName) + SALOMERuntime.schemaSaveState(p, ex, xmlStateFileName) a,b,c=n1.getPassedResults(ex) myRun.join() t0=datetime.now()-startt @@ -1547,6 +1547,39 @@ o2=5*i1 pass pass + def test22(self): + """Restart from a saved state in a foreach loop without using assignPassedResults. + This test uses the files test21.xml and saveState21.xml produced by test21. + """ + fname="test21.xml" + xmlStateFileName="saveState21.xml" + + ex=pilot.ExecutorSwig() + l=loader.YACSLoader() + q=l.load(fname) + q.getChildByName("n0").setScript("o0=[ 3*elt for elt in range(6) ]") + q.getChildByName("n1").getChildByName("n10").setScript(""" +import time +time.sleep(0.1) +print "execution n10:", i1 +o2=5*i1 +""") + q.getChildByName("n2").setScript(""" +print "execution n2:", i3 +o4=i3 +""") + loader.loadState(q, xmlStateFileName) + q.resetState(1) + q.exUpdateState() + # + ex.RunW(q,0,False) + # + self.assertEqual(q.getChildByName("n1").getState(),pilot.DONE) + self.assertEqual(q.getState(),pilot.DONE) + self.assertEqual(q.getChildByName("n2").getOutputPort("o4").getPyObj(),[0L,2L,10L,15L,20L,25L]) + pass + pass + if __name__ == '__main__': import os,sys U = os.getenv('USER') -- 2.30.2