]> SALOME platform Git repositories - modules/visu.git/commitdiff
Salome HOME
Fix memory leaks on study closing
authorvsr <vsr@opencascade.com>
Tue, 19 Apr 2011 13:20:21 +0000 (13:20 +0000)
committervsr <vsr@opencascade.com>
Tue, 19 Apr 2011 13:20:21 +0000 (13:20 +0000)
src/VISU_I/VISU_Gen_i.cc

index 15068b883ba57c0ced18614b11935fba07223156..051791faac6d36c7241ad0473f4a7633894c6a4a 100644 (file)
@@ -1550,9 +1550,24 @@ namespace VISU
   VISU_Gen_i
   ::Close(SALOMEDS::SComponent_ptr theComponent)
   {
-    if ( !CORBA::is_nil( myStudyDocument ) && !CORBA::is_nil( theComponent ) &&
-         myStudyDocument->StudyId() == theComponent->GetStudy()->StudyId())
-      myStudyDocument = SALOMEDS::Study::_nil();
+    if ( !CORBA::is_nil( theComponent ) ) {
+      SALOMEDS::Study_var aStudy = theComponent->GetStudy();
+      // 1. Decrement reference counter for published GenericObj-based servants
+      SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator( theComponent );
+      anIter->InitEx( true );
+      for ( ; anIter->More(); anIter->Next() ) {
+       SALOMEDS::SObject_var aSObject = anIter->Value();
+       if ( CORBA::is_nil( aSObject ) ) continue;
+       CORBA::Object_var anObject = aSObject->GetObject();
+       if ( CORBA::is_nil( anObject ) ) continue;
+       SALOME::GenericObj_var aGenericObj = SALOME::GenericObj::_narrow( anObject );
+       if ( !CORBA::is_nil( aGenericObj ) ) aGenericObj->UnRegister();
+      }
+      if ( !CORBA::is_nil( myStudyDocument ) && !CORBA::is_nil( aStudy ) && 
+          myStudyDocument->StudyId() == aStudy->StudyId() )
+       myStudyDocument = SALOMEDS::Study::_nil();
+    }
   }