diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2024-12-06 14:16:06 +0100 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2024-12-09 15:08:12 +0100 |
| commit | 45a13791dac710a4dcbf8dfbbc6fb063bae5aed6 (patch) | |
| tree | 793a993809e24e517175674a9dac7c584461e040 /sources/pyside6/libpyside/pyside.cpp | |
| parent | 206b907dec8e6feddb495ca177ca20fd446efddc (diff) | |
Fix occasional hang of test QtWidgets/bug_844.py on Linux with DBUS-based accessibility
The test installs a global event filter on QApplication which then
receives events from DBUS classes doing accessibility. Then apparently
something moves the DBUS receivers to different threads which causes
hangs later on when PySide tries to release the wrapper. Fix by
checking the presence of a wrapper first before releasing (empirical).
Pick-to: 6.8
Change-Id: I91480461afb19c8fc1fa7a329f63243c0dacb22c
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/pyside6/libpyside/pyside.cpp')
| -rw-r--r-- | sources/pyside6/libpyside/pyside.cpp | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/sources/pyside6/libpyside/pyside.cpp b/sources/pyside6/libpyside/pyside.cpp index 0afe6db5f..02cff066b 100644 --- a/sources/pyside6/libpyside/pyside.cpp +++ b/sources/pyside6/libpyside/pyside.cpp @@ -717,11 +717,14 @@ static void invalidatePtr(any_t *object) if (Py_IsInitialized() == 0) return; - Shiboken::GilState state; - - SbkObject *wrapper = Shiboken::BindingManager::instance().retrieveWrapper(object); - if (wrapper != nullptr) - Shiboken::BindingManager::instance().releaseWrapper(wrapper); + // Check for existence before locking (fix hang when QObjects + // are moved to different threads). + auto &bindingManager = Shiboken::BindingManager::instance(); + if (bindingManager.hasWrapper(object)) { + Shiboken::GilState state; + if (SbkObject *wrapper = bindingManager.retrieveWrapper(object)) + bindingManager.releaseWrapper(wrapper); + } } static const char invalidatePropertyName[] = "_PySideInvalidatePtr"; |
