X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FContainer%2FSALOME_Container.cxx;h=fb89c99f5a5e81c86d10c240e5aec652c035f531;hb=cbeb1b9ad4789b0fe4ea7f8efcaf98f7f8fec2f6;hp=a97bb39dc028626ebda6aaf8f79569392ac0feb8;hpb=8d460095eb020326e642fd2021c1f613e785b744;p=modules%2Fkernel.git diff --git a/src/Container/SALOME_Container.cxx b/src/Container/SALOME_Container.cxx index a97bb39dc..fb89c99f5 100644 --- a/src/Container/SALOME_Container.cxx +++ b/src/Container/SALOME_Container.cxx @@ -1,40 +1,49 @@ -// SALOME Container : implementation of container and engine for Kernel +// Copyright (C) 2007-2010 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 Container : implementation of container and engine for Kernel // File : SALOME_Container.cxx // Author : Paul RASCLE, EDF - MARC TAJCHMAN, CEA // Module : SALOME // $Header$ - -#ifdef HAVE_MPI2 +// +#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 @@ -43,7 +52,6 @@ #include "utilities.h" #include "Utils_ORB_INIT.hxx" #include "Utils_SINGLETON.hxx" -#include "SALOMETraceCollector.hxx" #include "OpUtil.hxx" #ifdef CHECKTIME @@ -52,14 +60,86 @@ #include "Container_init_python.hxx" -using namespace std; - extern "C" void HandleServerSideSignals(CORBA::ORB_ptr theORB); +#include +#include +#include +#ifndef WIN32 +# include +#endif + +void AttachDebugger(); +void Handler(int); +void terminateHandler(); +void unexpectedHandler(); + +#ifndef WIN32 +void (* setsig(int, void (*)(int)))(int); + +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 ; }