#include "Exception.hxx"
#include <algorithm>
-#include <limits>
using namespace YACS::ENGINE;
return std::count(_whichOccupied.begin(),_whichOccupied.end(),false);
}
-std::size_t SalomeHPContainerVectOfHelper::getNumberOfFreePlaceAmong(const std::vector<std::size_t>& idsOfKernelContainers) const
-{
- std::size_t ret(0);
- for(std::vector<std::size_t>::const_iterator it=idsOfKernelContainers.begin();it!=idsOfKernelContainers.end();it++)
- if(!_whichOccupied[*it])
- ret++;
- return ret;
-}
-
void SalomeHPContainerVectOfHelper::allocateFor(const std::vector<const Task *>& nodes)
{
for(std::vector<const Task *>::const_iterator it=nodes.begin();it!=nodes.end();it++)
}
}
-void SalomeHPContainerVectOfHelper::allocateForAmong(const std::vector<std::size_t>& idsOfKernelContainers, const std::vector<const Task *>& nodes)
+void SalomeHPContainerVectOfHelper::allocateForCrude(const std::vector<std::pair<const Task *,std::size_t>>& nodes)
{
- for(std::vector<const Task *>::const_iterator it=nodes.begin();it!=nodes.end();it++)
+ for(auto it : nodes)
{
- if(!(*it))
- continue;
- if(_currentlyWorking.find(*it)!=_currentlyWorking.end())
- throw Exception("Searching 2 to allocate for a ServiceNode instance already declared as allocated !");
- std::size_t it2(std::numeric_limits<std::size_t>::max());
- for(std::vector<std::size_t>::const_iterator it=idsOfKernelContainers.begin();it!=idsOfKernelContainers.end();it++)
- if(!_whichOccupied[*it])
- {
- it2=*it;
- break;
- }
- if(it2==std::numeric_limits<std::size_t>::max())
- throw Exception("All 2 ressources are already occupied ! You are expected to wait for released resources !");
- _currentlyWorking[*it]=it2; _whichOccupied[it2]=true;
+ std::size_t workerId(it.second);
+ if(workerId>=size())
+ throw Exception("SalomeHPContainerVectOfHelper::allocateForCrude : Internal error ! WorkerId is greater or equal to size of HPCont !");
+ if(_whichOccupied[workerId])
+ throw Exception("SalomeHPContainerVectOfHelper::allocateForCrude : Mismatch between Playground info and HPContainer info !");
+ }
+ for(auto it : nodes)
+ {
+ const Task *task(it.first);
+ std::size_t workerId(it.second);
+ _currentlyWorking[task]=workerId;
+ _whichOccupied[workerId]=true;
}
}
-void SalomeHPContainerVectOfHelper::release(const Task *node)
+std::size_t SalomeHPContainerVectOfHelper::release(const Task *node)
{
if(!node)
- return ;
+ return std::numeric_limits<std::size_t>::max();
std::map< const Task *,std::size_t >::iterator it(_currentlyWorking.find(node));
if(it==_currentlyWorking.end())
throw Exception("Request to release a resource not declared as working !");
_whichOccupied[(*it).second]=false;
_currentlyWorking.erase(it);
+ return (*it).second;
}
std::size_t SalomeHPContainerVectOfHelper::locateTask(const Task *node) const
return ret;
}
-const SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTaskThreadSafe(const Task *node) const
+const SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTaskThreadSafe(const SalomeHPContainer *cont, const Task *node) const
{
- YACS::BASES::AutoLocker<SalomeHPContainerVectOfHelper> alck(const_cast<SalomeHPContainerVectOfHelper *>(this));
+ YACS::BASES::AutoLocker<Container> alck(const_cast<SalomeHPContainer *>(cont));
return _launchModeType[locateTask(node)];
}
return _launchModeType[locateTask(node)];
}
-SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTaskThreadSafe(const Task *node)
+SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTaskThreadSafe(SalomeHPContainer *cont, const Task *node)
{
- YACS::BASES::AutoLocker<SalomeHPContainerVectOfHelper> alck(this);
+ YACS::BASES::AutoLocker<Container> alck(cont);
return _launchModeType[locateTask(node)];
}
return _launchModeType[locateTask(node)];
}
-void SalomeHPContainerVectOfHelper::checkNoCurrentWork() const
-{
- for(std::map<const Task *,std::size_t >::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< YACS::BASES::AutoRefCnt<SalomeContainerMonoHelper> >::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 !");
-}
-
-void SalomeHPContainerVectOfHelper::checkPosInVec(std::size_t pos) const
-{
- if(pos<0 || pos>=_launchModeType.size())
- throw Exception("The task has been found, but its id is not in the correct range ! resize of of container size during run ?");
-}
-
-void SalomeHPContainerVectOfHelper::shutdown()
-{
- for(std::vector< BASES::AutoRefCnt<YACS::ENGINE::SalomeContainerMonoHelper> >::iterator it=_launchModeType.begin();it!=_launchModeType.end();it++)
- if((*it).isNotNull())
- if(!(*it)->isKernelContNull())
- (*it)->shutdown();
-}
-
-std::vector<std::string> SalomeHPContainerVectOfHelper::getKernelContainerNames() const
+std::vector<std::string> SalomeHPContainerVectOfHelper::getKernelContainerNames(const SalomeHPContainer *cont) const
{
std::vector<std::string> ret;
{
- YACS::BASES::AutoLocker<SalomeHPContainerVectOfHelper> alck(const_cast<SalomeHPContainerVectOfHelper *>(this));
+ YACS::BASES::AutoLocker<Container> alck(const_cast<SalomeHPContainer *>(cont));
std::size_t sz(_launchModeType.size());
ret.resize(sz);
for(std::size_t i=0;i<sz;i++)
return ret;
}
-void SalomeHPContainerVectOfHelper::lock()
+void SalomeHPContainerVectOfHelper::checkNoCurrentWork() const
{
- _mutex.lock();
+ for(std::map<const Task *,std::size_t >::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< YACS::BASES::AutoRefCnt<SalomeContainerMonoHelper> >::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 !");
}
-void SalomeHPContainerVectOfHelper::unLock()
+void SalomeHPContainerVectOfHelper::checkPosInVec(std::size_t pos) const
{
- _mutex.unLock();
+ if(pos<0 || pos>=_launchModeType.size())
+ throw Exception("The task has been found, but its id is not in the correct range ! resize of of container size during run ?");
}