diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-06-18 09:53:06 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-06-26 15:14:14 +0200 |
commit | 52f29458d7d6cb379d28d84021819516723d9169 (patch) | |
tree | afad9317cbf204ff6716c24ec4041b4495bfd36d /sources/pyside2/PySide2/glue/qtcore.cpp | |
parent | b7e8b5e4114c034a750433d661b20944ce8b303c (diff) |
pthreads: Try to abandon the GIL in case a thread was terminated
When terminating a thread using QThread::terminate() via
(pthread_cancel(), QThread::run() is aborted and the lock is released,
but ~GilState() is still executed for some reason.
Add a cancel handler to the thread which tells GilState to abandon
the lock.
Fixes: PYSIDE-1282
Change-Id: I70abd42b5a2afd49aaa8cc5e8be0a92ed63f49d3
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/pyside2/PySide2/glue/qtcore.cpp')
-rw-r--r-- | sources/pyside2/PySide2/glue/qtcore.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/sources/pyside2/PySide2/glue/qtcore.cpp b/sources/pyside2/PySide2/glue/qtcore.cpp index 111e324b9..41ee743e7 100644 --- a/sources/pyside2/PySide2/glue/qtcore.cpp +++ b/sources/pyside2/PySide2/glue/qtcore.cpp @@ -1960,3 +1960,31 @@ PyTuple_SET_ITEM(%out, 0, %CONVERTTOPYTHON[%INTYPE_0](%in.first)); PyTuple_SET_ITEM(%out, 1, %CONVERTTOPYTHON[%INTYPE_1](%in.second)); return %out; // @snippet return-qpair + +// @snippet qthread_pthread_cleanup +#ifdef Q_OS_UNIX +# include <stdio.h> +# include <pthread.h> +static void qthread_pthread_cleanup(void *arg) +{ + // PYSIDE 1282: When terminating a thread using QThread::terminate() + // (pthread_cancel()), QThread::run() is aborted and the lock is released, + // but ~GilState() is still executed for some reason. Prevent it from + // releasing. + auto gil = reinterpret_cast<Shiboken::GilState *>(arg); + gil->abandon(); +} +#endif // Q_OS_UNIX +// @snippet qthread_pthread_cleanup + +// @snippet qthread_pthread_cleanup_install +#ifdef Q_OS_UNIX +pthread_cleanup_push(qthread_pthread_cleanup, &gil); +#endif +// @snippet qthread_pthread_cleanup_install + +// @snippet qthread_pthread_cleanup_uninstall +#ifdef Q_OS_UNIX +pthread_cleanup_pop(0); +#endif +// @snippet qthread_pthread_cleanup_uninstall |