]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
Fix problem with the python initialization on windows. rnv/py_win_fix
authorrnv <rnv@opencascade.com>
Wed, 9 Jul 2014 11:02:11 +0000 (15:02 +0400)
committerrnv <rnv@opencascade.com>
Wed, 9 Jul 2014 11:02:11 +0000 (15:02 +0400)
src/Container/Container_i.cxx
src/Container/Container_init_python.cxx

index 390b4740eb4a308fbf85bdef856b93bb32058686..a8a5f01473bc53a12d5d23a4128f023fd5342a3a 100644 (file)
@@ -201,15 +201,20 @@ Engines_Container_i::Engines_Container_i (CORBA::ORB_ptr orb,
     myCommand += "')\n";
     SCRUTE(myCommand);
 
-    // [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);
+    //[RNV]: Comment the PyEval_AcquireLock() and PyEval_ReleaseLock() because this 
+    //approach leads to the deadlock of the main thread of the application on Windows platform
+    //in case if cppContainer runs in the standalone mode. The problem with the PyThreadState 
+    //described by ABN seems not reproduced, to be checked carefully later...
+    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:    
+    //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
@@ -225,9 +230,9 @@ Engines_Container_i::Engines_Container_i (CORBA::ORB_ptr orb,
     PyObject *globals = PyModule_GetDict(mainmod);
     _pyCont = PyDict_GetItemString(globals, "pyCont");
 
-    PyThreadState_Swap(NULL);
-    PyEval_ReleaseLock();
-    //PyGILState_Release(gstate);
+    //PyThreadState_Swap(NULL);
+    //PyEval_ReleaseLock();
+    PyGILState_Release(gstate);
 
     fileTransfer_i* aFileTransfer = new fileTransfer_i();
     CORBA::Object_var obref=aFileTransfer->_this();
index 2034b6d0bc81a59725d2e9054c42cdc464a65441..7a9427c4af2027439ce7b13262009ba83d150342 100644 (file)
@@ -54,6 +54,7 @@ void KERNEL_PYTHON::init_python(int argc, char **argv)
   PySys_SetArgv(argc, argv);
   PyRun_SimpleString("import threading\n");
   PyEval_InitThreads(); // Create (and acquire) the interpreter lock
-  PyEval_ReleaseLock();  // Py_InitThreads acquires the GIL
+  PyThreadState *pts = PyGILState_GetThisThreadState(); 
+  PyEval_ReleaseThread(pts);  
 }