From: smh Date: Thu, 13 May 2004 06:13:50 +0000 (+0000) Subject: Fix on Bug KERNEL5829 X-Git-Tag: Ecole_Ete_a5~3 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=f93388668840b06f95ea2901eee406da4687d7d7;p=modules%2Fkernel.git Fix on Bug KERNEL5829 - Error message when quitting Salome --- diff --git a/src/Utils/Utils_DESTRUCTEUR_GENERIQUE.hxx b/src/Utils/Utils_DESTRUCTEUR_GENERIQUE.hxx index 5962e8e99..6cf3432c1 100644 --- a/src/Utils/Utils_DESTRUCTEUR_GENERIQUE.hxx +++ b/src/Utils/Utils_DESTRUCTEUR_GENERIQUE.hxx @@ -29,6 +29,7 @@ # if !defined( __DESTRUCTEUR_GENERIQUE__H__ ) # define __DESTRUCTEUR_GENERIQUE__H__ +# include # include "utilities.h" /*!\class DESTRUCTEUR_GENERIQUE_ @@ -55,16 +56,12 @@ class DESTRUCTEUR_GENERIQUE_ { public : - virtual ~DESTRUCTEUR_GENERIQUE_() {}//!< virtual destructor - static const int Ajout( DESTRUCTEUR_GENERIQUE_ &objet );//!< adds a destruction object to the list of destructions - virtual void operator()( void )=0 ;//!< performs the destruction + virtual ~DESTRUCTEUR_GENERIQUE_() {}//!< virtual destructor + static const int Ajout( DESTRUCTEUR_GENERIQUE_ &objet );//!< adds a destruction object to the list of destructions + virtual void operator()( void )=0 ;//!< performs the destruction } ; - - - - /*!\class DESTRUCTEUR_DE_ * * Purpose @@ -87,49 +84,48 @@ public : * destruction to be performed at the end of the process. * */ - template class DESTRUCTEUR_DE_ : public DESTRUCTEUR_GENERIQUE_ { public : + /* Programs the destruction at the end of the process, of the object objet. + This method records in _PtrObjet the address of an object to be destroyed + at the end of the process + */ + DESTRUCTEUR_DE_(TYPE &objet): + _PtrObjet( &objet ) + { + ASSERT(DESTRUCTEUR_GENERIQUE_::Ajout( *this ) >= 0) ; + } + + /* Performs the destruction of the object. + This method really destroys the object pointed by _PtrObjet. + It should be called at the end of the process (i.e. at exit). + */ + virtual void operator()(void){ + typedef PortableServer::ServantBase TServant; + if(_PtrObjet){ + if(TServant* aServant = dynamic_cast(_PtrObjet)){ + MESSAGE("deleting ServantBase's _PtrObjet"); + PortableServer::POA_var aPOA = aServant->_default_POA(); + PortableServer::ObjectId_var anObjectId = aPOA->servant_to_id(aServant); + aPOA->deactivate_object(anObjectId.in()); + aServant->_remove_ref(); + }else{ + MESSAGE("deleting _PtrObjet"); + TYPE* aPtr = static_cast(_PtrObjet); + delete aPtr; + } + _PtrObjet = NULL ; + } + } + + virtual ~DESTRUCTEUR_DE_(){ + ASSERT(!_PtrObjet) ; + } - inline DESTRUCTEUR_DE_( TYPE &objet ); //! programs the destruction at the end of the process, of the object objet - virtual void operator()( void ) ; //!< performs the destruction of the object - virtual ~DESTRUCTEUR_DE_() ; private : - const TYPE *_PtrObjet ; -} ; - - + TYPE *_PtrObjet ; +}; - - -/*! -This method records in _PtrObjet the address of an object to be destroyed at the end of the process -*/ -template DESTRUCTEUR_DE_::DESTRUCTEUR_DE_( TYPE &objet ): _PtrObjet( &objet ) -{ - int k = DESTRUCTEUR_GENERIQUE_::Ajout( *this ) ; - ASSERT(k>=0) ; -} - -template DESTRUCTEUR_DE_::~DESTRUCTEUR_DE_() -{ - ASSERT(_PtrObjet==NULL) ; -} - -/*! -This method really destroys the object pointed by _PtrObjet. It should be called at the end of the process -(i.e. at exit). -*/ -template void DESTRUCTEUR_DE_::operator()( void ) -{ - if ( _PtrObjet ) - { - MESSAGE("deleting _PtrObjet") ; - delete (TYPE*)_PtrObjet ; - _PtrObjet = NULL ; - } -} - # endif /* # if !defined( __SINGLETON__H__ ) */ diff --git a/src/Utils/Utils_ORB_INIT.hxx b/src/Utils/Utils_ORB_INIT.hxx index 2bcccf0a7..1a5c822db 100644 --- a/src/Utils/Utils_ORB_INIT.hxx +++ b/src/Utils/Utils_ORB_INIT.hxx @@ -47,7 +47,7 @@ private : public : ORB_INIT( void ); - ~ORB_INIT(); + virtual ~ORB_INIT(); CORBA::ORB_var & operator() ( int argc , char **argv ) throw( CommException ) ; inline CORBA::ORB_var &orb( void );