From b8c11ef5f7391374a13a6c7a09d738df72d0ca70 Mon Sep 17 00:00:00 2001 From: Anthony Geay Date: Tue, 24 Aug 2021 16:43:12 +0200 Subject: [PATCH] Fix error in SALOME_ExternalServerLauncher in SSL mode --- src/Basics/PythonCppUtils.hxx | 49 ++++++++++++++++++++++++++ src/Container/SALOME_CPythonHelper.cxx | 6 +++- 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 src/Basics/PythonCppUtils.hxx diff --git a/src/Basics/PythonCppUtils.hxx b/src/Basics/PythonCppUtils.hxx new file mode 100644 index 000000000..dd724c153 --- /dev/null +++ b/src/Basics/PythonCppUtils.hxx @@ -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 + +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; +}; diff --git a/src/Container/SALOME_CPythonHelper.cxx b/src/Container/SALOME_CPythonHelper.cxx index e536fe205..f19a05f88 100644 --- a/src/Container/SALOME_CPythonHelper.cxx +++ b/src/Container/SALOME_CPythonHelper.cxx @@ -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 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 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); } -- 2.39.2