Salome HOME
Copyright update 2022
[modules/yacs.git] / src / runtime / SalomeHPContainerTools.cxx
index 92d83d59abab7888da9b07cbbb38f58190ef45e3..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>
@@ -31,7 +33,7 @@ void SalomeHPContainerVectOfHelper::resize(std::size_t sz)
     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();
@@ -58,15 +60,51 @@ 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;
+}
+
+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
@@ -74,18 +112,29 @@ const SalomeContainerMonoHelper *SalomeHPContainerVectOfHelper::getHelperOfTask(
   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;
 }