From: azv Date: Sat, 27 Mar 2021 11:59:28 +0000 (+0300) Subject: Implement mechanism to remove static variables related to STEP exchange plugin. X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=0b1cb0ff89113ff1369b9fc921cd487e12c25f4e;p=occt-copy.git Implement mechanism to remove static variables related to STEP exchange plugin. --- diff --git a/src/IGESData/IGESData_GlobalNodeOfSpecificLib.hxx b/src/IGESData/IGESData_GlobalNodeOfSpecificLib.hxx index e9db7ad2af..bf91d51998 100644 --- a/src/IGESData/IGESData_GlobalNodeOfSpecificLib.hxx +++ b/src/IGESData/IGESData_GlobalNodeOfSpecificLib.hxx @@ -46,7 +46,10 @@ public: //! match) and Same State (that is, IsEqual is not required) //! Once added, stores its attached Protocol in correspondance Standard_EXPORT void Add (const Handle(IGESData_SpecificModule)& amodule, const Handle(IGESData_Protocol)& aprotocol); - + + //! Removes a Module from the list + Standard_EXPORT void Remove(const Handle(IGESData_SpecificModule)& amodule); + //! Returns the Module stored in a given GlobalNode Standard_EXPORT const Handle(IGESData_SpecificModule)& Module() const; diff --git a/src/IGESData/IGESData_GlobalNodeOfWriterLib.hxx b/src/IGESData/IGESData_GlobalNodeOfWriterLib.hxx index cea9c9c7f3..c8f781f9a6 100644 --- a/src/IGESData/IGESData_GlobalNodeOfWriterLib.hxx +++ b/src/IGESData/IGESData_GlobalNodeOfWriterLib.hxx @@ -46,7 +46,10 @@ public: //! match) and Same State (that is, IsEqual is not required) //! Once added, stores its attached Protocol in correspondance Standard_EXPORT void Add (const Handle(IGESData_ReadWriteModule)& amodule, const Handle(IGESData_Protocol)& aprotocol); - + + //! Removes a Module from the list + Standard_EXPORT void Remove(const Handle(IGESData_ReadWriteModule)& amodule); + //! Returns the Module stored in a given GlobalNode Standard_EXPORT const Handle(IGESData_ReadWriteModule)& Module() const; diff --git a/src/IGESData/IGESData_SpecificLib.hxx b/src/IGESData/IGESData_SpecificLib.hxx index 99454e5adb..8f9e0e8004 100644 --- a/src/IGESData/IGESData_SpecificLib.hxx +++ b/src/IGESData/IGESData_SpecificLib.hxx @@ -43,7 +43,10 @@ public: //! Adds a couple (Module-Protocol) into the global definition set //! for this class of Library. Standard_EXPORT static void SetGlobal (const Handle(IGESData_SpecificModule)& amodule, const Handle(IGESData_Protocol)& aprotocol); - + + //! Releases a module from the global definition set. + Standard_EXPORT static void ReleaseGlobal(const Handle(IGESData_SpecificModule)& amodule); + //! Creates a Library which complies with a Protocol, that is : //! Same class (criterium IsInstance) //! This creation gets the Modules from the global set, those diff --git a/src/IGESData/IGESData_WriterLib.hxx b/src/IGESData/IGESData_WriterLib.hxx index d4f394f611..fc37284eb7 100644 --- a/src/IGESData/IGESData_WriterLib.hxx +++ b/src/IGESData/IGESData_WriterLib.hxx @@ -43,7 +43,10 @@ public: //! Adds a couple (Module-Protocol) into the global definition set //! for this class of Library. Standard_EXPORT static void SetGlobal (const Handle(IGESData_ReadWriteModule)& amodule, const Handle(IGESData_Protocol)& aprotocol); - + + //! Releases a module from the global definition set. + Standard_EXPORT static void ReleaseGlobal(const Handle(IGESData_ReadWriteModule)& amodule); + //! Creates a Library which complies with a Protocol, that is : //! Same class (criterium IsInstance) //! This creation gets the Modules from the global set, those diff --git a/src/Interface/Interface_GeneralLib.hxx b/src/Interface/Interface_GeneralLib.hxx index c7c0bf5112..8ddd9b0646 100644 --- a/src/Interface/Interface_GeneralLib.hxx +++ b/src/Interface/Interface_GeneralLib.hxx @@ -42,7 +42,10 @@ public: //! Adds a couple (Module-Protocol) into the global definition set //! for this class of Library. Standard_EXPORT static void SetGlobal (const Handle(Interface_GeneralModule)& amodule, const Handle(Interface_Protocol)& aprotocol); - + + //! Releases a module from the global definition set. + Standard_EXPORT static void ReleaseGlobal(const Handle(Interface_GeneralModule)& amodule); + //! Creates a Library which complies with a Protocol, that is : //! Same class (criterium IsInstance) //! This creation gets the Modules from the global set, those diff --git a/src/Interface/Interface_GlobalNodeOfGeneralLib.hxx b/src/Interface/Interface_GlobalNodeOfGeneralLib.hxx index 713425ef7c..f78cae3a04 100644 --- a/src/Interface/Interface_GlobalNodeOfGeneralLib.hxx +++ b/src/Interface/Interface_GlobalNodeOfGeneralLib.hxx @@ -46,7 +46,10 @@ public: //! match) and Same State (that is, IsEqual is not required) //! Once added, stores its attached Protocol in correspondance Standard_EXPORT void Add (const Handle(Interface_GeneralModule)& amodule, const Handle(Interface_Protocol)& aprotocol); - + + //! Removes a Module from the list + Standard_EXPORT void Remove(const Handle(Interface_GeneralModule)& amodule); + //! Returns the Module stored in a given GlobalNode Standard_EXPORT const Handle(Interface_GeneralModule)& Module() const; diff --git a/src/Interface/Interface_GlobalNodeOfReaderLib.hxx b/src/Interface/Interface_GlobalNodeOfReaderLib.hxx index 6d6c9eac51..5b3b3b78f5 100644 --- a/src/Interface/Interface_GlobalNodeOfReaderLib.hxx +++ b/src/Interface/Interface_GlobalNodeOfReaderLib.hxx @@ -46,7 +46,10 @@ public: //! match) and Same State (that is, IsEqual is not required) //! Once added, stores its attached Protocol in correspondance Standard_EXPORT void Add (const Handle(Interface_ReaderModule)& amodule, const Handle(Interface_Protocol)& aprotocol); - + + //! Removes a Module from the list + Standard_EXPORT void Remove(const Handle(Interface_ReaderModule)& amodule); + //! Returns the Module stored in a given GlobalNode Standard_EXPORT const Handle(Interface_ReaderModule)& Module() const; diff --git a/src/Interface/Interface_ReaderLib.hxx b/src/Interface/Interface_ReaderLib.hxx index 7d982d8e0b..85eef38955 100644 --- a/src/Interface/Interface_ReaderLib.hxx +++ b/src/Interface/Interface_ReaderLib.hxx @@ -42,7 +42,10 @@ public: //! Adds a couple (Module-Protocol) into the global definition set //! for this class of Library. Standard_EXPORT static void SetGlobal (const Handle(Interface_ReaderModule)& amodule, const Handle(Interface_Protocol)& aprotocol); - + + //! Releases a module from the global definition set. + Standard_EXPORT static void ReleaseGlobal(const Handle(Interface_ReaderModule)& amodule); + //! Creates a Library which complies with a Protocol, that is : //! Same class (criterium IsInstance) //! This creation gets the Modules from the global set, those diff --git a/src/LibCtl/LibCtl_GlobalNode.gxx b/src/LibCtl/LibCtl_GlobalNode.gxx index a989a1dad2..5c089d625a 100644 --- a/src/LibCtl/LibCtl_GlobalNode.gxx +++ b/src/LibCtl/LibCtl_GlobalNode.gxx @@ -38,6 +38,26 @@ LibCtl_GlobalNode::LibCtl_GlobalNode () { } else thenext->Add (amodule,aprotocol); } +void LibCtl_GlobalNode::Remove(const Handle(TheModule)& amodule) +{ + if (themod == amodule) + { + if (thenext.IsNull()) + { + themod = Handle(TheModule)(); + theprot = Handle(TheProtocol)(); + } + else + { + themod = thenext->themod; + theprot = thenext->theprot; + thenext = thenext->thenext; + } + } + else if (!thenext.IsNull()) + thenext->Remove(amodule); +} + const Handle(TheModule)& LibCtl_GlobalNode::Module () const { return themod; } diff --git a/src/LibCtl/LibCtl_Library.gxx b/src/LibCtl/LibCtl_Library.gxx index d7fcef9f2b..d6dca27d95 100644 --- a/src/LibCtl/LibCtl_Library.gxx +++ b/src/LibCtl/LibCtl_Library.gxx @@ -36,6 +36,12 @@ static Handle(LibCtl_Node) thelast; theglobal->Add(amodule,aprotocol); } +void LibCtl_Library::ReleaseGlobal(const Handle(TheModule)& amodule) +{ + if (!theglobal.IsNull()) + theglobal->Remove(amodule); +} + // Constructeur d apres Protocole LibCtl_Library::LibCtl_Library (const Handle(TheProtocol)& aprotocol) { diff --git a/src/RWStepAP214/RWStepAP214.cxx b/src/RWStepAP214/RWStepAP214.cxx index 6693363283..ca8a5b73a8 100644 --- a/src/RWStepAP214/RWStepAP214.cxx +++ b/src/RWStepAP214/RWStepAP214.cxx @@ -22,18 +22,43 @@ #include #include -static int THE_RWStepAP214_init = 0; +DEFINE_STANDARD_HANDLE(RWStepAP214_Mgr, Standard_Transient) + +class RWStepAP214_Mgr : public Standard_Transient +{ +public: + RWStepAP214_Mgr() + { + myProtocol = StepAP214::Protocol(); + myGeneralModule = new RWStepAP214_GeneralModule; + myRWModule = new RWStepAP214_ReadWriteModule; + Interface_GeneralLib::SetGlobal(myGeneralModule, myProtocol); + Interface_ReaderLib::SetGlobal(myRWModule, myProtocol); + StepData_WriterLib::SetGlobal(myRWModule, myProtocol); + } + + virtual ~RWStepAP214_Mgr() + { + Interface_GeneralLib::ReleaseGlobal(myGeneralModule); + Interface_ReaderLib::ReleaseGlobal(myRWModule); + StepData_WriterLib::ReleaseGlobal(myRWModule); + } + + DEFINE_STANDARD_RTTI_INLINE(RWStepAP214_Mgr, Standard_Transient) + +private: + Handle(StepAP214_Protocol) myProtocol; + Handle(RWStepAP214_ReadWriteModule) myRWModule; + Handle(RWStepAP214_GeneralModule) myGeneralModule; +}; + +static Handle(RWStepAP214_Mgr) THE_MGR; void RWStepAP214::Init() { - if (THE_RWStepAP214_init) + if (THE_MGR.IsNull()) { - return; + RWHeaderSection::Init(); + THE_MGR = new RWStepAP214_Mgr; } - THE_RWStepAP214_init = 1; - RWHeaderSection::Init(); - Handle(StepAP214_Protocol) proto = StepAP214::Protocol(); - Interface_GeneralLib::SetGlobal (new RWStepAP214_GeneralModule,proto); - Interface_ReaderLib::SetGlobal (new RWStepAP214_ReadWriteModule,proto); - StepData_WriterLib::SetGlobal (new RWStepAP214_ReadWriteModule,proto); } diff --git a/src/STEPCAFControl/STEPCAFControl_Controller.cxx b/src/STEPCAFControl/STEPCAFControl_Controller.cxx index 5e43b80697..8ca3253c92 100644 --- a/src/STEPCAFControl/STEPCAFControl_Controller.cxx +++ b/src/STEPCAFControl/STEPCAFControl_Controller.cxx @@ -83,3 +83,10 @@ Standard_Boolean STEPCAFControl_Controller::Init () return Standard_True; } + +Standard_Boolean STEPCAFControl_Controller::Release() +{ + Handle(STEPCAFControl_Controller) STEPCTL = new STEPCAFControl_Controller; + STEPCTL->AutoRemove(); + return Standard_True; +} diff --git a/src/STEPCAFControl/STEPCAFControl_Controller.hxx b/src/STEPCAFControl/STEPCAFControl_Controller.hxx index bf5e782e6a..f9e6ec0d86 100644 --- a/src/STEPCAFControl/STEPCAFControl_Controller.hxx +++ b/src/STEPCAFControl/STEPCAFControl_Controller.hxx @@ -44,6 +44,7 @@ public: //! Returns True when done, False if could not be done Standard_EXPORT static Standard_Boolean Init(); + Standard_EXPORT static Standard_Boolean Release(); diff --git a/src/STEPCAFControl/STEPCAFControl_Reader.cxx b/src/STEPCAFControl/STEPCAFControl_Reader.cxx index 2573a8dc31..4b5e53c789 100644 --- a/src/STEPCAFControl/STEPCAFControl_Reader.cxx +++ b/src/STEPCAFControl/STEPCAFControl_Reader.cxx @@ -356,6 +356,10 @@ STEPCAFControl_Reader::STEPCAFControl_Reader(const Handle(XSControl_WorkSession) Init(WS, scratch); } +STEPCAFControl_Reader::~STEPCAFControl_Reader() +{ + STEPCAFControl_Controller::Release(); +} //======================================================================= //function : Init diff --git a/src/STEPCAFControl/STEPCAFControl_Reader.hxx b/src/STEPCAFControl/STEPCAFControl_Reader.hxx index b37c05d7c6..3ae2f6b0d9 100644 --- a/src/STEPCAFControl/STEPCAFControl_Reader.hxx +++ b/src/STEPCAFControl/STEPCAFControl_Reader.hxx @@ -70,7 +70,9 @@ public: //! Creates a reader tool and attaches it to an already existing Session //! Clears the session if it was not yet set for STEP Standard_EXPORT STEPCAFControl_Reader(const Handle(XSControl_WorkSession)& WS, const Standard_Boolean scratch = Standard_True); - + + Standard_EXPORT virtual ~STEPCAFControl_Reader(); + //! Clears the internal data structures and attaches to a new session //! Clears the session if it was not yet set for STEP Standard_EXPORT void Init (const Handle(XSControl_WorkSession)& WS, const Standard_Boolean scratch = Standard_True); diff --git a/src/StepData/StepData_GlobalNodeOfWriterLib.hxx b/src/StepData/StepData_GlobalNodeOfWriterLib.hxx index ee99849f0f..08aebf8f2e 100644 --- a/src/StepData/StepData_GlobalNodeOfWriterLib.hxx +++ b/src/StepData/StepData_GlobalNodeOfWriterLib.hxx @@ -46,7 +46,10 @@ public: //! match) and Same State (that is, IsEqual is not required) //! Once added, stores its attached Protocol in correspondance Standard_EXPORT void Add (const Handle(StepData_ReadWriteModule)& amodule, const Handle(StepData_Protocol)& aprotocol); - + + //! Removes a Module from the list + Standard_EXPORT void Remove(const Handle(StepData_ReadWriteModule)& amodule); + //! Returns the Module stored in a given GlobalNode Standard_EXPORT const Handle(StepData_ReadWriteModule)& Module() const; diff --git a/src/StepData/StepData_WriterLib.hxx b/src/StepData/StepData_WriterLib.hxx index 6f0501e9ae..7682879f80 100644 --- a/src/StepData/StepData_WriterLib.hxx +++ b/src/StepData/StepData_WriterLib.hxx @@ -42,7 +42,10 @@ public: //! Adds a couple (Module-Protocol) into the global definition set //! for this class of Library. Standard_EXPORT static void SetGlobal (const Handle(StepData_ReadWriteModule)& amodule, const Handle(StepData_Protocol)& aprotocol); - + + //! Releases a module from the global definition set. + Standard_EXPORT static void ReleaseGlobal(const Handle(StepData_ReadWriteModule)& amodule); + //! Creates a Library which complies with a Protocol, that is : //! Same class (criterium IsInstance) //! This creation gets the Modules from the global set, those diff --git a/src/XSControl/XSControl_Controller.cxx b/src/XSControl/XSControl_Controller.cxx index e1dc727ba1..1c582740d5 100644 --- a/src/XSControl/XSControl_Controller.cxx +++ b/src/XSControl/XSControl_Controller.cxx @@ -131,6 +131,13 @@ void XSControl_Controller::Record (const Standard_CString theName) const listad.Bind(theName, this); } +void XSControl_Controller::Remove(const Standard_CString theName) const +{ + if (listad.IsBound(theName)) { + listad.UnBind(theName); + } +} + //======================================================================= //function : Recorded //purpose : diff --git a/src/XSControl/XSControl_Controller.hxx b/src/XSControl/XSControl_Controller.hxx index 87b7a4b923..c4bd856963 100644 --- a/src/XSControl/XSControl_Controller.hxx +++ b/src/XSControl/XSControl_Controller.hxx @@ -82,7 +82,14 @@ class XSControl_Controller : public Standard_Transient //! Records in a general dictionary under a name //! Error if already used for another one Standard_EXPORT void Record (const Standard_CString name) const; - + + void AutoRemove() const + { + Remove(Name(Standard_True)); + Remove(Name(Standard_False)); + } + Standard_EXPORT void Remove(const Standard_CString name) const; + //! Returns the Controller attached to a given name //! Returns a Null Handle if is unknown Standard_EXPORT static Handle(XSControl_Controller) Recorded (const Standard_CString name);