Salome HOME
Copyright update 2022
[modules/yacs.git] / src / runtime / SalomeHPContainerTools.cxx
index 224e5fd7e0830c171858a140d1b0179cdbf88d26..4054e81ebe2c80c3c840a5e4a3e36308bf7ad1b2 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2006-2019  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
@@ -23,7 +23,6 @@
 #include "Exception.hxx"
 
 #include <algorithm>
-#include <limits>
 
 using namespace YACS::ENGINE;
 
@@ -45,15 +44,6 @@ std::size_t SalomeHPContainerVectOfHelper::getNumberOfFreePlace() const
   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;
-  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++)
@@ -70,36 +60,35 @@ void SalomeHPContainerVectOfHelper::allocateFor(const std::vector<const Task *>&
     }
 }
 
-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
@@ -112,9 +101,9 @@ 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)];
 }
 
@@ -123,9 +112,9 @@ const SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTask(
   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)];
 }
 
@@ -134,35 +123,11 @@ SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTask(const
   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++)
@@ -173,12 +138,18 @@ std::vector<std::string> SalomeHPContainerVectOfHelper::getKernelContainerNames(
   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 ?");
 }