diff options
author | Liang Qi <liang.qi@theqtcompany.com> | 2016-04-13 06:55:37 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@theqtcompany.com> | 2016-04-13 06:55:37 +0200 |
commit | b94773c9c838a0b3db1bced0bc8daf5b04aefc29 (patch) | |
tree | 4afe809fa3ac8a83f5eaf98d0b40d4bbf7b5fca4 /src/dbus | |
parent | c327fb79e1a50c825a945e97f2c66d07a1c6d225 (diff) | |
parent | 541c9d4d2acd045459c3e75eee80c63b36af9ed0 (diff) |
Merge remote-tracking branch 'origin/5.6' into 5.7
Conflicts:
config.tests/unix/compile.test
src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
src/testlib/qtestcase.cpp
src/testlib/qtestcase.qdoc
Change-Id: Ied3c471dbc9a076c8de33d673bd557e88575609d
Diffstat (limited to 'src/dbus')
-rw-r--r-- | src/dbus/qdbusconnection_p.h | 1 | ||||
-rw-r--r-- | src/dbus/qdbusintegrator.cpp | 26 |
2 files changed, 26 insertions, 1 deletions
diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h index 83a2e6fc32..b2fa8faae8 100644 --- a/src/dbus/qdbusconnection_p.h +++ b/src/dbus/qdbusconnection_p.h @@ -259,6 +259,7 @@ private: const QVector<int> &metaTypes, int slotIdx); SignalHookHash::Iterator removeSignalHookNoLock(SignalHookHash::Iterator it); + void disconnectObjectTree(ObjectTreeNode &node); bool isServiceRegisteredByThread(const QString &serviceName); diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index 105714ee64..6d4a27cdb5 100644 --- a/src/dbus/qdbusintegrator.cpp +++ b/src/dbus/qdbusintegrator.cpp @@ -1055,7 +1055,6 @@ QDBusConnectionPrivate::~QDBusConnectionPrivate() qPrintable(name)); closeConnection(); - rootNode.children.clear(); // free resources qDeleteAll(cachedMetaObjects); if (mode == ClientMode || mode == PeerMode) { @@ -1077,6 +1076,19 @@ QDBusConnectionPrivate::~QDBusConnectionPrivate() } } +void QDBusConnectionPrivate::disconnectObjectTree(QDBusConnectionPrivate::ObjectTreeNode &haystack) +{ + QDBusConnectionPrivate::ObjectTreeNode::DataList::Iterator it = haystack.children.begin(); + + while (it != haystack.children.end()) { + disconnectObjectTree(*it); + it++; + } + + if (haystack.obj) + haystack.obj->disconnect(this); +} + void QDBusConnectionPrivate::closeConnection() { QDBusWriteLocker locker(CloseConnectionAction, this); @@ -1100,6 +1112,18 @@ void QDBusConnectionPrivate::closeConnection() } qDeleteAll(pendingCalls); + + // Disconnect all signals from signal hooks and from the object tree to + // avoid QObject::destroyed being sent to dbus daemon thread which has + // already quit. + SignalHookHash::iterator sit = signalHooks.begin(); + while (sit != signalHooks.end()) { + sit.value().obj->disconnect(this); + sit++; + } + + disconnectObjectTree(rootNode); + rootNode.children.clear(); // free resources } void QDBusConnectionPrivate::checkThread() |