Salome HOME
Copyright update 2022
[modules/yacs.git] / src / runtime / SalomeHPContainerTools.cxx
index 59e45fd5624148471884d615426c6189b3e77236..4054e81ebe2c80c3c840a5e4a3e36308bf7ad1b2 100644 (file)
@@ -1,4 +1,4 @@
-// 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
@@ -18,6 +18,8 @@
 //
 
 #include "SalomeHPContainerTools.hxx"
+#include "SalomeHPContainer.hxx"
+#include "AutoLocker.hxx"
 #include "Exception.hxx"
 
 #include <algorithm>
@@ -26,9 +28,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);
+  _launchModeType.resize(sz);
+  for(std::size_t i=oldSize;i<sz;i++)
+      _launchModeType[i]=new SalomeContainerMonoHelper;
   _currentlyWorking.clear();
 }
 
@@ -53,34 +60,81 @@ void SalomeHPContainerVectOfHelper::allocateFor(const std::vector<const Task *>&
     }
 }
 
-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;
 }
 
-const SalomeContainerMonoHelper& SalomeHPContainerVectOfHelper::getHelperOfTask(const Task *node) const
+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)];
 }
 
-SalomeContainerMonoHelper& SalomeHPContainerVectOfHelper::getHelperOfTask(const Task *node)
+const SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTask(const Task *node) const
 {
   return _launchModeType[locateTask(node)];
 }
 
-std::size_t SalomeHPContainerVectOfHelper::locateTask(const Task *node) const
+SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTaskThreadSafe(SalomeHPContainer *cont, const Task *node)
 {
-  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);
+  YACS::BASES::AutoLocker<Container> alck(cont);
+  return _launchModeType[locateTask(node)];
+}
+
+SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTask(const Task *node)
+{
+  return _launchModeType[locateTask(node)];
+}
+
+std::vector<std::string> SalomeHPContainerVectOfHelper::getKernelContainerNames(const SalomeHPContainer *cont) const
+{
+  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;
 }
 
@@ -89,8 +143,8 @@ 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<SalomeContainerMonoHelper>::const_iterator it=_launchModeType.begin();it!=_launchModeType.end();it++)
-    if((*it).isAlreadyStarted(0))
+  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 !");
 }