]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
CCAR: remove memory leak and update from BR_Dev_For_4_0 branch
authorcaremoli <caremoli>
Wed, 16 Jan 2008 08:05:36 +0000 (08:05 +0000)
committercaremoli <caremoli>
Wed, 16 Jan 2008 08:05:36 +0000 (08:05 +0000)
src/Container/Component_i.cxx
src/Container/Container_i.cxx
src/Container/SALOME_ComponentPy.py
src/Container/SALOME_Component_i.hxx
src/Container/SALOME_Container.cxx
src/Container/SALOME_Container.py
src/Container/SALOME_ContainerManager.cxx
src/Container/SALOME_ContainerManager.hxx
src/Container/SALOME_Container_i.hxx
src/Container/Salome_file_i.cxx
src/Container/Salome_file_i.hxx

index af8380f8cc3da85ea1e19598c4dcfc0ca7847915..cdbef093f044b1f50fde72b2ff7e8e2131047e6c 100644 (file)
@@ -241,7 +241,6 @@ void Engines_Component_i::destroy()
   delete _myConnexionToRegistry;
   _myConnexionToRegistry = 0 ;
   _poa->deactivate_object(*_id) ;
-  CORBA::release(_poa) ;
   delete(_id) ;
   //SCRUTE(pd_refCount);
   _thisObj->_remove_ref();
@@ -259,7 +258,7 @@ void Engines_Component_i::destroy()
 Engines::Container_ptr Engines_Component_i::GetContainerRef()
 {
   //  MESSAGE("Engines_Component_i::GetContainerRef");
-  CORBA::Object_ptr o = _poa->id_to_reference(*_contId) ;
+  CORBA::Object_var o = _poa->id_to_reference(*_contId) ;
   return Engines::Container::_narrow(o);
 }
 
@@ -851,7 +850,7 @@ void Engines_Component_i::CancelThread()
 void Engines_Component_i::sendMessage(const char *event_type,
                                      const char *message)
 {
-    _notifSupplier->Send(graphName(), nodeName(), event_type, message);
+    _notifSupplier->Send(_graphName.c_str(), _nodeName.c_str(), event_type, message);
 }
 
 //=============================================================================
