-// Copyright (C) 2006-2014 CEA/DEN, EDF R&D
+// Copyright (C) 2006-2022 CEA/DEN, EDF R&D
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
//
#include "SalomeHPContainerTools.hxx"
+#include "SalomeHPContainer.hxx"
+#include "AutoLocker.hxx"
#include "Exception.hxx"
#include <algorithm>
return;
checkNoCurrentWork();
_whichOccupied.resize(sz); std::fill(_whichOccupied.begin(),_whichOccupied.end(),false);
- _launchModeType.clear(); _launchModeType.resize(sz);
+ _launchModeType.resize(sz);
for(std::size_t i=oldSize;i<sz;i++)
_launchModeType[i]=new SalomeContainerMonoHelper;
_currentlyWorking.clear();
}
}
-void SalomeHPContainerVectOfHelper::release(const Task *node)
+void SalomeHPContainerVectOfHelper::allocateForCrude(const std::vector<std::pair<const Task *,std::size_t>>& nodes)
+{
+ for(auto it : nodes)
+ {
+ 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;
+ }
+}
+
+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
+{
+ std::map< const Task *,std::size_t >::const_iterator it(_currentlyWorking.find(node));
+ if(it==_currentlyWorking.end())
+ throw Exception("current Node to be located is not marked as launched !");
+ std::size_t ret((*it).second);
+ checkPosInVec(ret);
+ return ret;
+}
+
+const SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTaskThreadSafe(const SalomeHPContainer *cont, const Task *node) const
+{
+ YACS::BASES::AutoLocker<Container> alck(const_cast<SalomeHPContainer *>(cont));
+ return _launchModeType[locateTask(node)];
}
const SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTask(const Task *node) const
return _launchModeType[locateTask(node)];
}
+SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTaskThreadSafe(SalomeHPContainer *cont, const Task *node)
+{
+ YACS::BASES::AutoLocker<Container> alck(cont);
+ return _launchModeType[locateTask(node)];
+}
+
SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTask(const Task *node)
{
return _launchModeType[locateTask(node)];
}
-std::size_t SalomeHPContainerVectOfHelper::locateTask(const Task *node) const
+std::vector<std::string> SalomeHPContainerVectOfHelper::getKernelContainerNames(const SalomeHPContainer *cont) const
{
- std::map< const Task *,std::size_t >::const_iterator it(_currentlyWorking.find(node));
- if(it==_currentlyWorking.end())
- throw Exception("current Node to be located is not marked as launched !");
- std::size_t ret((*it).second);
- checkPosInVec(ret);
+ std::vector<std::string> ret;
+ {
+ 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++)
+ {
+ ret[i]=_launchModeType[i]->getKernelContainerName();
+ }
+ }
return ret;
}