aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2024-03-21 11:48:20 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-03-25 15:02:20 +0000
commit24f39fa500fc01dd657c17d1fffc9dba7969ca6a (patch)
treeaac85a5a990e7c172a31113b997c4eddce437a07
parenteaff347f5a0ea6eedc3e098a478c03916bc45ed9 (diff)
libpyside: Clean up lambdas connected to signals earlier in shutdown
Run a signal handler cleanup in CoreApplication::aboutToQuit() already before the general cleanup. This prevents them from leaking out of a main() function, for example. Task-number: PYSIDE-2646 Pick-to: 6.5 Change-Id: I87cce8d131c40c02b44b0102b3774477676b8f89 Reviewed-by: Christian Tismer <tismer@stackless.com> (cherry picked from commit 47d6abbd727d193158cdc1747cb18241267409c1) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> (cherry picked from commit 16bedacb16dd52a7a3d6a09fca8623aaaa965c70)
-rw-r--r--sources/pyside6/libpyside/signalmanager.cpp21
-rw-r--r--sources/pyside6/libpyside/signalmanager.h1
2 files changed, 21 insertions, 1 deletions
diff --git a/sources/pyside6/libpyside/signalmanager.cpp b/sources/pyside6/libpyside/signalmanager.cpp
index b46761284..bb3453bad 100644
--- a/sources/pyside6/libpyside/signalmanager.cpp
+++ b/sources/pyside6/libpyside/signalmanager.cpp
@@ -21,6 +21,7 @@
#include <sbkstaticstrings.h>
#include <sbkerrors.h>
+#include <QtCore/QCoreApplication>
#include <QtCore/QByteArrayView>
#include <QtCore/QDebug>
#include <QtCore/QHash>
@@ -311,8 +312,21 @@ void SignalManager::setQmlMetaCallErrorHandler(QmlMetaCallErrorHandler handler)
SignalManagerPrivate::m_qmlMetaCallErrorHandler = handler;
}
+static void qAppAboutToQuit()
+{
+ SignalManager::instance().purgeEmptyGlobalReceivers();
+}
+
QObject *SignalManager::globalReceiver(QObject *sender, PyObject *callback, QObject *receiver)
{
+ static bool registerQuitHandler = true;
+ if (registerQuitHandler) {
+ if (auto *app = QCoreApplication::instance()) {
+ registerQuitHandler = false;
+ QObject::connect(app, &QCoreApplication::aboutToQuit, qAppAboutToQuit);
+ }
+ }
+
auto &globalReceivers = m_d->m_globalReceivers;
const GlobalReceiverKey key = GlobalReceiverV2::key(callback);
auto it = globalReceivers.find(key);
@@ -326,10 +340,15 @@ QObject *SignalManager::globalReceiver(QObject *sender, PyObject *callback, QObj
return it.value().get();
}
+void SignalManager::purgeEmptyGlobalReceivers()
+{
+ m_d->purgeEmptyGlobalReceivers();
+}
+
void SignalManager::notifyGlobalReceiver(QObject *receiver)
{
reinterpret_cast<GlobalReceiverV2 *>(receiver)->notify();
- m_d->purgeEmptyGlobalReceivers();
+ purgeEmptyGlobalReceivers();
}
void SignalManager::releaseGlobalReceiver(const QObject *source, QObject *receiver)
diff --git a/sources/pyside6/libpyside/signalmanager.h b/sources/pyside6/libpyside/signalmanager.h
index 684a4e5e7..c531d6630 100644
--- a/sources/pyside6/libpyside/signalmanager.h
+++ b/sources/pyside6/libpyside/signalmanager.h
@@ -78,6 +78,7 @@ public:
// Disconnect all signals managed by Globalreceiver
void clear();
+ void purgeEmptyGlobalReceivers();
// Utility function to call a python method usign args received in qt_metacall
static int callPythonMetaMethod(const QMetaMethod& method, void** args, PyObject* obj, bool isShortCuit);