From: Ovidiu Mircescu Date: Mon, 21 Mar 2022 15:58:23 +0000 (+0100) Subject: pickle.load concurrency issue X-Git-Tag: V9_9_0a2^0 X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fyacs.git;a=commitdiff_plain;h=13ca785a6bf36d005ee74eba2bc28d0cf4f8dca7 pickle.load concurrency issue see https://bugs.python.org/issue12680 for EDF see https://forge.pleiade.edf.fr/issues/24894 --- diff --git a/src/runtime/PythonNode.cxx b/src/runtime/PythonNode.cxx index fbc60bb49..66c7aae24 100644 --- a/src/runtime/PythonNode.cxx +++ b/src/runtime/PythonNode.cxx @@ -77,6 +77,12 @@ const char PyFuncNode::SCRIPT_FOR_SERIALIZATION[]="import pickle\n" " args=pickle.loads(st)\n" " return args\n"; +// pickle.load concurrency issue : see https://bugs.python.org/issue12680 +#if PY_VERSION_HEX < 0x03070000 +#include +static std::mutex data_mutex; +#endif + PythonEntry::PythonEntry():_context(0),_pyfuncSer(0),_pyfuncUnser(0),_pyfuncSimpleSer(0) { } @@ -185,6 +191,9 @@ void PythonEntry::loadRemoteContext(InlineNode *reqNode, Engines::Container_ptr Engines::PyNodeBase_var pynode(getRemoteInterpreterHandle()); /// { +#if PY_VERSION_HEX < 0x03070000 + std::unique_lock lock(data_mutex); +#endif AutoGIL agil; const char *picklizeScript(getSerializationScript()); PyObject *res=PyRun_String(picklizeScript,Py_file_input,_context,_context); @@ -412,6 +421,9 @@ void PythonNode::executeRemote() std::unique_ptr serializationInputCorba(new Engines::pickledArgs); AutoPyRef serializationInput; { +#if PY_VERSION_HEX < 0x03070000 + std::unique_lock lock(data_mutex); +#endif AutoGIL agil; PyObject *args(0),*ob(0); //=========================================================================== @@ -501,6 +513,9 @@ void PythonNode::executeRemote() auto length(resultCorba->length()); char *resultCorbaC(reinterpret_cast(resultCorba->get_buffer())); { +#if PY_VERSION_HEX < 0x03070000 + std::unique_lock lock(data_mutex); +#endif AutoGIL agil; PyObject *args(0),*ob(0); PyObject* resultPython=PyMemoryView_FromMemory(resultCorbaC,length,PyBUF_READ); @@ -1091,6 +1106,9 @@ void PyFuncNode::executeRemote() // Engines::pickledArgs_var serializationInputCorba(new Engines::pickledArgs);; { +#if PY_VERSION_HEX < 0x03070000 + std::unique_lock lock(data_mutex); +#endif AutoGIL agil; PyObject *ob(0); //=========================================================================== @@ -1150,6 +1168,9 @@ void PyFuncNode::executeRemote() resultCorbaC[i]=resultCorba[i]; { +#if PY_VERSION_HEX < 0x03070000 + std::unique_lock lock(data_mutex); +#endif AutoGIL agil; PyObject *resultPython(PyBytes_FromStringAndSize(resultCorbaC,resultCorba->length()));