diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-11-16 09:48:56 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-11-16 10:12:07 +0100 |
commit | d106f5811cb7d81a7ce45288ef555cab07aaded3 (patch) | |
tree | c2e3a95c1e17b3a1a87715776e445e8f2a0148bd | |
parent | 72a620f52f9361b21fa98b39b3701a429fa01036 (diff) |
Fix a deadlock when using QMetaObject.invokeMethod(BlockingQueuedConnection)
Add allow-thread to the newly introduced functions.
Amends aae2f599e8215e49747c9b5dce698d35b913c6c7.
Pick-to: 6.4
Fixes: PYSIDE-2121
Task-number: PYSIDE-1898
Change-Id: I2243c2809b275e23ececae0cdd9225db2aaf7225
Reviewed-by: Christian Tismer <tismer@stackless.com>
-rw-r--r-- | sources/pyside6/PySide6/glue/qtcore.cpp | 6 |
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); |