]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
Issue 0020572: EDF 1150 OCC: SIGSEGV when Salome is closing after execution of a...
authorvsr <vsr@opencascade.com>
Wed, 4 Nov 2009 11:54:31 +0000 (11:54 +0000)
committervsr <vsr@opencascade.com>
Wed, 4 Nov 2009 11:54:31 +0000 (11:54 +0000)
src/GEOM/GEOM_Engine.cxx
src/GEOM/GEOM_Engine.hxx
src/GEOM/GEOM_Object.cxx
src/GEOM/GEOM_Object.hxx
src/GEOM_I/GEOM_Gen_i.cc

index 96eed9a93ac48fddd94b0ddf8cb251b46f2286d9..6911bf9329ef1e9c9eb691037e8f8ff453483d98 100644 (file)
@@ -203,17 +203,19 @@ GEOM_Engine::~GEOM_Engine()
  *  GetDocument
  */
 //=============================================================================
-Handle(TDocStd_Document) GEOM_Engine::GetDocument(int theDocID)
+Handle(TDocStd_Document) GEOM_Engine::GetDocument(int theDocID, bool force)
 {
   Handle(TDocStd_Document) aDoc;
-  if(!_mapIDDocument.IsBound(theDocID)) {
+  if(_mapIDDocument.IsBound(theDocID)) {
+    aDoc = Handle(TDocStd_Document)::DownCast(_mapIDDocument(theDocID));
+  }
+  else if (force) {
     _OCAFApp->NewDocument("SALOME_GEOM", aDoc);
     aDoc->SetUndoLimit(_UndoLimit);
     _mapIDDocument.Bind(theDocID, aDoc);
     TDataStd_Integer::Set(aDoc->Main(), theDocID);
   }
-
-  return Handle(TDocStd_Document)::DownCast(_mapIDDocument(theDocID));
+  return aDoc;
 }
 
 //=============================================================================
@@ -236,17 +238,24 @@ int GEOM_Engine::GetDocID(Handle(TDocStd_Document) theDocument)
  *  GetObject
  */
 //=============================================================================
-Handle(GEOM_Object) GEOM_Engine::GetObject(int theDocID, char* theEntry)
+Handle(GEOM_Object) GEOM_Engine::GetObject(int theDocID, char* theEntry, bool force)
 {
-  TCollection_AsciiString anID = BuildID(theDocID, theEntry);
-  if(_objects.IsBound(anID)) return Handle(GEOM_Object)::DownCast(_objects(anID));
+  Handle(GEOM_Object) anObject;
 
-  TDF_Label aLabel;
-  Handle(TDocStd_Document) aDoc = GetDocument(theDocID);
-  TDF_Tool::Label(aDoc->Main().Data(), theEntry, aLabel, Standard_True);
-  Handle(GEOM_Object) anObject = new GEOM_Object(aLabel);
+  TCollection_AsciiString anID = BuildID(theDocID, theEntry);
 
-  _objects.Bind(anID, anObject);
+  if (_objects.IsBound(anID)) {
+    anObject = Handle(GEOM_Object)::DownCast(_objects(anID));
+  }
+  else if (force) {
+    Handle(TDocStd_Document) aDoc = GetDocument(theDocID, force);
+    if ( !aDoc.IsNull()) {
+      TDF_Label aLabel;
+      TDF_Tool::Label(aDoc->Main().Data(), theEntry, aLabel, Standard_True);
+      anObject = new GEOM_Object(aLabel);
+      _objects.Bind(anID, anObject);
+    }
+  }
 
   return anObject;
 }
@@ -390,7 +399,9 @@ bool GEOM_Engine::RemoveObject(Handle(GEOM_Object) theObject)
   if (theObject.IsNull()) return false;
 
   int aDocID = theObject->GetDocID();
-
+  if(!_mapIDDocument.IsBound(aDocID))
+    return false;  // document is closed...
+  
   //Remove an object from the map of available objects
   TCollection_AsciiString anID = BuildIDFromObject(theObject);
   if (_objects.IsBound(anID)) _objects.UnBind(anID);
index 6ec146c926506b2e3790637bbe88436420a1eb4a..ae69152840603296ab3f8e6e1fc696cf2561b146 100644 (file)
@@ -82,7 +82,7 @@ class GEOM_Engine
   Standard_EXPORT static GEOM_Engine* GetEngine();   
 
   //Returns the OCAF document by its ID, if document doesn't exists it will be created
-  Standard_EXPORT Handle(TDocStd_Document) GetDocument(int theDocID);
+  Standard_EXPORT Handle(TDocStd_Document) GetDocument(int theDocID, bool force=true);
 
   //Returns the ID of the given OCAF document
   Standard_EXPORT int GetDocID(Handle(TDocStd_Document) theDocument);
@@ -91,7 +91,7 @@ class GEOM_Engine
   Standard_EXPORT Handle(TDocStd_Application) GetApplication() { return _OCAFApp; }
 
   //Returns a pointer to GEOM_Object defined by a document and the entry
-  Standard_EXPORT Handle(GEOM_Object) GetObject(int theDocID, char* theEntry);
+  Standard_EXPORT Handle(GEOM_Object) GetObject(int theDocID, char* theEntry, bool force=true);
   
   //Adds a new object of the type theType in the OCAF document
   Standard_EXPORT Handle(GEOM_Object) AddObject(int theDocID, int theType);
index 38025ab067ac88f00b8ae87b14695d3ca0d17bb4..dcfd41056ebf3d4a77fb4942ae530d88f011b89c 100644 (file)
@@ -147,8 +147,14 @@ Handle(GEOM_Object) GEOM_Object::GetReferencedObject(TDF_Label& theLabel)
  */
 //=============================================================================
 GEOM_Object::GEOM_Object(TDF_Label& theEntry)
-: _label(theEntry), _ior("")
+  : _label(theEntry), _ior(""), _docID(-1)
 {
+  Handle(TDocStd_Document) aDoc = TDocStd_Owner::GetDocument(_label.Data());
+  if(!aDoc.IsNull()) {
+    Handle(TDataStd_Integer) anID;
+    if(aDoc->Main().FindAttribute(TDataStd_Integer::GetID(), anID)) _docID = anID->Get();
+  }
+
   if(!theEntry.FindAttribute(TDataStd_TreeNode::GetDefaultTreeID(), _root))
     _root = TDataStd_TreeNode::Set(theEntry);
 }
@@ -159,8 +165,14 @@ GEOM_Object::GEOM_Object(TDF_Label& theEntry)
  */
 //=============================================================================
 GEOM_Object::GEOM_Object(TDF_Label& theEntry, int theType)
-: _label(theEntry), _ior("")
+: _label(theEntry), _ior(""), _docID(-1)
 {
+  Handle(TDocStd_Document) aDoc = TDocStd_Owner::GetDocument(_label.Data());
+  if(!aDoc.IsNull()) {
+    Handle(TDataStd_Integer) anID;
+    if(aDoc->Main().FindAttribute(TDataStd_Integer::GetID(), anID)) _docID = anID->Get();
+  }
+
   theEntry.ForgetAllAttributes(Standard_True);
 
   if(!theEntry.FindAttribute(TDataStd_TreeNode::GetDefaultTreeID(), _root))
@@ -262,13 +274,7 @@ void GEOM_Object::IncrementTic()
 //=============================================================================
 int GEOM_Object::GetDocID()
 {
-  Handle(TDocStd_Document) aDoc = TDocStd_Owner::GetDocument(_label.Data());
-  if(aDoc.IsNull()) return -1;
-
-  Handle(TDataStd_Integer) anID;
-  if(!aDoc->Main().FindAttribute(TDataStd_Integer::GetID(), anID)) return -1;
-
-  return anID->Get();
+  return _docID;
 }
 
 
index 66f93f64295cebff9376c2894461a93b1e885aad..c79f827e1de78bc5459d5da8e37182acd793ebfd 100644 (file)
@@ -300,6 +300,7 @@ class GEOM_Object : public MMgt_TShared
   TDF_Label                 _label;
   TCollection_AsciiString   _ior;
   TCollection_AsciiString   _parameters;
+  int                       _docID;
 };
 
 #endif
index 35d6d742dfe83f298877290a1b92e3b70e5299ca..58471eebb24b9d0e4c7987efdedde747936d6a1e 100644 (file)
 // function : GEOM_Gen_i()
 // purpose  : constructor to be called for servant creation.
 //============================================================================
-GEOM_Gen_i::GEOM_Gen_i(CORBA::ORB_ptr orb,
-                      PortableServer::POA_ptr poa,
-                      PortableServer::ObjectId * contId,
-                      const char *instanceName,
-                      const char *interfaceName) :
+GEOM_Gen_i::GEOM_Gen_i(CORBA::ORB_ptr            orb,
+                      PortableServer::POA_ptr   poa,
+                      PortableServer::ObjectId* contId,
+                      const char*               instanceName,
+                      const char*               interfaceName) :
   Engines_Component_i(orb, poa, contId, instanceName, interfaceName)
 {
   _thisObj = this;
@@ -1587,7 +1587,7 @@ GEOM::GEOM_Object_ptr GEOM_Gen_i::AddSubShape (GEOM::GEOM_Object_ptr theMainShap
 void GEOM_Gen_i::RemoveObject(GEOM::GEOM_Object_ptr theObject)
 {
   CORBA::String_var anEntry = theObject->GetEntry();
-  Handle(GEOM_Object) anObject = _impl->GetObject(theObject->GetStudyID(), anEntry);
+  Handle(GEOM_Object) anObject = _impl->GetObject(theObject->GetStudyID(), anEntry, false);
   if (anObject.IsNull()) return;
   _impl->RemoveObject(anObject);
   return;
@@ -1808,19 +1808,19 @@ char* GEOM_Gen_i::getObjectInfo(CORBA::Long studyId, const char* entry)
 //=====================================================================================
 extern "C"
 {
-GEOM_I_EXPORT
-PortableServer::ObjectId* GEOMEngine_factory(CORBA::ORB*, PortableServer::POA*, PortableServer::ObjectId*, const char*, const char*);
-
-GEOM_I_EXPORT
-  PortableServer::ObjectId * GEOMEngine_factory(CORBA::ORB_ptr orb,
-                                               PortableServer::POA_ptr poa,
-                                               PortableServer::ObjectId * contId,
-                                               const char *instanceName,
-                                               const char * interfaceName)
+  /*
+  GEOM_I_EXPORT
+  PortableServer::ObjectId* GEOMEngine_factory(CORBA::ORB*, PortableServer::POA*, PortableServer::ObjectId*, const char*, const char*);
+  */
+  
+  GEOM_I_EXPORT
+  PortableServer::ObjectId* GEOMEngine_factory(CORBA::ORB_ptr            orb,
+                                              PortableServer::POA_ptr   poa,
+                                              PortableServer::ObjectId* contId,
+                                              const char*               instanceName,
+                                              const char*               interfaceName)
   {
-   GEOM_Gen_i * myGEOM_Gen_i = new GEOM_Gen_i(orb, poa, contId, instanceName, interfaceName);
-   // Don't understand the reason of this register ????
-//   myGEOM_Gen_i->register_name("/myGEOM_Gen"); // NRI : 11/07/2002 : Add for Supervision example
-   return myGEOM_Gen_i->getId();
+    GEOM_Gen_i* myGEOM_Gen_i = new GEOM_Gen_i(orb, poa, contId, instanceName, interfaceName);
+    return myGEOM_Gen_i->getId();
   }
 }