Salome HOME
0023366: [CEA 1972] Porting Salome to GCC 6
[modules/kernel.git] / src / Container / Container_i.cxx
index 18e51ac2081f67943448d1a19d428b9603770140..68373b289881b5a0bda0e0992352d05987b99b5a 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -254,10 +254,18 @@ Engines_Container_i::~Engines_Container_i()
     delete _id;
   if(_NS)
     delete _NS;
-  if(!CORBA::is_nil(_dftPyNode))
-    _dftPyNode->UnRegister();
-  if(!CORBA::is_nil(_dftPyScriptNode))
-    _dftPyScriptNode->UnRegister();
+  for(std::map<std::string,Engines::PyNode_var>::iterator it=_dftPyNode.begin();it!=_dftPyNode.end();it++)
+    {
+      Engines::PyNode_var tmpVar((*it).second);
+      if(!CORBA::is_nil(tmpVar))
+        tmpVar->UnRegister();
+    }
+  for(std::map<std::string,Engines::PyScriptNode_var>::iterator it=_dftPyScriptNode.begin();it!=_dftPyScriptNode.end();it++)
+    {
+      Engines::PyScriptNode_var tmpVar((*it).second);
+      if(!CORBA::is_nil(tmpVar))
+        tmpVar->UnRegister();
+    }
 }
 
 //=============================================================================
@@ -985,10 +993,11 @@ Engines_Container_i::create_python_service_instance(const char * CompName,
   const char *error;
   PyArg_ParseTuple(result,"ss", &ior, &error);
   reason = CORBA::string_dup(error);
+  char * _ior = CORBA::string_dup(ior);
   Py_DECREF(result);
   PyGILState_Release(gstate);
 
-  return CORBA::string_dup(ior);
+  return _ior;
 }
 
 
