diff options
author | Michael Stahl <Michael.Stahl@cib.de> | 2019-12-09 14:08:19 +0100 |
---|---|---|
committer | Michael Stahl <michael.stahl@cib.de> | 2020-01-08 10:22:17 +0100 |
commit | b10be5d48433076f0b7238d818020f708553e114 (patch) | |
tree | a36cda1b584db93f10776d222356656e2f94b80e /pyuno | |
parent | 468a740f0fe09f8939368eca3067b4101c84c057 (diff) |
python3: upgrade to release 3.7.6
* external/python3/python-3.3.3-aix.patch.1:
most of it doesn't apply and AIX port isn't maintained anyway so
remove it for now
* external/python3/ubsan.patch.0:
apparently one of the files was removed
* 0001-3.6-bpo-17239-Disable-external-entities-in-SAX-parse.patch.1:
fixed upstream
* python3-osx-avoid-new-10.13.patch.1:
replace with simply passing ac_cv_func_utimensat=no to configure
* external/python3/python-3.5.4-ssl.patch.1:
project files to build OpenSSL removed upstream
* There have been changes to how python locates OpenSSL; new variables
OPENSSL_INCLUDES etc; it turns out that you have to pass one directory
to --with-openssl, as the variables cannot be passed
* libuuid.so.1 is a new dependency of the _uuid module
* libffi.so.6 is a new dependency of the _ctypes module (the bundled
copy of libffi for non-Darwin platforms was removed)
* python-3.3.0-pythreadstate.patch.1:
the PyThreadState functions have been changed such that
CppunitTest_services asserts when there is a PyThreadAttach on top of
PyThreadDetach on top of PyThreadAttach, i.e., 2 PyThreadState per
thread (PyGILState_Check() fails). Instead of patching in additional
workarounds, change PyThreadAttach so that it re-uses an existing
PyThreadState if one exists for the thread.
Change-Id: I24c19d79b43a30709261fd9db66312b2e3872fd9
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/84765
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@cib.de>
Diffstat (limited to 'pyuno')
-rw-r--r-- | pyuno/inc/pyuno.hxx | 1 | ||||
-rw-r--r-- | pyuno/source/module/pyuno.cxx | 9 | ||||
-rw-r--r-- | pyuno/source/module/pyuno_runtime.cxx | 31 |
3 files changed, 33 insertions, 8 deletions
diff --git a/pyuno/inc/pyuno.hxx b/pyuno/inc/pyuno.hxx index 9c621e71cffe..e2cdc5f0329e 100644 --- a/pyuno/inc/pyuno.hxx +++ b/pyuno/inc/pyuno.hxx @@ -277,6 +277,7 @@ public: class LO_DLLPUBLIC_PYUNO PyThreadAttach { PyThreadState *tstate; + bool m_isNewState; PyThreadAttach ( const PyThreadAttach & ) = delete; PyThreadAttach & operator = ( const PyThreadAttach & ) = delete; public: diff --git a/pyuno/source/module/pyuno.cxx b/pyuno/source/module/pyuno.cxx index d554f5ca769c..a6a875addc46 100644 --- a/pyuno/source/module/pyuno.cxx +++ b/pyuno/source/module/pyuno.cxx @@ -336,13 +336,14 @@ static int lcl_PySlice_GetIndicesEx( PyObject *pObject, sal_Int32 nLen, sal_Int3 { Py_ssize_t nStart_ssize, nStop_ssize, nStep_ssize, nSliceLength_ssize; - int nResult = PySlice_GetIndicesEx( + int nResult = #if PY_VERSION_HEX >= 0x030200f0 - pObject, + PySlice_GetIndicesEx(pObject, + nLen, &nStart_ssize, &nStop_ssize, &nStep_ssize, &nSliceLength_ssize ); #else - reinterpret_cast<PySliceObject*>(pObject), -#endif + PySlice_GetIndicesEx(reinterpret_cast<PySliceObject*>(pObject), nLen, &nStart_ssize, &nStop_ssize, &nStep_ssize, &nSliceLength_ssize ); +#endif if (nResult == -1) return -1; diff --git a/pyuno/source/module/pyuno_runtime.cxx b/pyuno/source/module/pyuno_runtime.cxx index 62b3861288c3..5fa923c236dc 100644 --- a/pyuno/source/module/pyuno_runtime.cxx +++ b/pyuno/source/module/pyuno_runtime.cxx @@ -974,8 +974,21 @@ Any Runtime::extractUnoException( const PyRef & excType, const PyRef &excValue, PyThreadAttach::PyThreadAttach( PyInterpreterState *interp) + : m_isNewState(false) { - tstate = PyThreadState_New( interp ); + // note: *may* be called recursively, with PyThreadDetach between - in + // that case, don't create *new* PyThreadState but reuse! +#ifndef NDEBUG + PyThreadState const*const current = _PyThreadState_UncheckedGet(); + // dereference isn't safe but let's hope it's tolerable for debugging purpose + assert((current == nullptr || current->thread_id != PyThread_get_thread_ident()) && "recursive PyThreadAttach"); +#endif + tstate = PyGILState_GetThisThreadState(); // from TLS, possibly detached + if (!tstate) + { + m_isNewState = true; + tstate = PyThreadState_New( interp ); + } if( !tstate ) throw RuntimeException( "Couldn't create a pythreadstate" ); PyEval_AcquireThread( tstate); @@ -983,9 +996,19 @@ PyThreadAttach::PyThreadAttach( PyInterpreterState *interp) PyThreadAttach::~PyThreadAttach() { - PyThreadState_Clear( tstate ); - PyEval_ReleaseThread( tstate ); - PyThreadState_Delete( tstate ); + if (m_isNewState) + { // Clear needs GIL! + PyThreadState_Clear( tstate ); + } + if (m_isNewState) + { // note: PyThreadState_Delete(tstate) cannot be called, it will assert + // because it requires a PyThreadState to be set, but not the tstate! + PyThreadState_DeleteCurrent(); + } + else + { + PyEval_ReleaseThread( tstate ); + } } PyThreadDetach::PyThreadDetach() |