]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
NPAL18604: Pb. of performance with MakeVertex. Fixed memory leak and improved OCAF...
authorjfa <jfa@opencascade.com>
Thu, 24 Jan 2008 12:29:08 +0000 (12:29 +0000)
committerjfa <jfa@opencascade.com>
Thu, 24 Jan 2008 12:29:08 +0000 (12:29 +0000)
src/GEOM/GEOM_Engine.cxx
src/GEOM/GEOM_Engine.hxx
src/GEOM_I/GEOM_IOperations_i.cc

index 3ac30e5ab278290a3290f74e1b87562b62897be4..bf231425c92c63d4a185e88daecc5dbb69e28f5d 100644 (file)
@@ -114,6 +114,7 @@ GEOM_Engine::GEOM_Engine()
 
   _OCAFApp = new GEOM_Application();
   _UndoLimit = 10;
+  _lastObjectTag = 0;
 }
 
 //=============================================================================
@@ -176,18 +177,34 @@ Handle(GEOM_Object) GEOM_Engine::GetObject(int theDocID, char* theEntry)
 //=============================================================================
 Handle(GEOM_Object) GEOM_Engine::AddObject(int theDocID, int theType)
 {
-    Handle(TDocStd_Document) aDoc = GetDocument(theDocID);
-    Handle(TDataStd_TreeNode) aRoot = TDataStd_TreeNode::Set(aDoc->Main());
+  Handle(TDocStd_Document) aDoc = GetDocument(theDocID);
+  Handle(TDataStd_TreeNode) aRoot = TDataStd_TreeNode::Set(aDoc->Main());
 
-    TDF_Label aChild = TDF_TagSource::NewChild(aDoc->Main());
-    Handle(GEOM_Object) anObject = new GEOM_Object(aChild, theType);
+  //TDF_Label aChild = TDF_TagSource::NewChild(aDoc->Main());
+  // NPAL18604: use existing label to decrease memory usage,
+  //            if this label has been freed (object deleted)
+  bool useExisting = false;
+  TDF_Label aChild;
+  if (_lastObjectTag > 0) {
+    aChild = aDoc->Main().FindChild(_lastObjectTag, Standard_False);
+    if (!aChild.IsAttribute(TDataStd_TreeNode::GetDefaultTreeID())) {
+      useExisting = true;
+    }
+  }
+  if (!useExisting) {
+    // create new label
+    aChild = TDF_TagSource::NewChild(aDoc->Main());
+    _lastObjectTag = aChild.Tag();
+  }
+
+  Handle(GEOM_Object) anObject = new GEOM_Object(aChild, theType);
 
-    //Put an object in the map of created objects
-    TCollection_AsciiString anID = BuildIDFromObject(anObject);
-    if(_objects.IsBound(anID)) _objects.UnBind(anID);
-    _objects.Bind(anID, anObject);
+  //Put an object in the map of created objects
+  TCollection_AsciiString anID = BuildIDFromObject(anObject);
+  if(_objects.IsBound(anID)) _objects.UnBind(anID);
+  _objects.Bind(anID, anObject);
 
-    return anObject;
+  return anObject;
 }
 
 //=============================================================================
@@ -204,7 +221,22 @@ Handle(GEOM_Object) GEOM_Engine::AddSubShape(Handle(GEOM_Object) theMainShape,
   Handle(TDocStd_Document) aDoc = GetDocument(theMainShape->GetDocID());
   Handle(TDataStd_TreeNode) aRoot = TDataStd_TreeNode::Set(aDoc->Main());
 
-  TDF_Label aChild = TDF_TagSource::NewChild(aDoc->Main());
+  //TDF_Label aChild = TDF_TagSource::NewChild(aDoc->Main());
+  // NPAL18604: use existing label to decrease memory usage,
+  //            if this label has been freed (object deleted)
+  bool useExisting = false;
+  TDF_Label aChild;
+  if (_lastObjectTag > 0) {
+    aChild = aDoc->Main().FindChild(_lastObjectTag, Standard_False);
+    if (!aChild.IsAttribute(TDataStd_TreeNode::GetDefaultTreeID())) {
+      useExisting = true;
+    }
+  }
+  if (!useExisting) {
+    // create new label
+    aChild = TDF_TagSource::NewChild(aDoc->Main());
+    _lastObjectTag = aChild.Tag();
+  }
 
   Handle(GEOM_Function) aMainShape = theMainShape->GetLastFunction();
   Handle(GEOM_Object) anObject = new GEOM_Object(aChild, 28); //28 is SUBSHAPE type
index 662bd242fce296e51fdafdb7fd67e50cc8493a74..d3fe9a3f7516d4be8b37ec4c34a237e9499c4822 100644 (file)
@@ -101,6 +101,8 @@ class GEOM_Engine
   GEOM_DataMapOfAsciiStringTransient _objects;
 
   Resource_DataMapOfAsciiStringAsciiString _studyEntry2NameMap;
+
+  int _lastObjectTag;
 };
 
 #endif
index 89b7fc5f82d694571763c965a0523e773248270a..3d5c87c468be22892a2cdb04f029c1dfb32e00e0 100644 (file)
@@ -114,7 +114,7 @@ void GEOM_IOperations_i::FinishOperation()
 
 //=============================================================================
 /*!
- *  AboutOperation
+ *  AbortOperation
  */
 //=============================================================================
 void GEOM_IOperations_i::AbortOperation()
@@ -132,6 +132,6 @@ GEOM::GEOM_Object_ptr GEOM_IOperations_i::GetObject(Handle(GEOM_Object) theObjec
   if(theObject.IsNull()) return NULL;
   TCollection_AsciiString anEntry;
   TDF_Tool::Entry(theObject->GetEntry(), anEntry);
-  GEOM::GEOM_Object_var GO = GEOM::GEOM_Object::_duplicate(_engine->GetObject(theObject->GetDocID(), anEntry.ToCString()));
+  GEOM::GEOM_Object_var GO = _engine->GetObject(theObject->GetDocID(), anEntry.ToCString());
   return GO._retn();
 }