From 8107813f3db7d94dd269e6e952757acf325eb352 Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 1 Mar 2018 13:48:32 +0300 Subject: [PATCH] 23534: [CEA 2132] Removing pidof usage and improving KERNEL code --- src/Container/SALOME_ContainerManager.cxx | 80 ++++++++++------------- src/Container/SALOME_ContainerManager.hxx | 2 - 2 files changed, 34 insertions(+), 48 deletions(-) diff --git a/src/Container/SALOME_ContainerManager.cxx b/src/Container/SALOME_ContainerManager.cxx index 59693ea01..81ff3e15f 100644 --- a/src/Container/SALOME_ContainerManager.cxx +++ b/src/Container/SALOME_ContainerManager.cxx @@ -44,6 +44,7 @@ #ifdef HAVE_MPI2 #include +#include #endif #ifdef WIN32 @@ -107,40 +108,42 @@ SALOME_ContainerManager::SALOME_ContainerManager(CORBA::ORB_ptr orb, PortableSer urifile << GetenvThreadSafeAsString("HOME") << "/.urifile_" << getpid(); setenv("OMPI_URI_FILE",urifile.str().c_str(),1); if( GetenvThreadSafe("OMPI_URI_FILE") != NULL ){ - // get the pid of all ompi-server - std::set thepids1 = getpidofprogram("ompi-server"); - // launch a new ompi-server - std::string command; - command = "ompi-server -r "; - command += GetenvThreadSafeAsString("OMPI_URI_FILE"); - int status=SystemThreadSafe(command.c_str()); - if(status!=0) - throw SALOME_Exception("Error when launching ompi-server"); - // get the pid of all ompi-server - std::set thepids2 = getpidofprogram("ompi-server"); - // my ompi-server is the new one - std::set::const_iterator it; - for(it=thepids2.begin();it!=thepids2.end();it++) - if(thepids1.find(*it) == thepids1.end()) - _pid_mpiServer = *it; - if(_pid_mpiServer < 0) - throw SALOME_Exception("Error when getting ompi-server id"); + // Linux specific code + pid_t pid = fork(); // spawn a child process, following code is executed in both processes + if ( pid == 0 ) // I'm a child, replace myself with a new ompi-server + { + std::string uriarg = GetenvThreadSafeAsString("OMPI_URI_FILE"); + execlp( "ompi-server", "ompi-server", "-r", uriarg.c_str(), NULL ); + throw SALOME_Exception("Error when launching ompi-server"); // execlp failed + } + else if ( pid < 0 ) + { + throw SALOME_Exception("fork() failed"); + } + else // I'm a parent + { + //wait(NULL); // wait(?) for a child end + _pid_mpiServer = pid; + } } #elif defined(MPICH) _pid_mpiServer = -1; - // get the pid of all hydra_nameserver - std::set thepids1 = getpidofprogram("hydra_nameserver"); - // launch a new hydra_nameserver - std::string command; - command = "hydra_nameserver &"; - SystemThreadSafe(command.c_str()); - // get the pid of all hydra_nameserver - std::set thepids2 = getpidofprogram("hydra_nameserver"); - // my hydra_nameserver is the new one - std::set::const_iterator it; - for(it=thepids2.begin();it!=thepids2.end();it++) - if(thepids1.find(*it) == thepids1.end()) - _pid_mpiServer = *it; + // Linux specific code + pid_t pid = fork(); // spawn a child process, following code is executed in both processes + if ( pid == 0 ) // I'm a child, replace myself with a new hydra_nameserver + { + execlp( "hydra_nameserver", "hydra_nameserver", NULL ); + throw SALOME_Exception("Error when launching hydra_nameserver"); // execlp failed + } + else if ( pid < 0 ) + { + throw SALOME_Exception("fork() failed"); + } + else // I'm a parent + { + //wait(NULL); + _pid_mpiServer = pid; + } #endif #endif @@ -1294,21 +1297,6 @@ std::string SALOME_ContainerManager::machinesFile(const int nbproc) } -std::set SALOME_ContainerManager::getpidofprogram(const std::string program) -{ - std::set thepids; - std::string tmpFile = Kernel_Utils::GetTmpFileName(); - std::string cmd; - std::string thepid; - cmd = "pidof " + program + " > " + tmpFile; - SystemThreadSafe(cmd.c_str()); - std::ifstream fpi(tmpFile.c_str(),std::ios::in); - while(fpi >> thepid){ - thepids.insert(atoi(thepid.c_str())); - } - return thepids; -} - std::string SALOME_ContainerManager::getCommandToRunRemoteProcess(AccessProtocolType protocol, const std::string & hostname, const std::string & username) diff --git a/src/Container/SALOME_ContainerManager.hxx b/src/Container/SALOME_ContainerManager.hxx index e543d2074..3c3e2bbfd 100644 --- a/src/Container/SALOME_ContainerManager.hxx +++ b/src/Container/SALOME_ContainerManager.hxx @@ -89,8 +89,6 @@ protected: std::string machinesFile(const int nbproc); - std::set getpidofprogram(const std::string program); - static std::string getCommandToRunRemoteProcess(AccessProtocolType protocol, const std::string & hostname, const std::string & username); Engines::Container_ptr -- 2.39.2