@@ -1040,10 +1049,10 @@ Engines_Container_i::createInstance(std::string genericRegisterName,
 
   if ( !Component_factory )
   {
-    INFOS( "Can't resolve symbol: " + factory_name );
+    MESSAGE( "Can't resolve symbol: " + factory_name );
 #ifndef WIN32
     reason=dlerror();
-    INFOS(reason);
+    MESSAGE(reason);
 #endif
     return Engines::EngineComponent::_nil() ;
   }
@@ -1629,10 +1638,10 @@ void Engines_Container_i::copyFile(Engines::Container_ptr container, const char*
       while (toFollow)
         {
           ctr++;
-          SCRUTE(ctr);
+          //SCRUTE(ctr);
           aBlock = fileTransfer->getBlock(fileId);
           toFollow = aBlock->length();
-          SCRUTE(toFollow);
+          //SCRUTE(toFollow);
           CORBA::Octet *buf = aBlock->get_buffer();
           fwrite(buf, sizeof(CORBA::Octet), toFollow, fp);
           delete aBlock;
@@ -1679,16 +1688,25 @@ Engines::PyNode_ptr Engines_Container_i::createPyNode(const char* nodeName, cons
     std::string astr=PyString_AsString(result);
     Py_DECREF(res);
     PyGILState_Release(gstate);
-
     if(ierr==0)
       {
-        CORBA::Object_var obj = _orb->string_to_object(astr.c_str());
-        node = Engines::PyNode::_narrow(obj);
-        if(!CORBA::is_nil(_dftPyNode))
-          _dftPyNode->UnRegister();
-        _dftPyNode = node;
-        if(!CORBA::is_nil(_dftPyNode))
-          _dftPyNode->Register();
+        Utils_Locker lck(&_mutexForDftPy);
+        CORBA::Object_var obj=_orb->string_to_object(astr.c_str());
+        node=Engines::PyNode::_narrow(obj);
+        std::map<std::string,Engines::PyNode_var>::iterator it(_dftPyNode.find(nodeName));
+        if(it==_dftPyNode.end())
+          {
+            _dftPyNode[nodeName]=node;
+          }
+        else
+          {
+            Engines::PyNode_var oldNode((*it).second);
+            if(!CORBA::is_nil(oldNode))
+              oldNode->UnRegister();
+            (*it).second=node;
+          }
+        if(!CORBA::is_nil(node))
+          node->Register();
         return node._retn();
       }
     else
@@ -1698,7 +1716,6 @@ Engines::PyNode_ptr Engines_Container_i::createPyNode(const char* nodeName, cons
         es.text = astr.c_str();
         throw SALOME::SALOME_Exception(es);
       }
-
 }
 
 //=============================================================================
@@ -1706,12 +1723,20 @@ Engines::PyNode_ptr Engines_Container_i::createPyNode(const char* nodeName, cons
  *
  */
 //=============================================================================
-Engines::PyNode_ptr  Engines_Container_i::getDefaultPyNode()
+Engines::PyNode_ptr  Engines_Container_i::getDefaultPyNode(const char *nodeName)
 {
-  if(!CORBA::is_nil(_dftPyNode))
-    return Engines::PyNode::_duplicate(_dftPyNode);
-  else
+  Utils_Locker lck(&_mutexForDftPy);
+  std::map<std::string,Engines::PyNode_var>::iterator it(_dftPyNode.find(nodeName));
+  if(it==_dftPyNode.end())
     return Engines::PyNode::_nil();
+  else
+    {
+      Engines::PyNode_var tmpVar((*it).second);
+      if(!CORBA::is_nil(tmpVar))
+        return Engines::PyNode::_duplicate(tmpVar);
+      else
+        return Engines::PyNode::_nil();
+    }
 }
 
 //=============================================================================
@@ -1749,13 +1774,23 @@ Engines::PyScriptNode_ptr Engines_Container_i::createPyScriptNode(const char* no
 
     if(ierr==0)
       {
-        CORBA::Object_var obj = _orb->string_to_object(astr.c_str());
-        node = Engines::PyScriptNode::_narrow(obj);
-        if(!CORBA::is_nil(_dftPyScriptNode))
-          _dftPyScriptNode->UnRegister();
-        _dftPyScriptNode = node;
-        if(!CORBA::is_nil(_dftPyScriptNode))
-          _dftPyScriptNode->Register();
+        Utils_Locker lck(&_mutexForDftPy);
+        CORBA::Object_var obj=_orb->string_to_object(astr.c_str());
+        node=Engines::PyScriptNode::_narrow(obj);
+        std::map<std::string,Engines::PyScriptNode_var>::iterator it(_dftPyScriptNode.find(nodeName));
+        if(it==_dftPyScriptNode.end())
+          {
+            _dftPyScriptNode[nodeName]=node;
+          }
+        else
+          {
+            Engines::PyScriptNode_var oldNode((*it).second);
+            if(!CORBA::is_nil(oldNode))
+              oldNode->UnRegister();
+            (*it).second=node;
+          }
+        if(!CORBA::is_nil(node))
+          node->Register();
         return node._retn();
       }
     else
@@ -1772,12 +1807,20 @@ Engines::PyScriptNode_ptr Engines_Container_i::createPyScriptNode(const char* no
  *
  */
 //=============================================================================
-Engines::PyScriptNode_ptr Engines_Container_i::getDefaultPyScriptNode()
+Engines::PyScriptNode_ptr Engines_Container_i::getDefaultPyScriptNode(const char *nodeName)
 {
-  if(!CORBA::is_nil(_dftPyScriptNode))
-    return Engines::PyScriptNode::_duplicate(_dftPyScriptNode);
-  else
+  Utils_Locker lck(&_mutexForDftPy);
+  std::map<std::string,Engines::PyScriptNode_var>::iterator it(_dftPyScriptNode.find(nodeName));
+  if(it==_dftPyScriptNode.end())
     return Engines::PyScriptNode::_nil();
+  else
+    {
+      Engines::PyScriptNode_var tmpVar((*it).second);
+      if(!CORBA::is_nil(tmpVar))
+        return Engines::PyScriptNode::_duplicate(tmpVar);
+      else
+        return Engines::PyScriptNode::_nil();
+    }
 }
 
 //=============================================================================