]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
The main thread is now used for the execution of python functions. It is because...
authorrahuel <rahuel@opencascade.com>
Wed, 8 Dec 2004 12:33:58 +0000 (12:33 +0000)
committerrahuel <rahuel@opencascade.com>
Wed, 8 Dec 2004 12:33:58 +0000 (12:33 +0000)
Now the orb is runned in another thread started from the main thread.

src/Container/SALOME_Container.cxx

index 02b2acce44006dfa262a76052d749ad8d235602e..e36ffa8e3d7a9f6123829a72ec7999bf4322b0de 100644 (file)
 
 #include <Python.h>
 
-using namespace std;
+void * run_orb_function( void * ) ;
 
-extern "C" void HandleServerSideSignals(CORBA::ORB_ptr theORB);
+using namespace std;
 
 static PyMethodDef MethodPyVoidMethod[] = {{ NULL, NULL }};
 
+Engines_Container_i * _TheContainer = NULL ;
+
+static int _argc ;
+static char ** _argv ;
+
 int main(int argc, char* argv[])
 {
+  _argc = argc ;
+  _argv = argv ;
 #ifdef HAVE_MPI2
   MPI_Init(&argc,&argv);
 #endif
+
+//A thread is created to run the orb
+//The main thread may be used to execute python function. It is a
+// requirement of python for signal handlers
+  pthread_t T;
+  int pthread_sts = pthread_create(&T , NULL , run_orb_function , NULL ) ;
+  if ( pthread_sts ) {
+    perror("Container main") ;
+    exit(pthread_sts) ;
+  }
+
+//Python initialization
+  PyEval_InitThreads() ;
+  Py_Initialize() ;
+  PySys_SetArgv( argc , argv ) ;
+  Py_InitModule( "InitPyRunMethod" , MethodPyVoidMethod ) ;
+
+//Waiting for the container object.
+  while ( _TheContainer == NULL ) {
+    sleep(1) ;
+  }
+
+//The main thread will wait a request for the execution of a python function
+  _TheContainer->WaitPythonFunction() ;
+
+  return 0 ;
+}
+
+//Running the orb
+void * run_orb_function( void * ) {
   // Initialise the ORB.
   ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
-  CORBA::ORB_var &orb = init( argc , argv ) ;
+  CORBA::ORB_var &orb = init( _argc , _argv ) ;
   LocalTraceCollector *myThreadTrace = LocalTraceCollector::instance(orb);
   INFOS_COMPILATION;
-  BEGIN_OF(argv[0]);
-    
-  Py_Initialize() ;
-  PySys_SetArgv( argc , argv ) ;
-  Py_InitModule( "InitPyRunMethod" , MethodPyVoidMethod ) ;
-  
+  BEGIN_OF(_argv[0]);
+
   try{
     // Obtain a reference to the root POA.
     // obtain the root poa manager
@@ -165,12 +198,12 @@ int main(int argc, char* argv[])
     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 );
+    _TheContainer 
+      = 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);
@@ -190,7 +223,7 @@ int main(int argc, char* argv[])
     timer.ShowAbsolute();
 #endif
     
-    HandleServerSideSignals(orb);
+    orb->run();
     
     orb->destroy();
   }catch(CORBA::SystemException&){
@@ -209,7 +242,7 @@ int main(int argc, char* argv[])
 #ifdef HAVE_MPI2
   MPI_Finalize();
 #endif
-  END_OF(argv[0]);
+  END_OF(_argv[0]);
   delete myThreadTrace;
   return 0 ;
 }