diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2024-03-21 11:48:20 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-03-25 15:02:20 +0000 |
commit | 24f39fa500fc01dd657c17d1fffc9dba7969ca6a (patch) | |
tree | aac85a5a990e7c172a31113b997c4eddce437a07 | |
parent | eaff347f5a0ea6eedc3e098a478c03916bc45ed9 (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.cpp | 21 | ||||
-rw-r--r-- | sources/pyside6/libpyside/signalmanager.h | 1 |
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); |