[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