index 61d3e2a61170cdb2b105b3f2a485773ee9efd512..2f5692fdc3e5f59b4cffab18cf40c1688987faa7 100644 (file)
@@ -103,7 +103,7 @@ Engines_Container_i::Engines_Container_i () :
 //=============================================================================
 
 Engines_Container_i::Engines_Container_i (CORBA::ORB_ptr orb, 
-                                          PortableServer::POA_var poa,
+                                          PortableServer::POA_ptr poa,
                                           char *containerName ,
                                           int argc , char* argv[],
                                           bool activAndRegist,
@@ -161,10 +161,11 @@ Engines_Container_i::Engines_Container_i (CORBA::ORB_ptr orb,
     {
       _id = _poa->activate_object(this);
       _NS = new SALOME_NamingService();
-      _NS->init_orb( CORBA::ORB::_duplicate(_orb) ) ;
+      _NS->init_orb( _orb ) ;
       CORBA::Object_var obj=_poa->id_to_reference(*_id);
       Engines::Container_var pCont 
         = Engines::Container::_narrow(obj);
+      _remove_ref();
 
       _containerName = _NS->BuildContainerNameForNS(containerName,
                                                     hostname.c_str());
@@ -209,7 +210,9 @@ Engines_Container_i::Engines_Container_i (CORBA::ORB_ptr orb,
         }
 
       fileTransfer_i* aFileTransfer = new fileTransfer_i();
-      _fileTransfer = Engines::fileTransfer::_narrow(aFileTransfer->_this());
+      CORBA::Object_var obref=aFileTransfer->_this();
+      _fileTransfer = Engines::fileTransfer::_narrow(obref);
+      aFileTransfer->_remove_ref();
     }
 }
 
@@ -223,6 +226,8 @@ Engines_Container_i::~Engines_Container_i()
 {
   MESSAGE("Container_i::~Container_i()");
   delete _id;
+  if(_NS)
+    delete _NS;
 }
 
 //=============================================================================
@@ -298,8 +303,6 @@ void Engines_Container_i::Shutdown()
   if(_isServantAloneInProcess)
     {
       MESSAGE("Effective Shutdown of container Begins...");
-      LocalTraceBufferPool* bp1 = LocalTraceBufferPool::instance();
-      bp1->deleteInstance(bp1);
       if(!CORBA::is_nil(_orb))
        _orb->shutdown(0);
     }
@@ -455,6 +458,7 @@ Engines_Container_i::create_component_instance(const char*genericRegisterName,
                                              instanceName.c_str(),
                                              studyId);
       string iors = PyString_AsString(result);
+      Py_DECREF(result);
       SCRUTE(iors);
       Py_RELEASE_NEW_THREAD;
   
@@ -462,6 +466,7 @@ Engines_Container_i::create_component_instance(const char*genericRegisterName,
       {
         CORBA::Object_var obj = _orb->string_to_object(iors.c_str());
         iobject = Engines::Component::_narrow( obj ) ;
+        _listInstances_map[instanceName] = iobject;
       }
       return iobject._retn();
     }
@@ -904,6 +909,8 @@ Engines_Container_i::createInstance(string genericRegisterName,
 
 void Engines_Container_i::decInstanceCnt(string genericRegisterName)
 {
+  if(_cntInstances_map.count(genericRegisterName)==0)
+    return;
   string aGenRegisterName =genericRegisterName;
   MESSAGE("Engines_Container_i::decInstanceCnt " << aGenRegisterName);
   ASSERT(_cntInstances_map[aGenRegisterName] > 0); 
index 8a3d80d41e6ca7b3edb6af0d7a33164c57dfc39d..5d071b8e422c38e44b653047edade3c9f2911ef1 100755 (executable)
@@ -83,7 +83,9 @@ class SALOME_ComponentPy_i (Engines__POA.Component):
         myMachine=getShortHostName()
         Component_path = self._containerName + "/" + self._instanceName
         MESSAGE(  'SALOME_ComponentPy_i Register' + str( Component_path ) )
-        naming_service.Register(self._this(), Component_path)
+        id_o = poa.activate_object(self)
+        compo_o = poa.id_to_reference(id_o)
+        naming_service.Register(compo_o, Component_path)
 
         # Add componentinstance to registry
         obj = naming_service.Resolve('/Registry')
@@ -145,8 +147,8 @@ class SALOME_ComponentPy_i (Engines__POA.Component):
 
     def destroy(self):
         MESSAGE(  "SALOME_ComponentPy_i::destroy" )
-        self._poa.deactivate_object(self)
-        CORBA.release(self._poa)
+        id = self._poa.servant_to_id(self)
+        self._poa.deactivate_object(id)
         
     #-------------------------------------------------------------------------
 
index de8a42e0ee3116b6d9c5245114cbe77acec595c1..9e3ee13839e0124fec946027ae525481b03056f2 100644 (file)
@@ -142,8 +142,8 @@ protected:
   std::string _instanceName ;
   std::string _interfaceName ;
 
-  CORBA::ORB_ptr _orb;
-  PortableServer::POA_ptr _poa;
+  CORBA::ORB_var _orb;
+  PortableServer::POA_var _poa;
   PortableServer::ObjectId * _id;
   PortableServer::ObjectId * _contId;
   Engines_Component_i * _thisObj ;
index 9a8cf992bb9cfe7686ca6c8f27c2220ed04b9ec0..489ed355f1f9ad715d77cd1189252f7d2994207e 100644 (file)
@@ -126,11 +126,15 @@ int main(int argc, char* argv[])
 
   // Initialise the ORB.
   //SRN: BugID: IPAL9541, it's necessary to set a size of one message to be at least 100Mb
-  //CORBA::ORB_var orb = CORBA::ORB_init( argc , argv ) ;
+  //There is no need to use a singleton as ORB_init returns a ref counted singleton 
+  //The only difference is on delete : no automatic call to destroy
+  //But it's in general too late in exit
+  CORBA::ORB_var orb = CORBA::ORB_init( argc , argv ) ;
+  /*
   ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
   ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting());
   CORBA::ORB_ptr orb = init(argc , argv ) ;
-         
+  */
   //  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
   INFOS_COMPILATION;
   BEGIN_OF(argv[0]);
@@ -168,9 +172,9 @@ int main(int argc, char* argv[])
 
       // add new container to the kill list
 #ifndef WNT
-      ostrstream aCommand ;
+      stringstream aCommand ;
       aCommand << "addToKillList.py " << getpid() << " SALOME_Container" << ends ;
-      system(aCommand.str());
+      system(aCommand.str().c_str());
 #endif
       
       Engines_Container_i * myContainer 
@@ -186,7 +190,10 @@ int main(int argc, char* argv[])
 #endif
 
       HandleServerSideSignals(orb);
-      
+
+      PyGILState_STATE gstate = PyGILState_Ensure();
+      //Delete python container that destroy orb from python (pyCont._orb.destroy())
+      Py_Finalize();
     }
   catch(CORBA::SystemException&)
     {
index 362f077e4bab01dc3e7ca28c5668fa5a64d42e29..d73c3b7f95f4639dbc90d36f3727a06f11598019 100644 (file)
@@ -68,6 +68,10 @@ class SALOME_Container_i:
 
     #-------------------------------------------------------------------------
 
+    def __del__(self ):
+      print "SALOME_Container_i.__del__"
+      self._orb.destroy()
+
     def import_component(self, componentName):
         MESSAGE( "SALOME_Container_i::import_component" )
         ret=0
index e8465c7af03f2a0781dd6e3fb5eb45e0227451b8..ec691459dcdea991f22da8003de38abc7628584c 100644 (file)
@@ -102,23 +102,8 @@ void SALOME_ContainerManager::Shutdown()
   _NS->Destroy_Name(_ContainerManagerNameInNS);
   PortableServer::ObjectId_var oid = _poa->servant_to_id(this);
   _poa->deactivate_object(oid);
-  _remove_ref();
-}
-
-//=============================================================================
-/*! CORBA method:
- *  shutdown the ContainerManager servant and kill the ContainerManager process
- */
-//=============================================================================
-void SALOME_ContainerManager::ShutdownWithExit()
-{
-  MESSAGE("ShutdownWithExit");
-  if(!CORBA::is_nil(_orb))
-    {
-      _orb->shutdown(0);
-    }
-
-  //exit( EXIT_SUCCESS );
+  //_remove_ref() has already been done at creation
+  //_remove_ref();
 }
 
 //=============================================================================
@@ -151,25 +136,32 @@ void SALOME_ContainerManager::ShutdownContainers()
       SCRUTE((*iter));
       CORBA::Object_var obj=_NS->Resolve((*iter).c_str());
       Engines::Container_var cont=Engines::Container::_narrow(obj);
-      if(!CORBA::is_nil(cont)){
-       MESSAGE("ShutdownContainers: " << (*iter));
-       cont->Shutdown();
-      }
-      else MESSAGE("ShutdownContainers: no container ref for " << (*iter));
+      if(!CORBA::is_nil(cont))
+        {
+         MESSAGE("ShutdownContainers: " << (*iter));
+          try
+            {
+              cont->Shutdown();
+            }
+          catch(CORBA::SystemException& e)
+            {
+              INFOS("CORBA::SystemException ignored : " << e);
+            }
+          catch(CORBA::Exception&)
+            {
+              INFOS("CORBA::Exception ignored.");
+            }
+          catch(...)
+            {
+              INFOS("Unknown exception ignored.");
+            }
+        }
+      else 
+        MESSAGE("ShutdownContainers: no container ref for " << (*iter));
     }
   }
 }
 
