]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
Fix error in SALOME_ExternalServerLauncher in SSL mode
authorAnthony Geay <anthony.geay@edf.fr>
Tue, 24 Aug 2021 14:43:12 +0000 (16:43 +0200)
committerAnthony Geay <anthony.geay@edf.fr>
Tue, 24 Aug 2021 14:43:12 +0000 (16:43 +0200)
src/Basics/PythonCppUtils.hxx [new file with mode: 0644]
src/Container/SALOME_CPythonHelper.cxx

diff --git a/src/Basics/PythonCppUtils.hxx b/src/Basics/PythonCppUtils.hxx
new file mode 100644 (file)
index 0000000..dd724c1
--- /dev/null
@@ -0,0 +1,49 @@
+// Copyright (C) 2021  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
+//
+
+#pragma once
+
+#include <Python.h>
+
+class AutoGIL
+{
+public:
+  AutoGIL():_gstate(PyGILState_Ensure()) { }
+  ~AutoGIL() { PyGILState_Release(_gstate); }
+private:
+  PyGILState_STATE _gstate;
+};
+
+class AutoPyRef
+{
+public:
+  AutoPyRef(PyObject *pyobj=nullptr):_pyobj(pyobj) { }
+  ~AutoPyRef() { release(); }
+  AutoPyRef(const AutoPyRef& other):_pyobj(other._pyobj) { if(_pyobj) Py_XINCREF(_pyobj); }
+  AutoPyRef& operator=(const AutoPyRef& other) { if(_pyobj==other._pyobj) return *this; release(); _pyobj=other._pyobj; Py_XINCREF(_pyobj); return *this; }
+  operator PyObject *() { return _pyobj; }
+  void set(PyObject *pyobj) { if(pyobj==_pyobj) return ; release(); _pyobj=pyobj; }
+  PyObject *get() { return _pyobj; }
+  bool isNull() const { return _pyobj==0; }
+  PyObject *retn() { if(_pyobj) Py_XINCREF(_pyobj); return _pyobj; }
+private:
+  void release() { if(_pyobj) Py_XDECREF(_pyobj); _pyobj=0; }
+private:
+  PyObject *_pyobj = nullptr;
+};
index e536fe20525599641ec92bf5d6933164d5670502..f19a05f88c5db829f121810cc6f9d803676b7d04 100644 (file)
@@ -19,6 +19,7 @@
 // Author : Anthony GEAY (EDF R&D)
 
 #include "SALOME_CPythonHelper.hxx"
+#include "PythonCppUtils.hxx"
 
 SALOME_CPythonHelper *SALOME_CPythonHelper::_CPYTHONHELPER_INSTANCE = nullptr;
 
@@ -78,6 +79,7 @@ void SALOME_CPythonHelper::initializePython(int argc, char *argv[])
 
 void SALOME_CPythonHelper::registerToSalomePiDict(const std::string& processName, long pid) const
 {
+  AutoGIL agil;
   PyObject *mod(PyImport_ImportModule("addToKillList"));//new value
   if(!mod)
     return;
@@ -96,6 +98,7 @@ void SALOME_CPythonHelper::registerToSalomePiDict(const std::string& processName
 
 std::vector<long> SALOME_CPythonHelper::evalVL(const std::string& pyCode) const
 {
+  AutoGIL agil;
   PyObject* code(Py_CompileString(pyCode.c_str(),"evalVL.py", Py_eval_input));
   PyObject *res(PyEval_EvalCode( code, _globals, _locals));
   Py_DECREF(code);
@@ -112,6 +115,7 @@ std::vector<long> SALOME_CPythonHelper::evalVL(const std::string& pyCode) const
 
 std::string SALOME_CPythonHelper::evalS(const std::string& pyCode) const
 {
+  AutoGIL agil;
   PyObject* code(Py_CompileString(pyCode.c_str(),"evalS.py", Py_eval_input));
   PyObject *res(PyEval_EvalCode( code, _globals, _locals));
   Py_DECREF(code);
@@ -126,7 +130,7 @@ SALOME_CPythonHelper::~SALOME_CPythonHelper()
   // _globals is borrowed ref -> do nothing
 
   /*if(_locals){ auto refcount_locals = Py_REFCNT(_locals); }*/
-  
+  AutoGIL agil;
   Py_XDECREF(_locals);
   Py_XDECREF(_pickler);
 }