aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6/libpyside/pyside.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2024-12-06 14:16:06 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2024-12-09 15:08:12 +0100
commit45a13791dac710a4dcbf8dfbbc6fb063bae5aed6 (patch)
tree793a993809e24e517175674a9dac7c584461e040 /sources/pyside6/libpyside/pyside.cpp
parent206b907dec8e6feddb495ca177ca20fd446efddc (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.cpp13
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";