]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
New Python logic: simplified KERNEL's Python initialization.
authorAdrien Bruneton <adrien.bruneton@cea.fr>
Wed, 12 Feb 2014 13:44:53 +0000 (14:44 +0100)
committerAdrien Bruneton <adrien.bruneton@cea.fr>
Thu, 13 Feb 2014 09:02:15 +0000 (10:02 +0100)
Saving various thread states and global interpreter state is no more
needed when using only one global interpreter.

src/Container/Container_i.cxx
src/Container/Container_init_python.cxx
src/Container/Container_init_python.hxx

index c2fb5febf30cb172748050ef5b3720633ef83db6..8d9a382eb9ce5ffc5bde13676e9f8059136719c5 100644 (file)
@@ -201,7 +201,15 @@ Engines_Container_i::Engines_Container_i (CORBA::ORB_ptr orb,
     myCommand += "')\n";
     SCRUTE(myCommand);
 
-    PyGILState_STATE gstate = PyGILState_Ensure();
+    // [ABN]: using the PyGILState* API here is unstable. omniORB logic is invoked
+    // by the Python code executed below, and in some (random) cases, the Python code
+    // execution ends with a PyThreadState which was not the one we have here.
+    // (TODO: understand why ...)
+    // To be on the safe side we get and load the thread state ourselves:
+    //PyGILState_STATE gstate = PyGILState_Ensure();
+    PyEval_AcquireLock();  // get GIL
+    PyThreadState * mainThreadState = PyThreadState_Get();
+    PyThreadState_Swap(mainThreadState);
 
 #ifdef WIN32
     // mpv: this is temporary solution: there is a unregular crash if not
@@ -217,7 +225,9 @@ Engines_Container_i::Engines_Container_i (CORBA::ORB_ptr orb,
     PyObject *globals = PyModule_GetDict(mainmod);
     _pyCont = PyDict_GetItemString(globals, "pyCont");
 
-    PyGILState_Release(gstate);
+    PyThreadState_Swap(NULL);
+    PyEval_ReleaseLock();
+    //PyGILState_Release(gstate);
 
     fileTransfer_i* aFileTransfer = new fileTransfer_i();
     CORBA::Object_var obref=aFileTransfer->_this();
index 1d8168ee2ed8cbb4598a810c2022d5dec6412117..8c448bebca4d3db004c331aca96dabc5de146897 100644 (file)
 
 #include "Container_init_python.hxx"
 
-PyThreadState *KERNEL_PYTHON::_gtstate = 0;
-PyObject *KERNEL_PYTHON::salome_shared_modules_module = NULL;
-PyInterpreterState *KERNEL_PYTHON::_interp = NULL;
-
 void KERNEL_PYTHON::init_python(int argc, char **argv)
 {
   if (Py_IsInitialized())
     {
       MESSAGE("Python already initialized");
-      SCRUTE(KERNEL_PYTHON::_gtstate);
       return;
     }
   MESSAGE("=================================================================");
@@ -57,10 +52,7 @@ void KERNEL_PYTHON::init_python(int argc, char **argv)
     Py_SetProgramName(salome_python);
   Py_Initialize(); // Initialize the interpreter
   PySys_SetArgv(argc, argv);
-  KERNEL_PYTHON::_interp = PyThreadState_Get()->interp;
   PyEval_InitThreads(); // Create (and acquire) the interpreter lock
-  ASSERT(!KERNEL_PYTHON::_gtstate);
-  KERNEL_PYTHON::_gtstate = PyEval_SaveThread(); // Release global thread state
-  SCRUTE(KERNEL_PYTHON::_gtstate);
+  PyEval_ReleaseLock();  // Py_InitThreads acquires the GIL
 }
 
index 5bb76c5c9b1994ce81b816bf2c9c8784674f34f3..4cda886d25bfae903441980101093f697821fe35 100644 (file)
 
 
 #define Py_ACQUIRE_NEW_THREAD \
-  PyEval_AcquireLock(); \
-  PyThreadState *myTstate = PyThreadState_New(KERNEL_PYTHON::_interp); \
-  PyThreadState_Swap(myTstate);
+  PyGILState_STATE gil_state = PyGILState_Ensure();
 
 #define Py_RELEASE_NEW_THREAD \
-  PyEval_ReleaseThread(myTstate); \
-  PyThreadState_Delete(myTstate);
+  PyGILState_Release(gil_state);
 
 struct CONTAINER_EXPORT KERNEL_PYTHON
 {
-#ifdef WIN32
-  static PyThreadState *get_gtstate() { return KERNEL_PYTHON::_gtstate; }
-  static PyObject *getsalome_shared_modules_module() { return KERNEL_PYTHON::salome_shared_modules_module; }
-  static PyInterpreterState *get_interp() { return KERNEL_PYTHON::_interp; }
-#endif
-  static PyThreadState *_gtstate;
-  static PyObject *salome_shared_modules_module;
-  static PyInterpreterState *_interp;
-
   static void init_python(int argc, char **argv);
-
 };
 
 #endif