aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-11-16 09:48:56 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-11-16 10:50:34 +0000
commit52e493335da8b08a4a81362c9105339962c00c2a (patch)
tree90e7be6f8031979b29bb1a888ad8d3bc7650a051
parent586194db6e9e3c91ac41b4fdf707db1b9cafc4be (diff)
Fix a deadlock when using QMetaObject.invokeMethod(BlockingQueuedConnection)
Add allow-thread to the newly introduced functions. Amends aae2f599e8215e49747c9b5dce698d35b913c6c7. Fixes: PYSIDE-2121 Task-number: PYSIDE-1898 Change-Id: I2243c2809b275e23ececae0cdd9225db2aaf7225 Reviewed-by: Christian Tismer <tismer@stackless.com> (cherry picked from commit d106f5811cb7d81a7ce45288ef555cab07aaded3) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--sources/pyside6/PySide6/glue/qtcore.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/sources/pyside6/PySide6/glue/qtcore.cpp b/sources/pyside6/PySide6/glue/qtcore.cpp
index 02ca55a78..c432275b1 100644
--- a/sources/pyside6/PySide6/glue/qtcore.cpp
+++ b/sources/pyside6/PySide6/glue/qtcore.cpp
@@ -1656,13 +1656,17 @@ QtCoreHelper::QGenericReturnArgumentHolder result(qArgData.metaType, qArgData.da
// invokeMethod(QObject *,const char *, QGenericArgument a0, a1, a2 )
// @snippet qmetaobject-invokemethod-arg
+PyThreadState *_save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
const bool result = %CPPSELF.invokeMethod(%1, %2, %3, %4, %5);
+PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = %CONVERTTOPYTHON[bool](result);
// @snippet qmetaobject-invokemethod-arg
// invokeMethod(QObject *,const char *,Qt::ConnectionType, QGenericArgument a0, a1, a2 )
// @snippet qmetaobject-invokemethod-conn-type-arg
+PyThreadState *_save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
const bool result = %CPPSELF.invokeMethod(%1, %2, %3, %4, %5, %6);
+PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = %CONVERTTOPYTHON[bool](result);
// @snippet qmetaobject-invokemethod-conn-type-arg
@@ -1674,8 +1678,10 @@ static PyObject *invokeMethodHelper(QObject *obj, const char *member, Qt::Connec
const QtCoreHelper::QGenericArgumentHolder &v3)
{
+ PyThreadState *_save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
const bool callResult = QMetaObject::invokeMethod(obj, member, type,
returnArg, v1, v2, v3);
+ PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
if (!callResult) {
PyErr_Format(PyExc_RuntimeError, "QMetaObject::invokeMethod(): Invocation of %s::%s() failed.",
obj->metaObject()->className(), member);