From 8c740710a01afd3399b4ff7175da126938a405a8 Mon Sep 17 00:00:00 2001 From: eap Date: Mon, 24 Sep 2007 13:52:57 +0000 Subject: [PATCH] + SMDS_Mesh::CheckMemory(); // PAL16631 --- src/OBJECT/SMESH_Object.cxx | 19 +++++++++++++++++++ src/SMESH/SMESH_subMesh.cxx | 3 ++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/OBJECT/SMESH_Object.cxx b/src/OBJECT/SMESH_Object.cxx index 12fb1a77f..1fa0b34f6 100644 --- a/src/OBJECT/SMESH_Object.cxx +++ b/src/OBJECT/SMESH_Object.cxx @@ -232,8 +232,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 +297,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 +324,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 +440,7 @@ void SMESH_VisualObjDef::buildElemPrs() iElem++; } } + SMDS_Mesh::CheckMemory(); // PAL16631 } // Insert cells in grid @@ -434,6 +449,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 +461,8 @@ void SMESH_VisualObjDef::buildElemPrs() aCellTypesArray->Delete(); aConnectivity->Delete(); anIdList->Delete(); + + SMDS_Mesh::CheckMemory(); // PAL16631 } //================================================================================= diff --git a/src/SMESH/SMESH_subMesh.cxx b/src/SMESH/SMESH_subMesh.cxx index d490e6bbe..ebb96e21d 100644 --- a/src/SMESH/SMESH_subMesh.cxx +++ b/src/SMESH/SMESH_subMesh.cxx @@ -1315,8 +1315,9 @@ bool SMESH_subMesh::ComputeStateEngine(int event) #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; #endif - MemoryReserve aMemoryReserve; algo->InitComputeError(); + MemoryReserve aMemoryReserve; + SMDS_Mesh::CheckMemory(); if ( !_father->HasShapeToMesh() ) // no shape { SMESH_MesherHelper helper( *_father ); -- 2.39.2