Salome HOME
PR: modify makefiles to separate rules for libraries and binaries.
[modules/kernel.git] / src / Container / SALOME_Container.cxx
index ce8c05628e828dd287590121683474295a4cec21..dfd501e9ff11bc86d1c7747f82808b5c728d1a76 100644 (file)
 //  Module : SALOME
 //  $Header$
 
-using namespace std;
-using namespace std;
+#include <iostream>
+#include <string>
 #include <stdio.h>
 
-# include "Utils_ORB_INIT.hxx"
-# include "Utils_SINGLETON.hxx"
+//#include "Utils_ORB_INIT.hxx"
+//#include "Utils_SINGLETON.hxx"
+#include <unistd.h>
 #include "SALOME_NamingService.hxx"
 #include "SALOME_Container_i.hxx"
-#include <iostream>
-#include <string>
 #include "utilities.h"
+#include "SALOMETraceCollector.hxx"
 
-//#define CHECKTIME
 #ifdef CHECKTIME
 #include <Utils_Timer.hxx>
 #endif
 
+#ifdef HAVE_MPI2
+#include <mpi.h>
+#endif
+
 #include <Python.h>
 
-static PyMethodDef MethodPyVoidMethod[] = {
-  { NULL,        NULL }
-};
+using namespace std;
+
+extern "C" void HandleServerSideSignals(CORBA::ORB_ptr theORB);
+
+static PyMethodDef MethodPyVoidMethod[] = {{ NULL, NULL }};
 
 int main(int argc, char* argv[])
 {
+#ifdef HAVE_MPI2
+  MPI_Init(&argc,&argv);
+#endif
+  // Initialise the ORB.
+  //ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
+  CORBA::ORB_var orb = CORBA::ORB_init( argc , argv ) ;
+  SALOMETraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
   INFOS_COMPILATION;
-  BEGIN_OF(argv[0])
-
+  BEGIN_OF(argv[0]);
+    
   Py_Initialize() ;
   PySys_SetArgv( argc , argv ) ;
   Py_InitModule( "InitPyRunMethod" , MethodPyVoidMethod ) ;
-
-  try {
-    
-    // Initialise the ORB.
-//     CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
-    ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
-    ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting()) ;
-    CORBA::ORB_var &orb = init( argc , argv ) ;
+  
+  try{
     // Obtain a reference to the root POA.
     // obtain the root poa manager
     //
-    long TIMESleep = 250000000;
+    long TIMESleep = 500000000;
     int NumberOfTries = 40;
     int a;
     timespec ts_req;
@@ -83,20 +88,19 @@ int main(int argc, char* argv[])
     CORBA::Object_var theObj;
     CORBA::Object_var obj;
     CORBA::Object_var object;
-    SALOME_Logger::Logger_var log;
-    SALOME_NamingService &naming = *SINGLETON_<SALOME_NamingService>::Instance() ;
+    //SALOME_NamingService &naming = *SINGLETON_<SALOME_NamingService>::Instance() ;
     int CONTAINER=0;
     const char * Env = getenv("USE_LOGGER");
     int EnvL =0;
-    if ((Env!=NULL) && (strlen(Env)))
+    if(Env != NULL && strlen(Env))
       EnvL=1;
-
+    
     CosNaming::Name name;
     name.length(1);
     name[0].id=CORBA::string_dup("Logger");    
     PortableServer::POAManager_var pman; 
-    for (int i = 1; i<=NumberOfTries; i++){
-      if (i!=1) 
+    for(int i = 1; i <= NumberOfTries; i++){
+      if(i != 1) 
        a=nanosleep(&ts_req,&ts_rem);
       try{ 
        obj = orb->resolve_initial_references("RootPOA");
@@ -108,81 +112,44 @@ int main(int argc, char* argv[])
          theObj = orb->resolve_initial_references("NameService");
        if (!CORBA::is_nil(theObj))
          inc = CosNaming::NamingContext::_narrow(theObj);
+      }catch(CORBA::COMM_FAILURE&){
+       MESSAGE( "Container: CORBA::COMM_FAILURE: Unable to contact the Naming Service" );
       }
-      catch( CORBA::COMM_FAILURE& )
-       {
-         MESSAGE( "Container: CORBA::COMM_FAILURE: Unable to contact the Naming Service" )
+      if(!CORBA::is_nil(inc)){
+       MESSAGE( "Container: Naming Service was found" );
+       if(EnvL == 1){
+         for(int j = 1; j <= NumberOfTries; j++){
+           if(j != 1) 
+             a=nanosleep(&ts_req, &ts_rem);
+           try{
+             object = inc->resolve(name);
+           }catch(CosNaming::NamingContext::NotFound){
+             MESSAGE( "Container: Logger Server wasn't found" );
+           }catch(...){
+             MESSAGE( "Container: Unknown exception" );
+           }
+           if(!CORBA::is_nil(object)){
+             MESSAGE( "Container: Logger Server was found" );
+             CONTAINER = 1;
+             break;
            }
-      if(!CORBA::is_nil(inc)) {
-       MESSAGE( "Container: Naming Service was found" )
-         if(EnvL==1){
-           for(int j=1; j<=NumberOfTries; j++){
-             if (j!=1) 
-               a=nanosleep(&ts_req, &ts_rem);
-             try{
-                   object = inc->resolve(name);
-                 }
-                 catch(CosNaming::NamingContext::NotFound){ MESSAGE( "Container: Logger Server wasn't found" ) }
-                 catch(...){ MESSAGE( "Container: Unknown exception" ) }
-                 if (!CORBA::is_nil(object))
-                   log = SALOME_Logger::Logger::_narrow(object);
-                 if (!CORBA::is_nil(log)){
-                   MESSAGE( "Container: Logger Server was found" )
-                     log->ping();
-                    CONTAINER=1;
-                   break;
-                 }
-               }}
          }
-      if ((CONTAINER==1)||((EnvL==0)&&(!CORBA::is_nil(inc))))
-            break;
-             }    
-
-     // 
-    // define policy objects     
-    PortableServer::ImplicitActivationPolicy_var implicitActivation =
-      root_poa->create_implicit_activation_policy(PortableServer::NO_IMPLICIT_ACTIVATION) ;
-
-    // default = NO_IMPLICIT_ACTIVATION
-    PortableServer::ThreadPolicy_var threadPolicy =
-      root_poa->create_thread_policy(PortableServer::ORB_CTRL_MODEL) ;
-    // default = ORB_CTRL_MODEL, other choice SINGLE_THREAD_MODEL
-    
-    // create policy list
-    CORBA::PolicyList policyList;
-    policyList.length(2);
-    policyList[0] = PortableServer::ImplicitActivationPolicy::_duplicate(implicitActivation) ;
-    policyList[1] = PortableServer::ThreadPolicy::_duplicate(threadPolicy) ;
-
-    // create the child POA
-    PortableServer::POAManager_var nil_mgr = PortableServer::POAManager::_nil() ;
-    PortableServer::POA_var factory_poa =
-      root_poa->create_POA("factory_poa", pman, policyList) ;
-      //with nil_mgr instead of pman, a new POA manager is created with the new POA
+       }
+      }
+      if(CONTAINER == 1 || (EnvL == 0 && !CORBA::is_nil(inc)))
+       break;
+    }
     
-    // destroy policy objects
-    implicitActivation->destroy() ;
-    threadPolicy->destroy() ;
-
     char *containerName = "";
-    if (argc >1) 
-    {
-       containerName = argv[1] ;
+    if(argc > 1){
+      containerName = argv[1] ;
     }
     
     Engines_Container_i * myContainer 
-     = new Engines_Container_i(orb, factory_poa, containerName , argc , argv );
-
-//     Engines_Container_i * myContainer 
-//      = new Engines_Container_i(string(argv[1]),string(argv[2]), orb, factory_poa);
+      = new Engines_Container_i(orb, root_poa, containerName , argc , argv );
 
-    // use naming service
-//     myContainer->_NS.init_orb(orb);
-//     Engines::Container_ptr pCont = Engines::Container::_narrow(myContainer->_this());
-//     myContainer->_NS.Register(pCont, argv[2]); 
-    
     pman->activate();
-
+    
 #ifdef CHECKTIME
     Utils_Timer timer;
     timer.Start();
@@ -190,30 +157,26 @@ int main(int argc, char* argv[])
     MESSAGE("SALOME_Registry_Server.cxx - orb->run()");
     timer.ShowAbsolute();
 #endif
-    orb->run();
-
-    orb->destroy();
-  }
-  catch(CORBA::SystemException&)
-  {
-    INFOS("Caught CORBA::SystemException.")
-  }
-  catch(PortableServer::POA::WrongPolicy&)
-  {
-    INFOS("Caught CORBA::WrongPolicyException.")
-  }
-  catch(PortableServer::POA::ServantAlreadyActive&)
-  {
-    INFOS("Caught CORBA::ServantAlreadyActiveException")
-  }
-  catch(CORBA::Exception&)
-  {
-    INFOS("Caught CORBA::Exception.")
-  }
-  catch(...)
-  {
-    INFOS("Caught unknown exception.")
+    
+    HandleServerSideSignals(orb);
+  }catch(CORBA::SystemException&){
+    INFOS("Caught CORBA::SystemException.");
+  }catch(PortableServer::POA::WrongPolicy&){
+    INFOS("Caught CORBA::WrongPolicyException.");
+  }catch(PortableServer::POA::ServantAlreadyActive&){
+    INFOS("Caught CORBA::ServantAlreadyActiveException");
+  }catch(CORBA::Exception&){
+    INFOS("Caught CORBA::Exception.");
+  }catch(std::exception& exc){
+    INFOS("Caught std::exception - "<<exc.what()); 
+  }catch(...){
+    INFOS("Caught unknown exception.");
   }
+#ifdef HAVE_MPI2
+  MPI_Finalize();
+#endif
   END_OF(argv[0]);
+  delete myThreadTrace;
+  return 0 ;
 }