X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FUtils%2FUtils_DESTRUCTEUR_GENERIQUE.hxx;h=fc9ac615175dd11e375fdbe8b001f44b3387ad53;hb=f01a3911fa7b074af7e1ac958be5763aeed5d056;hp=5962e8e994729705dae67713fca8fea7747a07be;hpb=102608ce8b69dd1ea798169e30223b67742ec26d;p=modules%2Fkernel.git diff --git a/src/Utils/Utils_DESTRUCTEUR_GENERIQUE.hxx b/src/Utils/Utils_DESTRUCTEUR_GENERIQUE.hxx index 5962e8e99..fc9ac6151 100644 --- a/src/Utils/Utils_DESTRUCTEUR_GENERIQUE.hxx +++ b/src/Utils/Utils_DESTRUCTEUR_GENERIQUE.hxx @@ -1,35 +1,43 @@ -// SALOME Utils : general SALOME's definitions and tools +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + +// SALOME Utils : general SALOME's definitions and tools // File : Utils_DESTRUCTEUR_GENERIQUE.hxx // Author : Antoine YESSAYAN, EDF // Module : SALOME // $Header$ - +// # if !defined( __DESTRUCTEUR_GENERIQUE__H__ ) # define __DESTRUCTEUR_GENERIQUE__H__ -# include "utilities.h" +#include + +#include "SALOME_Utils.hxx" + +#include +#include +#include +#include +//# include "utilities.h" /*!\class DESTRUCTEUR_GENERIQUE_ * @@ -41,28 +49,26 @@ * Usage * * The only way to use the DESTRUCTEUR_GENERIQUE_ class is inheritance : - * class DESTRUCTEUR_SPECIFIQUE_ : public DESTRUCTEUR_GENERIQUE_ + * class DESTRUCTEUR_SPECIFIQUE_ : public DESTRUCTEUR_GENERIQUE_ * * Design description * - * A generic destructor supply two functionalities : - * -# a static method to add a destruction (objetct) to be performed DESTRUCTEUR_GENERIQUE_::Ajout( - * DESTRUCTEUR_GENERIQUE_ &objet) ; - * The Destruction object is stored in a list of pointer to DESTRUCTEUR_GENERIQUE_ objects. - * -# an object method to execute the destruction : operator()(). + * A generic destructor supply two functionalities : + * -# a static method to add a destruction (objetct) to be performed DESTRUCTEUR_GENERIQUE_::Ajout( + * DESTRUCTEUR_GENERIQUE_ &objet) ; + * The Destruction object is stored in a list of pointer to DESTRUCTEUR_GENERIQUE_ objects. + * -# an object method to execute the destruction : operator()(). */ -class DESTRUCTEUR_GENERIQUE_ +class UTILS_EXPORT 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 -} ; - - - + static std::list *Destructeurs; + 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_ @@ -74,62 +80,64 @@ public : * * Usage * - * In this example the POINT_ ptrPoint will be destroyed at the end of the process (atexit). + * In this example the POINT_ ptrPoint will be destroyed at the end of the process (atexit). * * POINT_ *ptrPoint = new POINT_ ;
- * DESTRUCTEUR_DE_ *ptrDestruction = new DESTRUCTEUR_DE_( *ptrPoint ) ; + * DESTRUCTEUR_DE_ *ptrDestruction = new DESTRUCTEUR_DE_( *ptrPoint ) ; * - * Note that neither ptrPoint, nor ptrDestruction should be destroyed by the user. + * Note that neither ptrPoint, nor ptrDestruction should be destroyed by the user. * * Design description * - * The destruction object must be created dynamicaly because it suscribes himself in the list of - * destruction to be performed at the end of the process. + * The destruction object must be created dynamicaly because it suscribes himself in the list of + * 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(dynamic_cast(_PtrObjet)){ + // std::cerr << "WARNING: automatic destruction for servant is no more used. It's too late in exit. Use explicit call" << std::endl; + /* + if(TServant* aServant = dynamic_cast(_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{ + //cerr << "DESTRUCTEUR_GENERIQUE_::operator() deleting _PtrObjet" << endl; + 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__ ) */ +# endif /* # if !defined( __DESTRUCTEUR_GENERIQUE__H__ ) */