void setVerbosity(in boolean activated, in string level);
- //! Shutdown the Container process.
+ //! Shutdown the Container process. Shutdown is not immediate. It waits for all remaining invokation completion.
void Shutdown();
+ //! Shutdown the Container process. Shutdown is immediate for this method.
+ void ShutdownNow();
+
//! Returns the hostname of the container
string getHostName();
//! Currently: get, start, getorstart, findorstart, find
Container GiveContainer(in ContainerParameters params) raises (SALOME::SALOME_Exception);
- //! Shutdown all containers that have been launched by the container manager
+ //! Shutdown all containers that have been launched by the container manager. This termination is soft. It means that orb.shutdown is invoked meaning that completion of all CORBA
void ShutdownContainers();
+
+ //! Stronger version than ShutdownContainers. This method does not wait for completion of last CORBA invokation on containers. It terminates them
+ void ShutdownContainersNow();
long GetTimeOutToLaunchServerInSecond();
{
_pid = (long)getpid();
- if(ns)
+ if( isServantAloneInProcess )
ActSigIntHandler() ;
_argc = argc ;
*/
//=============================================================================
void Abstract_Engines_Container_i::Shutdown()
+{
+ ShutdownCommonPart();
+ if(_isServantAloneInProcess)
+ {
+ MESSAGE("Effective Shutdown of container Begins...");
+ try
+ {
+ if(!CORBA::is_nil(_orb))
+ _orb->shutdown(0);
+ }
+ catch(...)
+ {
+ }
+ MESSAGE("Effective Shutdown of container Ends...");
+ }
+}
+
+void Abstract_Engines_Container_i::ShutdownCommonPart()
{
MESSAGE("Engines_Container_i::Shutdown()");
{
}
MESSAGE("Engines_Container_i::Shutdown() -- step 4");
- //
- if(_isServantAloneInProcess)
+}
+
+void Abstract_Engines_Container_i::ShutdownNow()
+{
+ ShutdownCommonPart();if(_isServantAloneInProcess)
{
- MESSAGE("Effective Shutdown of container Begins...");
- if(!CORBA::is_nil(_orb))
- _orb->shutdown(0);
+ AutoGIL gstate;
+ AutoPyRef result = PyObject_CallMethod(_pyCont, (char*)"killMe", (char*)"",nullptr);
}
}
#self._log.destroy()# TODO : choose to destroy perf report or not. For the moment we keep the report
pass
+ def killMe(self):
+ import signal
+ os.kill( os.getpid() , signal.SIGTERM)
+
def setLogFileName(self, logFileName):
logging.debug("setLogFileName {} PID = {}".format(logFileName,os.getpid()))
if getSSLMode():
*/
//=============================================================================
-void SALOME_ContainerManager::ShutdownContainers()
+void SALOME_ContainerManager::ShutdownContainersGeneric(std::function<void(Engines::Container_ptr)> funcToBeCalledOnContainer)
{
- MESSAGE("ShutdownContainers");
+ MESSAGE("ShutdownContainersGeneric");
if(!_NS)
return ;
SALOME::Session_var session = SALOME::Session::_nil();
Engines::Container_var cont=Engines::Container::_narrow(obj);
if(!CORBA::is_nil(cont))
{
- MESSAGE("ShutdownContainers: " << (*iter));
- cont->Shutdown();
+ MESSAGE("ShutdownContainersGeneric: " << (*iter));
+ funcToBeCalledOnContainer( cont );
+ MESSAGE("ShutdownContainersGeneric: after call of shutdown" << (*iter));
}
else
- MESSAGE("ShutdownContainers: no container ref for " << (*iter));
+ MESSAGE("ShutdownContainersGeneric: no container ref for " << (*iter));
}
catch(CORBA::SystemException& e)
{
}
}
+void SALOME_ContainerManager::ShutdownContainers()
+{
+ this->ShutdownContainersGeneric( [](Engines::Container_ptr cont) { cont->Shutdown(); } );
+}
+
+void SALOME_ContainerManager::ShutdownContainersNow()
+{
+ this->ShutdownContainersGeneric( [](Engines::Container_ptr cont)
+ {
+ try
+ {
+ cont->ShutdownNow();
+ }
+ catch(...)
+ {
+ }
+ }
+ );
+}
+
void SALOME_ContainerManager::SetOverrideEnvForContainers(const Engines::KeyValDict& env)
{
this->_override_env.clear();
#include <vector>
#include <string>
#include <utility>
+#include <functional>
#include <set>
class SALOME_NamingService_Abstract;
void ShutdownContainers() override;
+ void ShutdownContainersNow() override;
+
void SetOverrideEnvForContainers(const Engines::KeyValDict& env) override;
Engines::KeyValDict *GetOverrideEnvForContainers() override;
static const char *_ContainerManagerNameInNS;
+private:
+
+ void ShutdownContainersGeneric(std::function<void(Engines::Container_ptr)> funcToBeCalledOnContainer);
+
protected:
// C++ methods
Engines::Container_ptr
// CASCatch_SignalsHandler aSignalsHandler;
try {
theORB->run();
+ INFOS("ORB run finished...");
// CCRT porting
// }catch(CORBA::SystemException&){
// Handle(Standard_Failure) aFail = Standard_Failure::Caught();
void verbosity(bool& activated, CORBA::String_out level) override;
void setVerbosity(bool activated, const char *level) override;
- virtual void Shutdown();
+ void Shutdown() override;
+ void ShutdownNow() override;
char *getHostName();
CORBA::Long getPID();
//! Kill current container
PortableServer::ObjectId *getCORBAId() const { return _id; }
public:
static const int DFT_TIME_INTERVAL_BTW_MEASURE;
+private:
+ void ShutdownCommonPart();
protected:
static std::map<std::string, int> _cntInstances_map;
static std::map<std::string, void *> _library_map; // library names, loaded