From d26a8cc7ebe060b8e93d82eb081e6cc365f89dd7 Mon Sep 17 00:00:00 2001 From: Anthony Geay Date: Thu, 15 Apr 2021 22:47:30 +0200 Subject: [PATCH] Lancement depuis SALOME_ContainerManager de SALOME_Container ou de SALOME_Container_No_NS_Serv --- src/Container/CMakeLists.txt | 14 +- src/Container/SALOME_Container.cxx | 217 +--------------- src/Container/SALOME_ContainerManager.cxx | 21 +- src/Container/SALOME_Container_Common.cxx | 237 ++++++++++++++++++ src/Container/SALOME_Container_Common.hxx | 27 ++ src/Container/SALOME_Container_No_NS_Serv.cxx | 38 +++ .../SALOME_Embedded_NamingService.cxx | 13 + .../SALOME_Embedded_NamingService.hxx | 2 + 8 files changed, 349 insertions(+), 220 deletions(-) create mode 100644 src/Container/SALOME_Container_Common.cxx create mode 100644 src/Container/SALOME_Container_Common.hxx create mode 100644 src/Container/SALOME_Container_No_NS_Serv.cxx diff --git a/src/Container/CMakeLists.txt b/src/Container/CMakeLists.txt index 01a46f711..7ff7cf0da 100644 --- a/src/Container/CMakeLists.txt +++ b/src/Container/CMakeLists.txt @@ -33,6 +33,7 @@ INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/../HDFPersist ${CMAKE_CURRENT_SOURCE_DIR}/../GenericObj ${CMAKE_CURRENT_SOURCE_DIR}/../SALOMETraceCollector/Test + ${CMAKE_CURRENT_SOURCE_DIR}/../KernelHelpers ${PROJECT_BINARY_DIR}/idl ) @@ -96,14 +97,21 @@ SET(SALOME_Container_LIBS ${MPI_LIBRARIES} ) -ADD_EXECUTABLE(SALOME_Container SALOME_Container.cxx SALOME_Container_SignalsHandler.cxx) -TARGET_LINK_LIBRARIES(SALOME_Container ${SALOME_Container_LIBS}) +ADD_LIBRARY(SalomeContainerServer SALOME_Container_Common.cxx SALOME_Container_SignalsHandler.cxx) +TARGET_LINK_LIBRARIES(SalomeContainerServer ${SALOME_Container_LIBS}) +INSTALL(TARGETS SalomeContainerServer EXPORT ${PROJECT_NAME}TargetGroup DESTINATION ${SALOME_INSTALL_LIBS}) + +ADD_EXECUTABLE(SALOME_Container SALOME_Container.cxx) +TARGET_LINK_LIBRARIES(SALOME_Container SalomeContainerServer) + +ADD_EXECUTABLE(SALOME_Container_No_NS_Serv SALOME_Container_No_NS_Serv.cxx) +TARGET_LINK_LIBRARIES(SALOME_Container_No_NS_Serv SalomeContainerServer) IF(SALOME_BUILD_TESTS) ADD_EXECUTABLE(TestSalome_file TestSalome_file.cxx) TARGET_LINK_LIBRARIES(TestSalome_file SALOMETraceCollectorTest ${SALOME_Container_LIBS}) ENDIF() -INSTALL(TARGETS SALOME_Container DESTINATION ${SALOME_INSTALL_BINS}) +INSTALL(TARGETS SALOME_Container SALOME_Container_No_NS_Serv DESTINATION ${SALOME_INSTALL_BINS}) # Executable scripts to be installed SALOME_INSTALL_SCRIPTS("${SCRIPTS}" ${SALOME_INSTALL_SCRIPT_PYTHON}) diff --git a/src/Container/SALOME_Container.cxx b/src/Container/SALOME_Container.cxx index 7c9c937c8..1f83edc48 100644 --- a/src/Container/SALOME_Container.cxx +++ b/src/Container/SALOME_Container.cxx @@ -1,7 +1,4 @@ -// 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) 2021 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -20,215 +17,11 @@ // 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 WIN32 -#include -#else -#include -#endif -#include "SALOME_Container_i.hxx" -#include "utilities.h" -#include "Utils_ORB_INIT.hxx" -#include "Utils_SINGLETON.hxx" -#include "OpUtil.hxx" - -#ifdef CHECKTIME -#include -#endif - -#include "Container_init_python.hxx" - -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(); -} +#include "SALOME_Container_Common.hxx" +#include "SALOME_NamingService.hxx" int main(int argc, char* argv[]) { -#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. - //SRN: BugID: IPAL9541, it's necessary to set a size of one message to be at least 100Mb - //CORBA::ORB_var orb = CORBA::ORB_init( argc , argv ) ; - ORB_INIT &init = *SINGLETON_::Instance() ; - ASSERT(SINGLETON_::IsAlreadyExisting()); - CORBA::ORB_ptr orb = init(argc , argv ) ; - - // LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); - INFOS_COMPILATION; - BEGIN_OF(argv[0]); - - ASSERT(argc > 1); - SCRUTE(argv[1]); - - KERNEL_PYTHON::init_python(argc,argv); - - char *containerName = (char *)""; - if(argc > 1) - { - containerName = argv[1] ; - } - - try - { - CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); - ASSERT(!CORBA::is_nil(obj)); - PortableServer::POA_var root_poa = PortableServer::POA::_narrow(obj); - - PortableServer::POAManager_var pman = root_poa->the_POAManager(); - - // add new container to the kill list -#ifndef WIN32 - std::stringstream aCommand ; - aCommand << "addToKillList.py " << getpid() << " SALOME_Container" << std::ends ; - system(aCommand.str().c_str()); -#endif - - new Engines_Container_i(orb, root_poa, containerName , argc , argv ); - - pman->activate(); - -#ifdef CHECKTIME - Utils_Timer timer; - timer.Start(); - timer.Stop(); - 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&) - { - INFOS("Caught CORBA::SystemException."); - } - catch(PortableServer::POA::ServantAlreadyActive&) - { - INFOS("Caught CORBA::ServantAlreadyActiveException"); - } - catch(CORBA::Exception&) - { - INFOS("Caught CORBA::Exception."); - } - catch(std::exception& exc) - { - INFOS("Caught std::exception - "< ns(new SALOME_NamingService); + return container_common_main(argc,argv,std::move(ns)); } - diff --git a/src/Container/SALOME_ContainerManager.cxx b/src/Container/SALOME_ContainerManager.cxx index 4ffda5ca6..f709319f2 100644 --- a/src/Container/SALOME_ContainerManager.cxx +++ b/src/Container/SALOME_ContainerManager.cxx @@ -25,6 +25,7 @@ #include "SALOME_LoadRateManager.hxx" #include "SALOME_NamingService.hxx" #include "SALOME_ResourcesManager_Client.hxx" +#include "SALOME_Embedded_NamingService.hxx" #include "SALOME_ModuleCatalog.hh" #include "Basics_Utils.hxx" #include "Basics_DirUtils.hxx" @@ -469,7 +470,7 @@ SALOME_ContainerManager::LaunchContainer(const Engines::ContainerParameters& par // Mpi already tested in step 5, specific code on BuildCommandToLaunch Local/Remote Container methods // TODO -> separates Mpi from Classic/Exe // Classic or Exe ? - std::string container_exe = "SALOME_Container"; // Classic container + std::string container_exe = this->_isSSL ? "SALOME_Container_No_NS_Serv" : "SALOME_Container"; // Classic container Engines::ContainerParameters local_params(params); int found=0; try @@ -864,11 +865,21 @@ std::string SALOME_ContainerManager::BuildCommandToLaunchLocalContainer(const En o << container_exe + " "; } + + o << _NS->ContainerName(params) << " "; - o << _NS->ContainerName(params); - o << " -"; - AddOmninamesParams(o); - + if( this->_isSSL ) + { + Engines::EmbeddedNamingService_var ns = GetEmbeddedNamingService(); + CORBA::String_var iorNS = _orb->object_to_string(ns); + o << iorNS; + } + else + { + o << "-"; + AddOmninamesParams(o); + } + std::ofstream command_file( tmpFileName.c_str() ); command_file << o.str(); command_file.close(); diff --git a/src/Container/SALOME_Container_Common.cxx b/src/Container/SALOME_Container_Common.cxx new file mode 100644 index 000000000..be0512aea --- /dev/null +++ b/src/Container/SALOME_Container_Common.cxx @@ -0,0 +1,237 @@ +// 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 +// +// 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 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 WIN32 +#include +#else +#include +#endif +#include "SALOME_Container_i.hxx" +#include "utilities.h" +#include "Utils_ORB_INIT.hxx" +#include "Utils_SINGLETON.hxx" +#include "OpUtil.hxx" + +#ifdef CHECKTIME +#include +#endif + +#include "Container_init_python.hxx" + +extern "C" void HandleServerSideSignals(CORBA::ORB_ptr theORB); + +#include +#include +#include +#ifndef WIN32 +# include +#endif + +#include + +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 container_common_main(int argc, char* argv[], std::unique_ptr ns) +{ +#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. + //SRN: BugID: IPAL9541, it's necessary to set a size of one message to be at least 100Mb + //CORBA::ORB_var orb = CORBA::ORB_init( argc , argv ) ; + ORB_INIT &init = *SINGLETON_::Instance() ; + ASSERT(SINGLETON_::IsAlreadyExisting()); + CORBA::ORB_ptr orb = init(argc , argv ) ; + + // LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); + INFOS_COMPILATION; + BEGIN_OF(argv[0]); + + ASSERT(argc > 1); + SCRUTE(argv[1]); + + KERNEL_PYTHON::init_python(argc,argv); + + char *containerName = (char *)""; + if(argc > 1) + { + containerName = argv[1] ; + } + + try + { + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + ASSERT(!CORBA::is_nil(obj)); + PortableServer::POA_var root_poa = PortableServer::POA::_narrow(obj); + + PortableServer::POAManager_var pman = root_poa->the_POAManager(); + + // add new container to the kill list +#ifndef WIN32 + std::stringstream aCommand ; + aCommand << "addToKillList.py " << getpid() << " SALOME_Container" << std::ends ; + system(aCommand.str().c_str()); +#endif + + new Engines_Container_i(orb, root_poa, containerName , argc , argv, ns.get() ); + ns.release(); + + pman->activate(); + +#ifdef CHECKTIME + Utils_Timer timer; + timer.Start(); + timer.Stop(); + 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&) + { + INFOS("Caught CORBA::SystemException."); + } + catch(PortableServer::POA::ServantAlreadyActive&) + { + INFOS("Caught CORBA::ServantAlreadyActiveException"); + } + catch(CORBA::Exception&) + { + INFOS("Caught CORBA::Exception."); + } + catch(std::exception& exc) + { + INFOS("Caught std::exception - "< + +int CONTAINER_EXPORT container_common_main(int argc, char* argv[], std::unique_ptr ns); diff --git a/src/Container/SALOME_Container_No_NS_Serv.cxx b/src/Container/SALOME_Container_No_NS_Serv.cxx new file mode 100644 index 000000000..6d8018450 --- /dev/null +++ b/src/Container/SALOME_Container_No_NS_Serv.cxx @@ -0,0 +1,38 @@ +// Copyright (C) 2021 CEA/DEN, EDF R&D +// +// 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 +// + +#include "SALOME_Container_Common.hxx" +#include "SALOME_Embedded_NamingService_Client.hxx" +#include "Utils_SALOME_Exception.hxx" +#include "SALOME_KernelORB.hxx" + +int main(int argc, char* argv[]) +{ + if(argc<3) + THROW_SALOME_EXCEPTION( "SALOME_Container_No_NS_Serv : requires 2 input arguments " ); + CORBA::ORB_ptr orb(KERNEL::getORB()); + CORBA::Object_var ns_serv_obj_base = orb->string_to_object(argv[2]); + if( CORBA::is_nil(ns_serv_obj_base) ) + THROW_SALOME_EXCEPTION( "SALOME_Container_No_NS_Serv : argument 2 is NOT a valid IOR" ); + Engines::EmbeddedNamingService_var ns_serv_obj = Engines::EmbeddedNamingService::_narrow(ns_serv_obj_base); + if( CORBA::is_nil(ns_serv_obj) ) + THROW_SALOME_EXCEPTION( "SALOME_Container_No_NS_Serv : argument 2 is NOT a valid IOR of Engines::EmbeddedNamingService" ); + std::unique_ptr ns( new SALOME_Embedded_NamingService_Client(ns_serv_obj) ); + return container_common_main(argc,argv,std::move(ns)); +} diff --git a/src/NamingService/SALOME_Embedded_NamingService.cxx b/src/NamingService/SALOME_Embedded_NamingService.cxx index b9f57913f..284455be4 100644 --- a/src/NamingService/SALOME_Embedded_NamingService.cxx +++ b/src/NamingService/SALOME_Embedded_NamingService.cxx @@ -24,6 +24,19 @@ #include #include +static Engines::EmbeddedNamingService_var _embedded_ns_singleton; + +Engines::EmbeddedNamingService_var GetEmbeddedNamingService() +{ + if( CORBA::is_nil(_embedded_ns_singleton) ) + { + std::unique_ptr servant(new SALOME_Embedded_NamingService); + _embedded_ns_singleton = servant->_this(); + servant->_remove_ref(); + } + return _embedded_ns_singleton; +} + void SALOME_Embedded_NamingService::Register(const Engines::IORType& ObjRef, const char *Path) { SALOME_Fake_NamingService ns; diff --git a/src/NamingService/SALOME_Embedded_NamingService.hxx b/src/NamingService/SALOME_Embedded_NamingService.hxx index 8a152aa17..1fde6b39a 100644 --- a/src/NamingService/SALOME_Embedded_NamingService.hxx +++ b/src/NamingService/SALOME_Embedded_NamingService.hxx @@ -24,6 +24,8 @@ #include #include CORBA_CLIENT_HEADER(SALOME_Embedded_NamingService) +Engines::EmbeddedNamingService_var NAMINGSERVICE_EXPORT GetEmbeddedNamingService(); + class NAMINGSERVICE_EXPORT SALOME_Embedded_NamingService : public virtual POA_Engines::EmbeddedNamingService { public: -- 2.39.2