]> SALOME platform Git repositories - modules/med.git/commitdiff
Salome HOME
[MEDCalc] avoiding use of PyLockWrapper in MED component ...
authorabn <adrien.bruneton@cea.fr>
Thu, 28 Jul 2016 11:50:44 +0000 (13:50 +0200)
committerabn <adrien.bruneton@cea.fr>
Thu, 28 Jul 2016 11:50:44 +0000 (13:50 +0200)
src/MEDCalc/cmp/CMakeLists.txt
src/MEDCalc/cmp/MEDPresentation.cxx
src/MEDCalc/cmp/MEDPresentation.hxx
src/MEDCalc/cmp/MEDPresentation.txx
src/MEDCalc/cmp/MEDPresentationScalarMap.cxx
src/MEDCalc/cmp/MEDPyLockWrapper.hxx [new file with mode: 0644]

index 489d221ce5ed73b1f4c0107e555549e7c2aacbd8..22657a8ea12336aa7305166de93ed13293226c65 100644 (file)
@@ -29,7 +29,6 @@ INCLUDE_DIRECTORIES(
   ${CMAKE_CURRENT_BINARY_DIR}
   ${CMAKE_CURRENT_SOURCE_DIR}/..
   ${PROJECT_BINARY_DIR}/idl
-  ${GUI_INCLUDE_DIRS}  # For PyLockWrapper 
 )
 
 SET(COMMON_SOURCES
@@ -69,7 +68,6 @@ SET(COMMON_LIBS
   ${OMNIORB_LIBRARIES}
   ${PYTHON_LIBRARIES}
   ${MEDCoupling_medcoupling} ${MEDCoupling_medloader} ${MEDCoupling_medcouplingremapper}
-  ${GUI_PyInterp}
 )
 
 # This undefines the macros MIN and MAX which are specified in the windows headers
index e4bd9c9ae8abbf9abd60cdaa1d03d025544429af..88c4a2fcff981335ea8813bd997e9bbcdd1163e3 100644 (file)
@@ -18,6 +18,7 @@
 //
 // Authors: A Bruneton (CEA), C Aguerre (EdF)
 
+#include "MEDPyLockWrapper.hxx"
 #include "MEDFactoryClient.hxx"
 #include "MEDPresentation.hxx"
 #include "MEDPresentationException.hxx"
@@ -25,7 +26,6 @@
 #include <SALOME_KernelServices.hxx>
 #undef LOG
 #include <Basics_Utils.hxx>
-#include <PyInterp_Utils.h>
 
 #include <sstream>
 
@@ -80,7 +80,7 @@ MEDPresentation::~MEDPresentation()
 {
   STDLOG("~MEDPresentation(): clear display");
   {
-    PyLockWrapper lock;
+    MEDPyLockWrapper lock;
     std::ostringstream oss_o, oss_v, oss;
     oss_o << "__obj" << _objId;
     oss_v << "__view" << _renderViewPyId;
@@ -116,7 +116,7 @@ MEDPresentation::pushAndExecPyLine(const std::string & lin)
 void
 MEDPresentation::execPyLine(const std::string & lin)
 {
-  PyLockWrapper lock;
+  MEDPyLockWrapper lock;
 //  STDLOG("@@@@ MEDPresentation::execPyLine() about to exec >> " << lin);
   if(PyRun_SimpleString(lin.c_str()))
     {
@@ -196,7 +196,7 @@ MEDPresentation::getIntProperty(const std::string& propName) const
  void
  MEDPresentation::internalGeneratePipeline()
  {
-   PyLockWrapper lock;
+   MEDPyLockWrapper lock;
    pushAndExecPyLine( "import pvsimple as pvs;");
  }
 
@@ -328,7 +328,7 @@ MEDPresentation::GeneratePythonId()
 void
 MEDPresentation::activateView()
 {
-  PyLockWrapper lock;
+  MEDPyLockWrapper lock;
 
   std::ostringstream oss;
   oss << "pvs.SetActiveView(__view" << _renderViewPyId << ");";
@@ -360,7 +360,7 @@ MEDPresentation::paravisDump() const
 void
 MEDPresentation::fillAvailableFieldComponents()
 {
-  PyLockWrapper lock;  // GIL!
+  MEDPyLockWrapper lock;  // GIL!
 
   std::ostringstream oss_o;
   oss_o << "__obj" << _objId;      std::string obj(oss_o.str());
index 511abb44252e16cccca2baff78049ea0d06614da..cfb974a4b868c3de8e31964f837c1b3aef0601c2 100644 (file)
@@ -21,8 +21,8 @@
 #ifndef SRC_MEDCALC_CMP_MEDPRESENTATION_HXX_
 #define SRC_MEDCALC_CMP_MEDPRESENTATION_HXX_
 
-#include "MEDCouplingRefCountObject.hxx"
 #include <Python.h>
+#include "MEDCouplingRefCountObject.hxx"
 #include "MEDCALC.hxx"
 
 #include <SALOMEconfig.h>
index f4100e77bbfea009234bf097a38086acd8d13e5e..0e061fc20d17990b9d9a9484c6fe99cca053db38 100644 (file)
@@ -20,9 +20,9 @@
 #ifndef _MED_PRESENTATION_TXX_
 #define _MED_PRESENTATION_TXX_
 
+#include "MEDPyLockWrapper.hxx"
 #include <sstream>
 #include <SALOME_KernelServices.hxx>
-#include <PyInterp_Utils.h>
 
 template<typename PresentationType, typename PresentationParameters>
 void
@@ -89,7 +89,7 @@ MEDPresentation::updateComponent(const std::string& newCompo)
 
   // Update ParaView pipeline:
   {
-    PyLockWrapper lock;
+    MEDPyLockWrapper lock;
 
     std::ostringstream oss;
     std::string cmd = getComponentSelectionCommand();
@@ -117,7 +117,7 @@ MEDPresentation::updateColorMap(MEDCALC::MEDPresentationColorMap colorMap)
 
   // Update the pipeline:
   {
-    PyLockWrapper lock;
+    MEDPyLockWrapper lock;
     std::string cmd = getColorMapCommand();
     pushAndExecPyLine(cmd);
     pushAndExecPyLine("pvs.Render();");
@@ -142,7 +142,7 @@ MEDPresentation::updateScalarBarRange(MEDCALC::MEDPresentationScalarBarRange sbR
 
   // Update the pipeline:
   {
-    PyLockWrapper lock;
+    MEDPyLockWrapper lock;
     std::string cmd = getRescaleCommand();
     pushAndExecPyLine(cmd);
     pushAndExecPyLine("pvs.Render();");
index 9c0181b3e73db6c57e46624af4222d1c4d8e7c10..573a34b39a6717385d0138a8c32700c6b390f8a6 100644 (file)
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 
+#include "MEDPyLockWrapper.hxx"
+
 #include "MEDPresentationScalarMap.hxx"
 #include "MEDPresentationException.hxx"
 
-#include <PyInterp_Utils.h>
 #include <SALOME_KernelServices.hxx>
 #undef LOG  // should be fixed in KERNEL - double definition
 #include <Basics_Utils.hxx>
@@ -40,7 +41,7 @@ MEDPresentationScalarMap::internalGeneratePipeline()
 {
   MEDPresentation::internalGeneratePipeline();
 
-  PyLockWrapper lock;
+  MEDPyLockWrapper lock;
 
   std::ostringstream oss_o, oss_d,oss_l, oss, oss_v;
   oss_o << "__obj" << _objId;      std::string obj(oss_o.str());
diff --git a/src/MEDCalc/cmp/MEDPyLockWrapper.hxx b/src/MEDCalc/cmp/MEDPyLockWrapper.hxx
new file mode 100644 (file)
index 0000000..cf231f2
--- /dev/null
@@ -0,0 +1,76 @@
+// Copyright (C) 2011-2016  CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef SRC_MEDCALC_CMP_MEDPYLOCKWRAPPER_HXX_
+#define SRC_MEDCALC_CMP_MEDPYLOCKWRAPPER_HXX_
+
+#include <Python.h>
+
+#ifdef _DEBUG_
+  #include <iostream>
+#endif
+
+/**
+ * \class MEDPyLockWrapper
+ * \brief Python GIL wrapper. Copy of GUI's PyLockWrapper.
+ *
+ * Utility class wrapping the Python GIL acquisition. This makes use of the high level
+ * API (PyGILState_Ensure and PyGILState_Release), and is hence compatible with only
+ * one running Python interpreter (no call to Py_NewInterpreter()).
+ * When the class is instanciated the lock is acquired. It is released at destruction time.
+ * Copy construction (and hence assignation) is forbidden.
+ */
+class MEDPyLockWrapper
+{
+public:
+  /**
+   * \brief Constructor. Automatically acquires GIL.
+   */
+  MEDPyLockWrapper()
+  {
+    _gil_state = PyGILState_Ensure();
+    // Save current thread state for later comparison
+    _state = PyGILState_GetThisThreadState();
+  }
+
+  /**
+   * \brief Destructor. Automatically releases GIL.
+   */
+  ~MEDPyLockWrapper()
+  {
+    PyThreadState* _currState = PyGILState_GetThisThreadState();
+#ifdef _DEBUG_
+    if (_currState != _state)
+    {
+      std::cout << "!!!!!!!!! MEDPyLockWrapper inconsistency - now entering infinite loop for debugging\n";
+      while(1);
+    }
+#endif
+    PyGILState_Release(_gil_state);
+  }
+
+private:
+  PyGILState_STATE _gil_state;
+  PyThreadState* _state;
+
+  // "Rule of 3" - Forbid usage of copy operator and copy-constructor
+  MEDPyLockWrapper(const MEDPyLockWrapper & another);
+  const MEDPyLockWrapper & operator=(const MEDPyLockWrapper & another);
+};
+#endif /* SRC_MEDCALC_CMP_MEDPYLOCKWRAPPER_HXX_ */