X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FContainer%2FSALOME_Container.cxx;h=5758f24cf02382c11d746ed539cad120af4f3b37;hb=e61c3f5e439eae3822cb22176c5493668e5a7df5;hp=f6f1884ff70a0fa602af6ed029cbd15429fcfda4;hpb=1bd1d38e86c39b13e265f8ff534fc1463c25fef3;p=modules%2Fkernel.git diff --git a/src/Container/SALOME_Container.cxx b/src/Container/SALOME_Container.cxx index f6f1884ff..5758f24cf 100644 --- a/src/Container/SALOME_Container.cxx +++ b/src/Container/SALOME_Container.cxx @@ -1,36 +1,49 @@ -// SALOME Container : implementation of container and engine for Kernel +// Copyright (C) 2007-2016 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, or (at your option) any later version. // -// 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 Container : implementation of container and engine for Kernel // File : SALOME_Container.cxx // Author : Paul RASCLE, EDF - MARC TAJCHMAN, CEA // Module : SALOME // $Header$ +// +#ifdef _MPI_SEQ_CONTAINER_ + #ifdef HAVE_MPI2 +#include + #endif +#endif #include +#include #include #include +#include +#ifndef WIN32 +# include +# include +#endif -#ifndef WNT + +#ifndef WIN32 #include #else #include @@ -39,27 +52,94 @@ #include "utilities.h" #include "Utils_ORB_INIT.hxx" #include "Utils_SINGLETON.hxx" -#include "SALOMETraceCollector.hxx" #include "OpUtil.hxx" #ifdef CHECKTIME #include #endif -#ifdef HAVE_MPI2 -#include +#include "Container_init_python.hxx" + +extern "C" void HandleServerSideSignals(CORBA::ORB_ptr theORB); + +#include +#include +#include +#ifndef WIN32 +# include #endif -#include "Container_init_python.hxx" +void AttachDebugger(); +void Handler(int); +void terminateHandler(); +void unexpectedHandler(); -using namespace std; +#ifndef WIN32 +void (* setsig(int, void (*)(int)))(int); -extern "C" void HandleServerSideSignals(CORBA::ORB_ptr theORB); +typedef void (*sighandler_t)(int); +sighandler_t setsig(int sig, sighandler_t handler) +{ + struct sigaction context, ocontext; + context.sa_handler = handler; + sigemptyset(&context.sa_mask); + context.sa_flags = 0; + if (sigaction(sig, &context, &ocontext) == -1) + return SIG_ERR; + return ocontext.sa_handler; +} +#endif //WIN32 + +void AttachDebugger() +{ +#ifndef WIN32 + if(getenv ("DEBUGGER")) + { + std::stringstream exec; + exec << "$DEBUGGER SALOME_Container " << getpid() << "&"; + std::cerr << exec.str() << std::endl; + system(exec.str().c_str()); + while(1); + } +#endif +} + +void Handler(int theSigId) +{ + std::cerr << "Signal= "<< theSigId << std::endl; + AttachDebugger(); + //to exit or not to exit + _exit(1); +} + +void terminateHandler(void) +{ + std::cerr << "Terminate: not managed exception !" << std::endl; + AttachDebugger(); +} + +void unexpectedHandler(void) +{ + std::cerr << "Unexpected: unexpected exception !" << std::endl; + AttachDebugger(); +} int main(int argc, char* argv[]) { -#ifdef HAVE_MPI2 +#ifdef _MPI_SEQ_CONTAINER_ + #ifdef HAVE_MPI2 MPI_Init(&argc,&argv); + #endif +#endif + +#ifndef WIN32 + if(getenv ("DEBUGGER")) + { + setsig(SIGSEGV,&Handler); + setsig(SIGFPE,&Handler); + std::set_terminate(&terminateHandler); + std::set_unexpected(&unexpectedHandler); + } #endif // Initialise the ORB. @@ -67,30 +147,18 @@ int main(int argc, char* argv[]) //CORBA::ORB_var orb = CORBA::ORB_init( argc , argv ) ; ORB_INIT &init = *SINGLETON_::Instance() ; ASSERT(SINGLETON_::IsAlreadyExisting()); - CORBA::ORB_var orb = init(0 , 0 ) ; - + CORBA::ORB_ptr orb = init(argc , argv ) ; + // LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); INFOS_COMPILATION; BEGIN_OF(argv[0]); ASSERT(argc > 1); SCRUTE(argv[1]); - bool isSupervContainer = false; - if (strcmp(argv[1],"SuperVisionContainer") == 0) isSupervContainer = true; - if (!isSupervContainer) - { - int _argc = 1; - char* _argv[] = {""}; - KERNEL_PYTHON::init_python(argc,argv); - } - else - { - Py_Initialize() ; - PySys_SetArgv( argc , argv ) ; - } + KERNEL_PYTHON::init_python(argc,argv); - char *containerName = ""; + char *containerName = (char *)""; if(argc > 1) { containerName = argv[1] ; @@ -105,14 +173,13 @@ int main(int argc, char* argv[]) PortableServer::POAManager_var pman = root_poa->the_POAManager(); // add new container to the kill list -#ifndef WNT - char aCommand[40]; - sprintf(aCommand, "addToKillList.py %d SALOME_Container", getpid()); - system(aCommand); +#ifndef WIN32 + std::stringstream aCommand ; + aCommand << "addToKillList.py " << getpid() << " SALOME_Container" << std::ends ; + system(aCommand.str().c_str()); #endif - Engines_Container_i * myContainer - = new Engines_Container_i(orb, root_poa, containerName , argc , argv ); + new Engines_Container_i(orb, root_poa, containerName , argc , argv ); pman->activate(); @@ -120,12 +187,20 @@ int main(int argc, char* argv[]) Utils_Timer timer; timer.Start(); timer.Stop(); - MESSAGE("SALOME_Registry_Server.cxx - orb->run()"); timer.ShowAbsolute(); #endif - + HandleServerSideSignals(orb); - + +//#define MEMORYLEAKS +#ifdef MEMORYLEAKS + PyGILState_Ensure(); + //Destroy orb from python (for chasing memory leaks) + PyRun_SimpleString("from omniORB import CORBA"); + PyRun_SimpleString("orb=CORBA.ORB_init([''], CORBA.ORB_ID)"); + PyRun_SimpleString("orb.destroy()"); + Py_Finalize(); +#endif } catch(CORBA::SystemException&) { @@ -148,13 +223,12 @@ int main(int argc, char* argv[]) INFOS("Caught unknown exception."); } -#ifdef HAVE_MPI2 +#ifdef _MPI_SEQ_CONTAINER_ + #ifdef HAVE_MPI2 MPI_Finalize(); -#endif + #endif +#endif - //END_OF(argv[0]); - //LocalTraceBufferPool* bp1 = LocalTraceBufferPool::instance(); - //bp1->deleteInstance(bp1); return 0 ; }