Salome HOME
Regression: mesh objects are not deleted => memory leaks
authoreap <eap@opencascade.com>
Fri, 31 Aug 2018 12:35:57 +0000 (15:35 +0300)
committereap <eap@opencascade.com>
Fri, 31 Aug 2018 12:35:57 +0000 (15:35 +0300)
src/SMESH/SMESH_subMesh.cxx
src/SMESH_I/SMESH_Gen_i_1.cxx
src/SMESH_SWIG/YACS_geomesh0.py
src/StdMeshers/StdMeshers_Quadrangle_2D.cxx

index 57d0d338df5cd790b315ef4e456dcedae0a77b18..a3b12c77e5da711defef4ca81fc533a19f275ea2 100644 (file)
@@ -2592,14 +2592,13 @@ const std::vector< SMESH_subMesh * > & SMESH_subMesh::GetAncestors() const
     SMESH_subMesh* me = const_cast< SMESH_subMesh* >( this );
     me->_ancestors.reserve( ancShapes.Extent() );
 
-    TopTools_MapOfShape map;
-
     // assure that all sub-meshes exist
     TopoDS_Shape mainShape = _father->GetShapeToMesh();
-    if (!mainShape.IsNull())
-      {
-        _father->GetSubMesh( _father->GetShapeToMesh() )->DependsOn();
-      }
+    if ( !mainShape.IsNull() )
+      _father->GetSubMesh( mainShape )->DependsOn();
+
+    TopTools_MapOfShape map;
+
     for ( TopTools_ListIteratorOfListOfShape it( ancShapes ); it.More(); it.Next() )
       if ( SMESH_subMesh* sm = _father->GetSubMeshContaining( it.Value() ))
         if ( map.Add( it.Value() ))
index af0dab97fab64a4cc027fd240a971dfe08a331d6..1b1ccc4ea17c27c13d7974682a5a9b1edca3a87a 100644 (file)
@@ -308,10 +308,12 @@ static SALOMEDS::SObject_ptr publish(CORBA::Object_ptr     theIOR,
     if ( !sameIOR )
     {
       iorAttr->SetValue( objStr.in() );
-      // UnRegister() !!! --> No: random problems when meshing in parallel (yacs foreach) in distributed python scripts
-//      SALOME::GenericObj_var genObj = SALOME::GenericObj::_narrow( theIOR );
-//      if ( !genObj->_is_nil() )
-//        genObj->UnRegister();
+      // UnRegister() !!! --> random problems when meshing in parallel (yacs foreach) in
+      // distributed python scripts, because simultaneously created meshes are
+      // published into the same SO; as a result the mesh published first dies
+      SALOME::GenericObj_var genObj = SALOME::GenericObj::_narrow( theIOR );
+      if ( !genObj->_is_nil() )
+        genObj->UnRegister();
     }
   }
 
@@ -598,7 +600,7 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishMesh (SMESH::SMESH_Mesh_ptr theMesh,
     else
       aTag++;
 
-    aMeshSO = publish ( theMesh, father, aTag, "ICON_SMESH_TREE_MESH_WARN" );
+    aMeshSO = publish( theMesh, father, aTag, "ICON_SMESH_TREE_MESH_WARN" );
     if ( aMeshSO->_is_nil() )
       return aMeshSO._retn();
   }
index 5847399348148e45db2057588cdf9e53fafeaaeb..e9edd4e095ae483d36297abbbc7eb72e0b45d0ef 100644 (file)
@@ -82,8 +82,15 @@ def geomesh(l0, r0, h0, d0, d1, my_container, direc):
   #geompy.addToStudyInFather( barre, f1, 'f1' )
   #geompy.addToStudyInFather( barre, f2, 'f2' )
 
+  smesh.SetEnablePublish( False )
+
   isTetra = False
   barre_1 = smesh.Mesh(barre)
+  # SO = salome.myStudy.FindObjectIOR(salome.myStudy.ConvertObjectToIOR(barre_1.GetMesh()))
+  # if SO:
+  #   print ("_______",SO.GetID(),SO.GetName())
+  # else:
+  #   print ("_______NO_SO!!!")
   if (isTetra):
     NETGEN_1D_2D_3D = barre_1.Tetrahedron(algo=smeshBuilder.NETGEN_1D2D3D)
     NETGEN_3D_Parameters_1 = NETGEN_1D_2D_3D.Parameters()
@@ -139,14 +146,15 @@ def geomesh(l0, r0, h0, d0, d1, my_container, direc):
 def clearMesh(theMesh, theStudy, aName):
   theMesh.Clear()
   aMesh = theMesh.GetMesh()
-  aStudyBuilder = theStudy.NewBuilder()
-  SO = theStudy.FindObjectIOR(theStudy.ConvertObjectToIOR(aMesh))
-  objects_to_unpublish = [SO]
-  refs = theStudy.FindDependances(SO)
-  objects_to_unpublish += refs
-  for o in objects_to_unpublish:
-    if o is not None:
-      aStudyBuilder.RemoveObjectWithChildren(o)
+  aMesh.UnRegister()
+  # aStudyBuilder = theStudy.NewBuilder()
+  # SO = theStudy.FindObjectIOR(theStudy.ConvertObjectToIOR(aMesh))
+  # objects_to_unpublish = [SO]
+  # refs = theStudy.FindDependances(SO)
+  # objects_to_unpublish += refs
+  # for o in objects_to_unpublish:
+  #   if o is not None:
+  #     aStudyBuilder.RemoveObjectWithChildren(o)
   print("clearMesh done:", aName)
 
 def genere(r0, h0, my_container, direc):
@@ -164,4 +172,3 @@ def genere2(r0h0, my_container, direc):
   d1 = d0/2.
   res = geomesh(l0, r0, h0, d0, d1, my_container, direc)
   return res
-  
\ No newline at end of file
index b53777da12891e0f3ce0de26cfdae5b44dc9e380..19461a7744fc0c6d7acf98e2da70bdd51eb5f962 100644 (file)
@@ -127,6 +127,7 @@ bool StdMeshers_Quadrangle_2D::CheckHypothesis
   myTrianglePreference   = false;
   myHelper               = (SMESH_MesherHelper*)NULL;
   myParams               = NULL;
+  myProxyMesh.reset();
   myQuadList.clear();
 
   aStatus = SMESH_Hypothesis::HYP_OK;