From dff523975d6234e5266e4d1c673ffb2cd12ee2b8 Mon Sep 17 00:00:00 2001 From: Anthony Geay Date: Mon, 4 Aug 2014 08:46:44 +0200 Subject: [PATCH] Fix memory corruption and refactor some points. --- src/bases/CMakeLists.txt | 1 + src/engine/Bloc.cxx | 4 ---- src/engine/Bloc.hxx | 1 - src/engine/ComponentInstance.cxx | 5 +++-- src/engine/ComponentInstance.hxx | 2 +- src/engine/Container.hxx | 1 + src/engine/Loop.cxx | 4 ---- src/engine/Loop.hxx | 1 - src/engine/StaticDefinedComposedNode.cxx | 4 ++++ src/engine/StaticDefinedComposedNode.hxx | 1 + src/engine/Switch.cxx | 4 ---- src/engine/Switch.hxx | 1 - src/engine/Test/ContainerTest.hxx | 2 ++ src/runtime/CppContainer.hxx | 1 + src/runtime/SalomeComponent.cxx | 23 +++++++++------------- src/runtime/SalomeComponent.hxx | 2 +- src/runtime/SalomeHPContainer.cxx | 25 ++++++++++++++---------- src/runtime/SalomeHPContainer.hxx | 3 +++ src/runtime/SalomeHPContainerTools.cxx | 13 ++++++++---- src/runtime/SalomeHPContainerTools.hxx | 14 +++++++------ 20 files changed, 59 insertions(+), 53 deletions(-) diff --git a/src/bases/CMakeLists.txt b/src/bases/CMakeLists.txt index 95bb14f9f..a2f3b380c 100644 --- a/src/bases/CMakeLists.txt +++ b/src/bases/CMakeLists.txt @@ -44,6 +44,7 @@ SET(YACSBases_HEADERS DynLibLoader.hxx DynLibLoaderWin.hxx Exception.hxx + AutoRefCnt.hxx Mutex.hxx MutexPT.hxx Semaphore.hxx diff --git a/src/engine/Bloc.cxx b/src/engine/Bloc.cxx index 422e39470..b12217dfb 100644 --- a/src/engine/Bloc.cxx +++ b/src/engine/Bloc.cxx @@ -229,10 +229,6 @@ Node *Bloc::getChildByShortName(const std::string& name) const throw(YACS::Excep throw Exception(what); } -void Bloc::selectRunnableTasks(std::vector& tasks) -{ -} - bool Bloc::areAllSubNodesDone() const { for(list::const_iterator iter=_setOfNode.begin();iter!=_setOfNode.end();iter++) diff --git a/src/engine/Bloc.hxx b/src/engine/Bloc.hxx index dce0ee485..98f2e0fc0 100644 --- a/src/engine/Bloc.hxx +++ b/src/engine/Bloc.hxx @@ -52,7 +52,6 @@ namespace YACS std::list getChildren() const { return _setOfNode; } std::list edGetDirectDescendants() const { return _setOfNode; } Node *getChildByShortName(const std::string& name) const throw(Exception); - void selectRunnableTasks(std::vector& tasks); virtual void writeDot(std::ostream &os) const; void accept(Visitor *visitor); template diff --git a/src/engine/ComponentInstance.cxx b/src/engine/ComponentInstance.cxx index ff83a2e58..c8f845724 100644 --- a/src/engine/ComponentInstance.cxx +++ b/src/engine/ComponentInstance.cxx @@ -49,9 +49,9 @@ int ComponentInstance::_total = 0; const char ComponentInstance::NULL_FILE_REPR[]="No repr specified for ComponentInstance"; -void ComponentInstance::setContainer(Container *cont) +bool ComponentInstance::setContainer(Container *cont) { - if (cont == _container) return; + if (cont == _container) return false; if(cont) cont->checkCapabilityToDealWith(this); @@ -60,6 +60,7 @@ void ComponentInstance::setContainer(Container *cont) _container=cont; if(_container) _container->incrRef(); + return true; } ComponentInstance::ComponentInstance(const std::string& name):_compoName(name),_isAttachedOnCloning(false),_container(0),_anonymous(true) diff --git a/src/engine/ComponentInstance.hxx b/src/engine/ComponentInstance.hxx index f76ff3019..8f593af62 100644 --- a/src/engine/ComponentInstance.hxx +++ b/src/engine/ComponentInstance.hxx @@ -48,7 +48,7 @@ namespace YACS virtual void setAnonymous(bool anon) { _anonymous = anon; }; virtual bool isAnonymous() { return _anonymous; }; int getNumId() const { return _numId; } - virtual void setContainer(Container *cont); + virtual bool setContainer(Container *cont); Container *getContainer() const { return _container; } //! Load the component instance virtual void load(Task *askingNode) = 0; diff --git a/src/engine/Container.hxx b/src/engine/Container.hxx index 1a7c2aed2..6c8b8ed17 100644 --- a/src/engine/Container.hxx +++ b/src/engine/Container.hxx @@ -65,6 +65,7 @@ namespace YACS virtual void setProperty(const std::string& name,const std::string& value) = 0; virtual std::string getProperty(const std::string& name) const = 0; virtual void clearProperties() = 0; + virtual void addComponentName(const std::string& name) = 0; virtual std::map getProperties() const = 0; virtual std::map getResourceProperties(const std::string& name) const = 0; virtual void setProperties(const std::map& properties); diff --git a/src/engine/Loop.cxx b/src/engine/Loop.cxx index bf56f7789..0ea4a1c1c 100644 --- a/src/engine/Loop.cxx +++ b/src/engine/Loop.cxx @@ -392,10 +392,6 @@ void Loop::edRemoveChild(Node *node) throw(YACS::Exception) modified(); } -void Loop::selectRunnableTasks(std::vector& tasks) -{ -} - std::list Loop::edGetDirectDescendants() const { list ret; diff --git a/src/engine/Loop.hxx b/src/engine/Loop.hxx index 395cca0a4..f5558552e 100644 --- a/src/engine/Loop.hxx +++ b/src/engine/Loop.hxx @@ -169,7 +169,6 @@ namespace YACS void getReadyTasks(std::vector& tasks); void edRemoveChild(Node *node) throw(Exception); bool isRepeatedUnpredictablySeveralTimes() const { return true; } - void selectRunnableTasks(std::vector& tasks); std::list edGetDirectDescendants() const; std::list getSetOfInputPort() const; int getNumberOfInputPorts() const; diff --git a/src/engine/StaticDefinedComposedNode.cxx b/src/engine/StaticDefinedComposedNode.cxx index b460cfd4e..504b5cd79 100644 --- a/src/engine/StaticDefinedComposedNode.cxx +++ b/src/engine/StaticDefinedComposedNode.cxx @@ -48,6 +48,10 @@ void StaticDefinedComposedNode::forceMultiplicity(unsigned value) //no sense for this class } +void StaticDefinedComposedNode::selectRunnableTasks(std::vector& tasks) +{ +} + void StaticDefinedComposedNode::checkControlDependancy(OutPort *start, InPort *end, bool cross, std::map < ComposedNode *, std::list < OutPort * >, SortHierarc >& fw, std::vector& fwCross, diff --git a/src/engine/StaticDefinedComposedNode.hxx b/src/engine/StaticDefinedComposedNode.hxx index 03c8ac512..f1b0100e6 100644 --- a/src/engine/StaticDefinedComposedNode.hxx +++ b/src/engine/StaticDefinedComposedNode.hxx @@ -40,6 +40,7 @@ namespace YACS bool isPlacementPredictableB4Run() const; bool isMultiplicitySpecified(unsigned& value) const; void forceMultiplicity(unsigned value); + void selectRunnableTasks(std::vector& tasks); protected: void checkControlDependancy(OutPort *start, InPort *end, bool cross, std::map < ComposedNode *, std::list < OutPort * >, SortHierarc >& fw, diff --git a/src/engine/Switch.cxx b/src/engine/Switch.cxx index 93323cafd..947473706 100644 --- a/src/engine/Switch.cxx +++ b/src/engine/Switch.cxx @@ -386,10 +386,6 @@ void Switch::getReadyTasks(std::vector& tasks) } } -void Switch::selectRunnableTasks(std::vector& tasks) -{ -} - list Switch::edGetDirectDescendants() const { list ret; diff --git a/src/engine/Switch.hxx b/src/engine/Switch.hxx index bc4b7460e..5d0ccb717 100644 --- a/src/engine/Switch.hxx +++ b/src/engine/Switch.hxx @@ -111,7 +111,6 @@ namespace YACS virtual bool edAddChild(Node *DISOWNnode) throw(Exception); int getMaxCase(); void getReadyTasks(std::vector& tasks); - void selectRunnableTasks(std::vector& tasks); std::list edGetDirectDescendants() const; InputPort *edGetConditionPort() { return &_condition; } void writeDot(std::ostream &os) const; diff --git a/src/engine/Test/ContainerTest.hxx b/src/engine/Test/ContainerTest.hxx index bfd49a872..d530fb5a3 100644 --- a/src/engine/Test/ContainerTest.hxx +++ b/src/engine/Test/ContainerTest.hxx @@ -40,6 +40,7 @@ namespace YACS void lock() { } void unLock() { } void clearProperties() { } + void addComponentName(const std::string& name) { } void shutdown(int level) { } void setProperty(const std::string& name,const std::string& value) { } std::string getProperty(const std::string& name) const { } @@ -71,6 +72,7 @@ namespace YACS void lock() { } void unLock() { } void clearProperties() { } + void addComponentName(const std::string& name) { } void shutdown(int level) { } void setProperty(const std::string& name,const std::string& value) { } std::string getProperty(const std::string& name) const { } diff --git a/src/runtime/CppContainer.hxx b/src/runtime/CppContainer.hxx index 03ee0eb8e..0f338f3ea 100644 --- a/src/runtime/CppContainer.hxx +++ b/src/runtime/CppContainer.hxx @@ -127,6 +127,7 @@ namespace YACS void setProperty(const std::string& name,const std::string& value) { } std::string getProperty(const std::string& name) const { return std::string(); } void clearProperties() { } + void addComponentName(const std::string& name) { } std::map getProperties() const { return std::map(); } std::map getResourceProperties(const std::string& name) const { return std::map(); } // diff --git a/src/runtime/SalomeComponent.cxx b/src/runtime/SalomeComponent.cxx index 2a53981c5..b991f3846 100644 --- a/src/runtime/SalomeComponent.cxx +++ b/src/runtime/SalomeComponent.cxx @@ -133,21 +133,16 @@ std::string SalomeComponent::getFileRepr() const return stream.str(); } -void SalomeComponent::setContainer(Container *cont) +bool SalomeComponent::setContainer(Container *cont) { - if (cont == _container) return; - - if(cont) - cont->checkCapabilityToDealWith(this); - - if(_container) - _container->decrRef(); - _container=cont; - if(_container) - { - _container->incrRef(); - ((SalomeContainer*)_container)->addComponentName(_compoName); - } + if(ComponentInstance::setContainer(cont)) + { + if(_container) + _container->addComponentName(_compoName); + return true; + } + else + return false; } void SalomeComponent::shutdown(int level) diff --git a/src/runtime/SalomeComponent.hxx b/src/runtime/SalomeComponent.hxx index 743b5afcb..267cd07be 100644 --- a/src/runtime/SalomeComponent.hxx +++ b/src/runtime/SalomeComponent.hxx @@ -41,7 +41,7 @@ namespace YACS virtual void load(Task *askingNode); virtual void unload(Task *askingNode); virtual bool isLoaded(Task *askingNode) const; - virtual void setContainer(Container *cont); + virtual bool setContainer(Container *cont); virtual ServiceNode* createNode(const std::string& name); virtual ComponentInstance* clone() const; virtual std::string getFileRepr() const; diff --git a/src/runtime/SalomeHPContainer.cxx b/src/runtime/SalomeHPContainer.cxx index 91c9f9d60..cdc45e695 100644 --- a/src/runtime/SalomeHPContainer.cxx +++ b/src/runtime/SalomeHPContainer.cxx @@ -70,14 +70,14 @@ void SalomeHPContainer::unLock() bool SalomeHPContainer::isAlreadyStarted(const Task *askingNode) const { - const SalomeContainerMonoHelper& helper(_launchModeType.getHelperOfTask(askingNode)); - return helper.isAlreadyStarted(askingNode); + const SalomeContainerMonoHelper *helper(_launchModeType.getHelperOfTask(askingNode)); + return helper->isAlreadyStarted(askingNode); } void SalomeHPContainer::start(const Task *askingNode) throw(Exception) { - SalomeContainerMonoHelper& helper(_launchModeType.getHelperOfTask(askingNode)); - SalomeContainerTools::Start(_componentNames,&helper,_sct,_shutdownLevel,this,askingNode); + SalomeContainerMonoHelper *helper(_launchModeType.getHelperOfTask(askingNode)); + SalomeContainerTools::Start(_componentNames,helper,_sct,_shutdownLevel,this,askingNode); } void SalomeHPContainer::shutdown(int level) @@ -87,21 +87,21 @@ void SalomeHPContainer::shutdown(int level) _shutdownLevel=999; for(std::size_t i=0;_launchModeType.size();i++) { - SalomeContainerMonoHelper& helper(_launchModeType.at(i)); - helper.shutdown(); + SalomeContainerMonoHelper *helper(_launchModeType.at(i)); + helper->shutdown(); } } std::string SalomeHPContainer::getPlacementId(const Task *askingNode) const { - const SalomeContainerMonoHelper& helper(_launchModeType.getHelperOfTask(askingNode)); - return SalomeContainerTools::GetPlacementId(&helper,this,askingNode); + const SalomeContainerMonoHelper *helper(_launchModeType.getHelperOfTask(askingNode)); + return SalomeContainerTools::GetPlacementId(helper,this,askingNode); } std::string SalomeHPContainer::getFullPlacementId(const Task *askingNode) const { - const SalomeContainerMonoHelper& helper(_launchModeType.getHelperOfTask(askingNode)); - return SalomeContainerTools::GetFullPlacementId(&helper,this,askingNode); + const SalomeContainerMonoHelper *helper(_launchModeType.getHelperOfTask(askingNode)); + return SalomeContainerTools::GetFullPlacementId(helper,this,askingNode); } /*! @@ -133,6 +133,11 @@ void SalomeHPContainer::clearProperties() _sct.clearProperties(); } +void SalomeHPContainer::addComponentName(const std::string& name) +{ + _componentNames.push_back(name); +} + std::map SalomeHPContainer::getProperties() const { return _sct.getProperties(); diff --git a/src/runtime/SalomeHPContainer.hxx b/src/runtime/SalomeHPContainer.hxx index 28e8f563c..04457e08c 100644 --- a/src/runtime/SalomeHPContainer.hxx +++ b/src/runtime/SalomeHPContainer.hxx @@ -65,9 +65,12 @@ namespace YACS void setProperty(const std::string& name,const std::string& value); std::string getProperty(const std::string& name) const; void clearProperties(); + void addComponentName(const std::string& name); std::map getProperties() const; std::map getResourceProperties(const std::string& name) const; void checkCapabilityToDealWith(const ComponentInstance *inst) const throw(YACS::Exception); + // + YACS::BASES::Mutex& getLocker() { return _mutex; } public: static const char KIND[]; protected: diff --git a/src/runtime/SalomeHPContainerTools.cxx b/src/runtime/SalomeHPContainerTools.cxx index 59e45fd56..552aa1368 100644 --- a/src/runtime/SalomeHPContainerTools.cxx +++ b/src/runtime/SalomeHPContainerTools.cxx @@ -26,9 +26,14 @@ using namespace YACS::ENGINE; void SalomeHPContainerVectOfHelper::resize(std::size_t sz) { + std::size_t oldSize(_launchModeType.size()); + if(sz==oldSize) + return; checkNoCurrentWork(); _whichOccupied.resize(sz); std::fill(_whichOccupied.begin(),_whichOccupied.end(),false); _launchModeType.clear(); _launchModeType.resize(sz); + for(std::size_t i=oldSize;i::const_iterator it=_currentlyWorking.begin();it!=_currentlyWorking.end();it++) if((*it).first) throw Exception("Something wrong a node is still declared to be using the ressource !"); - for(std::vector::const_iterator it=_launchModeType.begin();it!=_launchModeType.end();it++) - if((*it).isAlreadyStarted(0)) + for(std::vector< YACS::BASES::AutoCppPtr >::const_iterator it=_launchModeType.begin();it!=_launchModeType.end();it++) + if((*it)->isAlreadyStarted(0)) throw Exception("Some of the containers have be started ! Please shutdown them before !"); } diff --git a/src/runtime/SalomeHPContainerTools.hxx b/src/runtime/SalomeHPContainerTools.hxx index c052cbe5a..1a1565cb0 100644 --- a/src/runtime/SalomeHPContainerTools.hxx +++ b/src/runtime/SalomeHPContainerTools.hxx @@ -23,6 +23,8 @@ #include "YACSRuntimeSALOMEExport.hxx" #include "SalomeContainerHelper.hxx" +#include "AutoRefCnt.hxx" + #include #include @@ -32,7 +34,7 @@ namespace YACS { class Task; class SalomeComponent; - + class SalomeContainerMonoHelper; class SalomeHPContainerVectOfHelper { public: @@ -41,17 +43,17 @@ namespace YACS std::size_t getNumberOfFreePlace() const; void allocateFor(const std::vector& nodes); void release(const Task *node); - const SalomeContainerMonoHelper& at(std::size_t pos) const { checkPosInVec(pos); return _launchModeType[pos]; } - SalomeContainerMonoHelper& at(std::size_t pos) { checkPosInVec(pos); return _launchModeType[pos]; } - const SalomeContainerMonoHelper& getHelperOfTask(const Task *node) const; - SalomeContainerMonoHelper& getHelperOfTask(const Task *node); + const SalomeContainerMonoHelper *at(std::size_t pos) const { checkPosInVec(pos); return _launchModeType[pos]; } + SalomeContainerMonoHelper *at(std::size_t pos) { checkPosInVec(pos); return _launchModeType[pos]; } + const SalomeContainerMonoHelper *getHelperOfTask(const Task *node) const; + SalomeContainerMonoHelper *getHelperOfTask(const Task *node); private: std::size_t locateTask(const Task *node) const; void checkNoCurrentWork() const; void checkPosInVec(std::size_t pos) const; private: std::vector _whichOccupied; - std::vector _launchModeType; + std::vector< BASES::AutoCppPtr > _launchModeType; std::map _currentlyWorking; }; } -- 2.39.2