[SCM] qtbase packaging branch, master, updated. debian/5.6.1+dfsg-1-3-g9e24e92
Lisandro Damián Nicanor Pérez
lisandro at moszumanska.debian.org
Mon Jun 13 12:21:23 UTC 2016
Gitweb-URL: http://git.debian.org/?p=pkg-kde/qt/qtbase.git;a=commitdiff;h=4ed266d
The following commit has been merged in the master branch:
commit 4ed266da2d707758019614493e05951ce12f8f4e
Author: Dmitry Shachnev <mitya57 at gmail.com>
Date: Sun Mar 20 22:08:02 2016 +0100
Backport upstream change to fix QtDBus deadlock inside kded/kiod.
---
debian/changelog | 5 ++
debian/patches/fix_qtdbus_deadlock.diff | 100 ++++++++++++++++++++++++++++++++
debian/patches/series | 1 +
3 files changed, 106 insertions(+)
diff --git a/debian/changelog b/debian/changelog
index ba3d59d..e0fc43f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,13 @@
qtbase-opensource-src (5.6.0+dfsg-3) UNRELEASED; urgency=medium
+ [ Diederik de Haas ]
* Improve the Xsession.d script so it won't fail if mesa-utils is
not installed. Also log why glxinfo is needed for this script.
+ [ Dmitry Shachnev ]
+ * Backport upstream change (fix_qtdbus_deadlock.diff) to fix QtDBus
+ deadlock inside kded/kiod.
+
-- Debian Qt/KDE Maintainers <debian-qt-kde at lists.debian.org> Thu, 17 Mar 2016 09:59:33 -0300
qtbase-opensource-src (5.6.0+dfsg-2) experimental; urgency=medium
diff --git a/debian/patches/fix_qtdbus_deadlock.diff b/debian/patches/fix_qtdbus_deadlock.diff
new file mode 100644
index 0000000..8a526d6
--- /dev/null
+++ b/debian/patches/fix_qtdbus_deadlock.diff
@@ -0,0 +1,100 @@
+Description: fix QtDBus deadlock inside kded/kiod
+Origin: upstream, https://code.qt.io/cgit/qt/qtbase.git/commit/?id=2e02de165115c9d6
+Last-Update: 2016-03-20
+
+--- a/src/dbus/qdbusintegrator.cpp
++++ b/src/dbus/qdbusintegrator.cpp
+@@ -481,6 +481,11 @@
+
+ void QDBusSpyCallEvent::placeMetaCall(QObject *)
+ {
++ invokeSpyHooks(msg, hooks, hookCount);
++}
++
++inline void QDBusSpyCallEvent::invokeSpyHooks(const QDBusMessage &msg, const Hook *hooks, int hookCount)
++{
+ // call the spy hook list
+ for (int i = 0; i < hookCount; ++i)
+ hooks[i](msg);
+@@ -509,7 +514,12 @@
+ {
+ if (!ref.load())
+ return false;
+- if (!dispatchEnabled && !QDBusMessagePrivate::isLocal(amsg)) {
++
++ // local message are always delivered, regardless of filtering
++ // or whether the dispatcher is enabled
++ bool isLocal = QDBusMessagePrivate::isLocal(amsg);
++
++ if (!dispatchEnabled && !isLocal) {
+ // queue messages only, we'll handle them later
+ qDBusDebug() << this << "delivery is suspended";
+ pendingMessages << amsg;
+@@ -523,13 +533,23 @@
+ // let them see the signal too
+ return false;
+ case QDBusMessage::MethodCallMessage:
+- // run it through the spy filters (if any) before the regular processing
++ // run it through the spy filters (if any) before the regular processing:
++ // a) if it's a local message, we're in the caller's thread, so invoke the filter directly
++ // b) if it's an external message, post to the main thread
+ if (Q_UNLIKELY(qDBusSpyHookList.exists()) && qApp) {
+ const QDBusSpyHookList &list = *qDBusSpyHookList;
+- qDBusDebug() << this << "invoking message spies";
+- QCoreApplication::postEvent(qApp, new QDBusSpyCallEvent(this, QDBusConnection(this),
+- amsg, list.constData(), list.size()));
+- return true;
++ if (isLocal) {
++ Q_ASSERT(QThread::currentThread() != thread());
++ qDBusDebug() << this << "invoking message spies directly";
++ QDBusSpyCallEvent::invokeSpyHooks(amsg, list.constData(), list.size());
++ } else {
++ qDBusDebug() << this << "invoking message spies via event";
++ QCoreApplication::postEvent(qApp, new QDBusSpyCallEvent(this, QDBusConnection(this),
++ amsg, list.constData(), list.size()));
++
++ // we'll be called back, so return
++ return true;
++ }
+ }
+
+ handleObjectCall(amsg);
+@@ -1451,9 +1471,9 @@
+ // that means the dispatchLock mutex is locked
+ // must not call out to user code in that case
+ //
+- // however, if the message is internal, handleMessage was called
+- // directly and no lock is in place. We can therefore call out to
+- // user code, if necessary
++ // however, if the message is internal, handleMessage was called directly
++ // (user's thread) and no lock is in place. We can therefore call out to
++ // user code, if necessary.
+ ObjectTreeNode result;
+ int usedLength;
+ QThread *objThread = 0;
+@@ -1492,12 +1512,14 @@
+ usedLength, msg));
+ return;
+ } else if (objThread != QThread::currentThread()) {
+- // synchronize with other thread
++ // looped-back message, targeting another thread:
++ // synchronize with it
+ postEventToThread(HandleObjectCallPostEventAction, result.obj,
+ new QDBusActivateObjectEvent(QDBusConnection(this), this, result,
+ usedLength, msg, &sem));
+ semWait = true;
+ } else {
++ // looped-back message, targeting current thread
+ semWait = false;
+ }
+ } // release the lock
+--- a/src/dbus/qdbusintegrator_p.h
++++ b/src/dbus/qdbusintegrator_p.h
+@@ -145,6 +145,7 @@
+ {}
+ ~QDBusSpyCallEvent();
+ void placeMetaCall(QObject *) Q_DECL_OVERRIDE;
++ static inline void invokeSpyHooks(const QDBusMessage &msg, const Hook *hooks, int hookCount);
+
+ QDBusConnection conn; // keeps the refcount in QDBusConnectionPrivate up
+ QDBusMessage msg;
diff --git a/debian/patches/series b/debian/patches/series
index 3fb2d79..8067fed 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -3,6 +3,7 @@ dbusmenu_fixes.diff
dbustray_fixes.diff
no_dbus_dependency.diff
fix_not_delivering_focus.patch
+fix_qtdbus_deadlock.diff
# Debian specific.
gnukfreebsd.diff
--
qtbase packaging
More information about the pkg-kde-commits
mailing list