Salome HOME
NPAL16716. Compound: To create the groups of initial meshes.
[modules/smesh.git] / src / OBJECT / SMESH_Object.cxx
index 12fb1a77f26704163db8499e1b833bb5bc09b08f..9bdc652a09b9c260bf07555077489f601875a9c5 100644 (file)
@@ -199,10 +199,8 @@ void SMESH_VisualObjDef::createPoints( vtkPoints* thePoints )
 //=================================================================================
 void SMESH_VisualObjDef::buildPrs()
 {
-  // PAL16631(crash after a mesh computation that failed because of lack of memory):
-  // Catch exceptions upper by stack
-//   try 
-//   {
+  try 
+  {
     mySMDS2VTKNodes.clear();
     myVTK2SMDSNodes.clear();
     mySMDS2VTKElems.clear();
@@ -212,15 +210,18 @@ void SMESH_VisualObjDef::buildPrs()
       buildNodePrs();
     else
       buildElemPrs();
-//   }
-//   catch( const std::exception& exc )
-//   {
-//     INFOS("Follow exception was cought:\n\t"<<exc.what());
-//   }
-//   catch(...)
-//   {
-//     INFOS("Unknown exception was cought !!!");
-//   }
+  }
+  catch(...)
+  {
+    mySMDS2VTKNodes.clear();
+    myVTK2SMDSNodes.clear();
+    mySMDS2VTKElems.clear();
+    myVTK2SMDSElems.clear();
+
+    myGrid->SetPoints( 0 );
+    myGrid->SetCells( 0, 0, 0 );
+    throw;
+  }
   
   if( MYDEBUG ) MESSAGE( "Update - myGrid->GetNumberOfCells() = "<<myGrid->GetNumberOfCells() );
   if( MYDEBUGWITHFILES ) SMESH::WriteUnstructuredGrid( myGrid,"/tmp/buildPrs" );
@@ -232,8 +233,12 @@ void SMESH_VisualObjDef::buildPrs()
 //=================================================================================
 void SMESH_VisualObjDef::buildNodePrs()
 {
+  // PAL16631: without swap, bad_alloc is not thrown but hung up and crash instead,
+  // so check remaining memory size for safety
+  SMDS_Mesh::CheckMemory(); // PAL16631
   vtkPoints* aPoints = vtkPoints::New();
   createPoints( aPoints );
+  SMDS_Mesh::CheckMemory();
   myGrid->SetPoints( aPoints );
   aPoints->Delete();
 
@@ -293,6 +298,10 @@ void SMESH_VisualObjDef::buildElemPrs()
   for ( int i = 0; i <= 2; i++ )
     nbEnts[ aTypes[ i ] ] = GetEntities( aTypes[ i ], anEnts[ aTypes[ i ] ] );
 
+  // PAL16631: without swap, bad_alloc is not thrown but hung up and crash instead,
+  // so check remaining memory size for safety
+  SMDS_Mesh::CheckMemory(); // PAL16631
+
   vtkIdType aCellsSize =  3 * nbEnts[ SMDSAbs_Edge ];
 
   for ( int i = 1; i <= 2; i++ ) // iterate through faces and volumes
@@ -316,16 +325,22 @@ void SMESH_VisualObjDef::buildElemPrs()
   vtkCellArray* aConnectivity = vtkCellArray::New();
   aConnectivity->Allocate( aCellsSize, 0 );
   
+  SMDS_Mesh::CheckMemory(); // PAL16631
+
   vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
   aCellTypesArray->SetNumberOfComponents( 1 );
   aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() );
   
+  SMDS_Mesh::CheckMemory(); // PAL16631
+
   vtkIdList *anIdList = vtkIdList::New();
   vtkIdType iElem = 0;
 
   TConnect aConnect;
   aConnect.reserve(VTK_CELL_SIZE);
 
+  SMDS_Mesh::CheckMemory(); // PAL16631
+
   for ( int i = 0; i <= 2; i++ ) // iterate through edges, faces and volumes
   {
     if( nbEnts[ aTypes[ i ] ] > 0 )
@@ -426,6 +441,7 @@ void SMESH_VisualObjDef::buildElemPrs()
         iElem++;
       }
     }
+    SMDS_Mesh::CheckMemory(); // PAL16631
   }
 
   // Insert cells in grid
@@ -434,6 +450,8 @@ void SMESH_VisualObjDef::buildElemPrs()
   aCellLocationsArray->SetNumberOfComponents( 1 );
   aCellLocationsArray->SetNumberOfTuples( aNbCells );
   
+  SMDS_Mesh::CheckMemory(); // PAL16631
+
   aConnectivity->InitTraversal();
   for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
     aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
@@ -444,6 +462,8 @@ void SMESH_VisualObjDef::buildElemPrs()
   aCellTypesArray->Delete();
   aConnectivity->Delete();
   anIdList->Delete();
+
+  SMDS_Mesh::CheckMemory(); // PAL16631
 }
 
 //=================================================================================