X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FBasics%2FBasicsGenericDestructor.cxx;h=7c6b22892ecfeaebf2a9fb86c527d6244a97c90c;hb=7b6895b48ccd982f69db4fe3ecd30d75be0514dc;hp=91585a2ae1d1a92b4162e9f6b4c195575bfcde75;hpb=1bd1d38e86c39b13e265f8ff534fc1463c25fef3;p=modules%2Fkernel.git diff --git a/src/Basics/BasicsGenericDestructor.cxx b/src/Basics/BasicsGenericDestructor.cxx index 91585a2ae..7c6b22892 100644 --- a/src/Basics/BasicsGenericDestructor.cxx +++ b/src/Basics/BasicsGenericDestructor.cxx @@ -1,43 +1,46 @@ -// SALOME Basics : general SALOME definitions and tools (C++ part - no CORBA) +// Copyright (C) 2007-2021 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 // -// 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 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, or (at your option) any later version. // +// 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 Basics : general SALOME definitions and tools (C++ part - no CORBA) // File : BasicGenericDestructor.cxx // Author : Antoine YESSAYAN, Paul RASCLE, EDF // Module : SALOME // $Header$ - +// #include #include #include #include "BasicsGenericDestructor.hxx" -using namespace std; - void HouseKeeping(); std::list PROTECTED_DELETE::_objList; +#ifndef WIN32 pthread_mutex_t PROTECTED_DELETE::_listMutex; +#else +pthread_mutex_t PROTECTED_DELETE::_listMutex = + PTHREAD_MUTEX_INITIALIZER; +#endif std::list *GENERIC_DESTRUCTOR::Destructors = 0; static bool atExitSingletonDone = false ; @@ -56,17 +59,16 @@ void PROTECTED_DELETE::deleteInstance(PROTECTED_DELETE *anObject) return; else { - int ret; - ret = pthread_mutex_lock(&_listMutex); // acquire lock, an check again - if (std::find(_objList.begin(), _objList.end(), anObject) - != _objList.end()) - { - DEVTRACE("PROTECTED_DELETE::deleteInstance1 " << anObject); - delete anObject; - DEVTRACE("PROTECTED_DELETE::deleteInstance2 " << &_objList); - _objList.remove(anObject); - } - ret = pthread_mutex_unlock(&_listMutex); // release lock + pthread_mutex_lock(&_listMutex); // acquire lock, an check again + if (std::find(_objList.begin(), _objList.end(), anObject) + != _objList.end()) + { + DEVTRACE("PROTECTED_DELETE::deleteInstance1 " << anObject); + delete anObject; + DEVTRACE("PROTECTED_DELETE::deleteInstance2 " << &_objList); + _objList.remove(anObject); + } + pthread_mutex_unlock(&_listMutex); // release lock } } @@ -112,12 +114,16 @@ public: { if (Make_ATEXIT && !atExitSingletonDone) { - DEVTRACE("atExitSingleton(" << Make_ATEXIT << ")"); - assert(GENERIC_DESTRUCTOR::Destructors == 0); - GENERIC_DESTRUCTOR::Destructors = new std::list; - int cr = atexit(HouseKeeping); - assert(cr == 0); - atExitSingletonDone = true; + DEVTRACE("atExitSingleton(" << Make_ATEXIT << ")"); + assert(GENERIC_DESTRUCTOR::Destructors == 0); + GENERIC_DESTRUCTOR::Destructors = new std::list; +#ifndef _DEBUG_ + atexit(HouseKeeping); +#else + int cr = atexit(HouseKeeping); + assert(cr == 0); +#endif + atExitSingletonDone = true; } } @@ -146,16 +152,16 @@ void HouseKeeping( void ) if(GENERIC_DESTRUCTOR::Destructors->size()) { std::list::iterator it = - GENERIC_DESTRUCTOR::Destructors->end(); + GENERIC_DESTRUCTOR::Destructors->end(); do - { - it-- ; - GENERIC_DESTRUCTOR* ptr = *it ; - DEVTRACE("HouseKeeping() " << typeid(ptr).name()); - (*ptr)(); - delete ptr ; - } + { + it-- ; + GENERIC_DESTRUCTOR* ptr = *it ; + DEVTRACE("HouseKeeping() " << typeid(ptr).name()); + (*ptr)(); + delete ptr ; + } while (it != GENERIC_DESTRUCTOR::Destructors->begin()) ; DEVTRACE("HouseKeeping() end list "); @@ -167,6 +173,7 @@ void HouseKeeping( void ) delete GENERIC_DESTRUCTOR::Destructors; GENERIC_DESTRUCTOR::Destructors = 0; + atExitSingletonDone = false ; DEVTRACE("HouseKeeping() very end "); return ; } @@ -178,15 +185,15 @@ void HouseKeeping( void ) */ // ============================================================================ -const int GENERIC_DESTRUCTOR::Add(GENERIC_DESTRUCTOR &anObject) +int GENERIC_DESTRUCTOR::Add(GENERIC_DESTRUCTOR &anObject) { DEVTRACE("GENERIC_DESTRUCTOR::Add("<push_back(&anObject); - return Destructors->size(); + return (int)Destructors->size(); }