-//=============================================================================
-/*! CORBA Method:
- *  Returns the PID of the container manager
- */
-//=============================================================================
-CORBA::Long SALOME_ContainerManager::getPID()
-{
-  return (CORBA::Long)getpid();
-}
-
 //=============================================================================
 /*! CORBA Method:
  *  Find a suitable Container in a list of machines, or start one
index b3485ab63bb1814a42bc88d0de8b354795a6816a..34888f98c7216ec9dc44cde6acf2684f796c5f3a 100644 (file)
@@ -60,11 +60,8 @@ public:
                const Engines::CompoList& componentList);
 
   void Shutdown();
-  void ShutdownWithExit();
   void ShutdownContainers();
 
-  CORBA::Long getPID();
-
   static const char *_ContainerManagerNameInNS;
 
   // Parallel extension
index 03c27e0d5b0bb6d642ae04b3394504cce458ecb2..f39a54c4b4608fb08f767b626efe7c5c93c77619 100644 (file)
@@ -54,7 +54,7 @@ class CONTAINER_EXPORT Engines_Container_i:
 public:
   Engines_Container_i();
   Engines_Container_i(CORBA::ORB_ptr orb, 
-                     PortableServer::POA_var poa,
+                     PortableServer::POA_ptr poa,
                      char * containerName ,
                       int argc, char* argv[],
                      bool activAndRegist = true,
index 8f10ad2cfb295a9f427d4435dfdfd44f89ff9791..a098c06f95707253605a0f90d4e6810891ec9f07 100644 (file)
@@ -842,6 +842,7 @@ Salome_file_i::getDistributedFile(std::string file_name)
       CORBA::Octet *buf = aBlock->get_buffer();
       int nbWri = fwrite(buf, sizeof(CORBA::Octet), toFollow, fp);
       ASSERT(nbWri == toFollow);
+      delete aBlock;
     }
     fclose(fp);
     MESSAGE("end of transfer of " << comp_file_name);
index 16b09034eb8435c124fc177f99da01c829d5d775..b1337871fef2a5bc2e71b8ddae0ee06757fab3d8 100644 (file)
@@ -100,7 +100,7 @@ class CONTAINER_EXPORT Salome_file_i:
     _t_fileDistributedSource _fileDistributedSource;
     Engines::SfState _state;
     Engines::Container_ptr _container;
-    Engines::Salome_file_ptr _default_source_Salome_file;
+    Engines::Salome_file_var _default_source_Salome_file;
 };
 
 #endif