author | Felix Yan
<felixonmars@archlinux.org> 2016-06-09 08:23:11 UTC |
committer | Felix Yan
<felixonmars@archlinux.org> 2016-06-09 08:23:11 UTC |
parent | 3561d8f8fa95cc0c9cb8fcb550512dd1919599fd |
PKGBUILD | +4 | -25 |
qt5-alsa1.11.patch | +0 | -11 |
qtbug-44964.patch | +0 | -100 |
qtbug-45812.patch | +0 | -98 |
qtbug-51648.patch | +0 | -88 |
qtbug-51649.patch | +0 | -159 |
qtbug-51676.patch | +0 | -126 |
diff --git a/PKGBUILD b/PKGBUILD index 39e52ec..443bdbf 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -3,9 +3,9 @@ # Contributor: Andrea Scarpino <andrea@archlinux.org> pkgname=qt5-base -_qtver=5.6.0 +_qtver=5.6.1 pkgver=${_qtver/-/} -pkgrel=7 +pkgrel=1 arch=('i686' 'x86_64') url='http://qt-project.org/' license=('GPL3' 'LGPL' 'FDL' 'custom') @@ -26,17 +26,10 @@ optdepends=('qt5-svg: to use SVG icon themes' conflicts=('qt') groups=('qt' 'qt5') _pkgfqn="${pkgname/5-/}-opensource-src-${_qtver}" -source=("http://download.qt.io/official_releases/qt/${pkgver%.*}/${_qtver}/submodules/${_pkgfqn}.tar.xz" qt5-alsa1.11.patch - qtbug-51648.patch qtbug-51649.patch qtbug-51676.patch qtbug-45812.patch qtbug-44964.patch +source=("http://download.qt.io/official_releases/qt/${pkgver%.*}/${_qtver}/submodules/${_pkgfqn}.tar.xz" qtbug-53071.patch::"https://github.com/qtproject/qtbase/commit/e9041c7fc.patch" qtbug-53071b.patch::"https://github.com/qtproject/qtbase/commit/cd25866f.patch") -md5sums=('d6b6cfd333c22829c6c85fc52ceed019' - '5e96b5cfa248b8b071919adb27abc715' - 'b09aa4f5763f013b06153fbdbc844404' - 'ef981ff6892337cdab424ebb113b3c39' - 'f59a1ea0f10a055ba930a53832933482' - '7f152c40947027acba56023e9d693260' - '28cddedf6c15751d08c1382bf1074fa7' +md5sums=('b23232190a3df61fe1ba81636987b036' '462f079cd46f869def6858903a718bf5' 'da4fd787ea877516397a027412e975e1') @@ -57,23 +50,9 @@ prepare() { # Fix libsystemd-journal detection sed -e 's|libsystemd-journal|libsystemd|' -i config.tests/unix/journald/journald.pro -i src/corelib/global/global.pri - # Fix ALSA 1.11 detection - patch -p1 -i ../qt5-alsa1.11.patch - - # Backport fixes for QtDBus deadlocks - patch -p1 -i ../qtbug-51648.patch - patch -p1 -i ../qtbug-51649.patch - patch -p1 -i ../qtbug-51676.patch - - # Fix drag and drop from some applications - patch -p1 -i ../qtbug-45812.patch - # Fix parsing of tzfile(5) POSIX rule zone names with bracket quotes patch -p1 -i ../qtbug-53071.patch patch -p1 -i ../qtbug-53071b.patch - - # Don't compress tablet motion events - patch -p1 -i ../qtbug-44964.patch } build() { diff --git a/qt5-alsa1.11.patch b/qt5-alsa1.11.patch deleted file mode 100644 index e713282..0000000 --- a/qt5-alsa1.11.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- qtbase-opensource-src-5.6.0-rc/config.tests/unix/alsa/alsatest.cpp.0 2016-02-29 08:15:48.203031809 +0000 -+++ qtbase-opensource-src-5.6.0-rc/config.tests/unix/alsa/alsatest.cpp 2016-02-29 08:16:39.712811962 +0000 -@@ -32,7 +32,7 @@ - ****************************************************************************/ - - #include <alsa/asoundlib.h> --#if(!(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 10)) -+#if(!(SND_LIB_MAJOR == 1 && (SND_LIB_MINOR > 0 || SND_LIB_SUBMINOR >= 10))) - #error "Alsa version found too old, require >= 1.0.10" - #endif - diff --git a/qtbug-44964.patch b/qtbug-44964.patch deleted file mode 100644 index 1890adb..0000000 --- a/qtbug-44964.patch +++ /dev/null @@ -1,100 +0,0 @@ -From 60cd1c67759642018ef93cc45a90714729100d9d Mon Sep 17 00:00:00 2001 -From: Shawn Rutledge <shawn.rutledge@theqtcompany.com> -Date: Thu, 28 Apr 2016 11:30:30 +0200 -Subject: [PATCH] xcb: don't compress tablet motion events - -7edd10e6c added this compression feature, but it's not a good idea for -drawing-tablet applications, because smooth drawing depends on receiving -every movement of the stylus. - -Also show the device ID in qt.qpa.input.devices category logging. - -[ChangeLog][X11] The new X event compression feature that was added in -5.6.0 no longer applies to motion events from drawing tablets. - -Task-number: QTBUG-44964 -Change-Id: Icd2ca8ca77d8f80c2f39160c74208db10e382501 -Reviewed-by: Gatis Paeglis <gatis.paeglis@theqtcompany.com> ---- - src/plugins/platforms/xcb/qxcbconnection.cpp | 7 ++++++- - src/plugins/platforms/xcb/qxcbconnection.h | 1 + - src/plugins/platforms/xcb/qxcbconnection_xi2.cpp | 21 ++++++++++++++------- - 3 files changed, 21 insertions(+), 8 deletions(-) - -diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp -index edfaf2b..669ef3a 100644 ---- a/src/plugins/platforms/xcb/qxcbconnection.cpp -+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp -@@ -1626,8 +1626,13 @@ bool QXcbConnection::compressEvent(xcb_generic_event_t *event, int currentIndex, - if (!m_xi2Enabled) - return false; - -- // compress XI_Motion -+ // compress XI_Motion, but not from tablet devices - if (isXIType(event, m_xiOpCode, XI_Motion)) { -+#ifndef QT_NO_TABLETEVENT -+ xXIDeviceEvent *xdev = reinterpret_cast<xXIDeviceEvent *>(event); -+ if (const_cast<QXcbConnection *>(this)->tabletDataForDevice(xdev->sourceid)) -+ return false; -+#endif // QT_NO_TABLETEVENT - for (int j = nextIndex; j < eventqueue->size(); ++j) { - xcb_generic_event_t *next = eventqueue->at(j); - if (!isValid(next)) -diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h -index 7ba9588..501da1c 100644 ---- a/src/plugins/platforms/xcb/qxcbconnection.h -+++ b/src/plugins/platforms/xcb/qxcbconnection.h -@@ -578,6 +578,7 @@ private slots: - bool xi2HandleTabletEvent(void *event, TabletData *tabletData, QXcbWindowEventListener *eventListener); - void xi2ReportTabletEvent(TabletData &tabletData, void *event); - QVector<TabletData> m_tabletData; -+ TabletData *tabletDataForDevice(int id); - #endif // !QT_NO_TABLETEVENT - struct ScrollingDevice { - ScrollingDevice() : deviceId(0), verticalIndex(0), horizontalIndex(0), orientations(0), legacyOrientations(0) { } -diff --git a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp -index 9911afb..025dde3 100644 ---- a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp -+++ b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp -@@ -113,7 +113,7 @@ void QXcbConnection::xi2SetupDevices() - // Only non-master pointing devices are relevant here. - if (devices[i].use != XISlavePointer) - continue; -- qCDebug(lcQpaXInputDevices) << "input device "<< devices[i].name; -+ qCDebug(lcQpaXInputDevices) << "input device " << devices[i].name << "ID" << devices[i].deviceid; - #ifndef QT_NO_TABLETEVENT - TabletData tabletData; - #endif -@@ -507,12 +507,9 @@ void QXcbConnection::xi2HandleEvent(xcb_ge_event_t *event) - } - - #ifndef QT_NO_TABLETEVENT -- for (int i = 0; i < m_tabletData.count(); ++i) { -- if (m_tabletData.at(i).deviceId == sourceDeviceId) { -- if (xi2HandleTabletEvent(xiEvent, &m_tabletData[i], eventListener)) -- return; -- } -- } -+ QXcbConnection::TabletData *tablet = tabletDataForDevice(sourceDeviceId); -+ if (tablet && xi2HandleTabletEvent(xiEvent, tablet, eventListener)) -+ return; - #endif // QT_NO_TABLETEVENT - - #ifdef XCB_USE_XINPUT21 -@@ -1198,6 +1195,16 @@ void QXcbConnection::xi2ReportTabletEvent(TabletData &tabletData, void *event) - xTilt, yTilt, tangentialPressure, - rotation, 0, tabletData.serialId); - } -+ -+QXcbConnection::TabletData *QXcbConnection::tabletDataForDevice(int id) -+{ -+ for (int i = 0; i < m_tabletData.count(); ++i) { -+ if (m_tabletData.at(i).deviceId == id) -+ return &m_tabletData[i]; -+ } -+ return Q_NULLPTR; -+} -+ - #endif // QT_NO_TABLETEVENT - - #endif // XCB_USE_XINPUT2 diff --git a/qtbug-45812.patch b/qtbug-45812.patch deleted file mode 100644 index 1524387..0000000 --- a/qtbug-45812.patch +++ /dev/null @@ -1,98 +0,0 @@ -From 269fdbdd2bedda5f5eacb751224d3a3fc3eed5bc Mon Sep 17 00:00:00 2001 -From: Urs Fleisch <ufleisch@users.sourceforge.net> -Date: Fri, 26 Feb 2016 17:46:09 +0100 -Subject: [PATCH] xcb: Fix drag and drop to applications like Emacs and - Chromium. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Drops without matching time stamp do not work. I have fixed the issue by -reanimating the findXdndAwareParent() function (adapted to XCB) and -using it to find a matching transaction if all else fails. - -Task-number: QTBUG-45812 -Change-Id: Ibca15bbab02ccf2f25280418e9edf36972ebf9a0 -Reviewed-by: Błażej Szczygieł <spaz16@wp.pl> -Reviewed-by: Dmitry Shachnev <mitya57@gmail.com> -Reviewed-by: Shawn Rutledge <shawn.rutledge@theqtcompany.com> ---- - src/plugins/platforms/xcb/qxcbdrag.cpp | 55 +++++++++++++++++++++++++++------- - 1 file changed, 44 insertions(+), 11 deletions(-) - -diff --git a/src/plugins/platforms/xcb/qxcbdrag.cpp b/src/plugins/platforms/xcb/qxcbdrag.cpp -index f5cc873..f1428d0 100644 ---- a/src/plugins/platforms/xcb/qxcbdrag.cpp -+++ b/src/plugins/platforms/xcb/qxcbdrag.cpp -@@ -1072,6 +1072,40 @@ void QXcbDrag::cancel() - send_leave(); - } - -+// find an ancestor with XdndAware on it -+static xcb_window_t findXdndAwareParent(QXcbConnection *c, xcb_window_t window) -+{ -+ xcb_window_t target = 0; -+ forever { -+ // check if window has XdndAware -+ xcb_get_property_cookie_t gpCookie = Q_XCB_CALL( -+ xcb_get_property(c->xcb_connection(), false, window, -+ c->atom(QXcbAtom::XdndAware), XCB_GET_PROPERTY_TYPE_ANY, 0, 0)); -+ xcb_get_property_reply_t *gpReply = xcb_get_property_reply( -+ c->xcb_connection(), gpCookie, 0); -+ bool aware = gpReply && gpReply->type != XCB_NONE; -+ free(gpReply); -+ if (aware) { -+ target = window; -+ break; -+ } -+ -+ // try window's parent -+ xcb_query_tree_cookie_t qtCookie = Q_XCB_CALL( -+ xcb_query_tree_unchecked(c->xcb_connection(), window)); -+ xcb_query_tree_reply_t *qtReply = xcb_query_tree_reply( -+ c->xcb_connection(), qtCookie, NULL); -+ if (!qtReply) -+ break; -+ xcb_window_t root = qtReply->root; -+ xcb_window_t parent = qtReply->parent; -+ free(qtReply); -+ if (window == root) -+ break; -+ window = parent; -+ } -+ return target; -+} - - void QXcbDrag::handleSelectionRequest(const xcb_selection_request_event_t *event) - { -@@ -1099,17 +1133,16 @@ void QXcbDrag::handleSelectionRequest(const xcb_selection_request_event_t *event - // xcb_convert_selection() that we sent the XdndDrop event to. - at = findTransactionByWindow(event->requestor); - } --// if (at == -1 && event->time == XCB_CURRENT_TIME) { --// // previous Qt versions always requested the data on a child of the target window --// // using CurrentTime... but it could be asking for either drop data or the current drag's data --// Window target = findXdndAwareParent(event->requestor); --// if (target) { --// if (current_target && current_target == target) --// at = -2; --// else --// at = findXdndDropTransactionByWindow(target); --// } --// } -+ -+ if (at == -1 && event->time == XCB_CURRENT_TIME) { -+ xcb_window_t target = findXdndAwareParent(connection(), event->requestor); -+ if (target) { -+ if (current_target == target) -+ at = -2; -+ else -+ at = findTransactionByWindow(target); -+ } -+ } - } - - QDrag *transactionDrag = 0; --- -2.7.1 - diff --git a/qtbug-51648.patch b/qtbug-51648.patch deleted file mode 100644 index 279839b..0000000 --- a/qtbug-51648.patch +++ /dev/null @@ -1,88 +0,0 @@ -From b024fbe83863fc57364a52c717d5b43d654bdb5d Mon Sep 17 00:00:00 2001 -From: Weng Xuetian <wengxt@gmail.com> -Date: Sat, 5 Mar 2016 12:23:21 -0800 -Subject: [PATCH] QtDBus: clean up signal hooks and object tree in - closeConnection - -If a QObject is added or passed as receiver to QDBusConnection::connect() -and it is managed by Q_GLOBAL_STATIC or similar mechanism, it is -possible that when that its destructor is called after the dbus daemon -thread ends. In that case, QObject::destroyed connected via -Qt::BlockingQueuedConnection to QDBusConnectionPrivate will cause dead -lock since the thread is no longer processing events. - -Task-number: QTBUG-51648 -Change-Id: I1a1810a6d6d0234af0269d5f3fc1f54101bf1547 ---- - src/dbus/qdbusconnection_p.h | 1 + - src/dbus/qdbusintegrator.cpp | 28 +++++++++++++++++++++++++++- - 2 files changed, 28 insertions(+), 1 deletion(-) - -diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h -index c77daf7..565eb83 100644 ---- a/src/dbus/qdbusconnection_p.h -+++ b/src/dbus/qdbusconnection_p.h -@@ -254,6 +254,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 cd44861..a3cd47b 100644 ---- a/src/dbus/qdbusintegrator.cpp -+++ b/src/dbus/qdbusintegrator.cpp -@@ -1030,7 +1030,6 @@ QDBusConnectionPrivate::~QDBusConnectionPrivate() - qPrintable(name)); - - closeConnection(); -- rootNode.children.clear(); // free resources - qDeleteAll(cachedMetaObjects); - - if (mode == ClientMode || mode == PeerMode) { -@@ -1052,6 +1051,20 @@ 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); -@@ -1075,6 +1088,19 @@ void QDBusConnectionPrivate::closeConnection() - } - - qDeleteAll(pendingCalls); -+ -+ // clean up all signal hook and object tree, to avoid QObject::destroyed -+ // being activated to dbus daemon thread which already quits. -+ // dbus connection is already closed, so there is nothing we could do be clean -+ // up everything here. -+ 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() --- -2.7.1 - diff --git a/qtbug-51649.patch b/qtbug-51649.patch deleted file mode 100644 index 3b7cf9e..0000000 --- a/qtbug-51649.patch +++ /dev/null @@ -1,159 +0,0 @@ -From acde2e69df5dedc624674107596f276125e22864 Mon Sep 17 00:00:00 2001 -From: Weng Xuetian <wengxt@gmail.com> -Date: Thu, 3 Mar 2016 21:56:53 -0800 -Subject: [PATCH] QtDBus: finish all pending call with error if disconnected - -libdbus will send a local signal if connection gets disconnected. When -this happens, end all pending calls with QDBusError::Disconnected. - -Task-number: QTBUG-51649 -Change-Id: I5c7d2a468bb5da746d0c0e53e458c1e376f186a9 ---- - src/dbus/dbus_minimal_p.h | 2 ++ - src/dbus/qdbusintegrator.cpp | 26 +++++++++++++++++----- - src/dbus/qdbusutil_p.h | 6 +++++ - .../dbus/qdbusconnection/tst_qdbusconnection.cpp | 22 ++++++++++++++++++ - .../dbus/qdbusconnection/tst_qdbusconnection.h | 1 + - 5 files changed, 51 insertions(+), 6 deletions(-) - -diff --git a/src/dbus/dbus_minimal_p.h b/src/dbus/dbus_minimal_p.h -index f0a2954..8f25b24 100644 ---- a/src/dbus/dbus_minimal_p.h -+++ b/src/dbus/dbus_minimal_p.h -@@ -99,9 +99,11 @@ typedef dbus_uint32_t dbus_bool_t; - /* dbus-shared.h */ - #define DBUS_SERVICE_DBUS "org.freedesktop.DBus" - #define DBUS_PATH_DBUS "/org/freedesktop/DBus" -+#define DBUS_PATH_LOCAL "/org/freedesktop/DBus/Local" - #define DBUS_INTERFACE_DBUS "org.freedesktop.DBus" - #define DBUS_INTERFACE_INTROSPECTABLE "org.freedesktop.DBus.Introspectable" - #define DBUS_INTERFACE_PROPERTIES "org.freedesktop.DBus.Properties" -+#define DBUS_INTERFACE_LOCAL "org.freedesktop.DBus.Local" - - #define DBUS_NAME_FLAG_ALLOW_REPLACEMENT 0x1 /**< Allow another service to become the primary owner if requested */ - #define DBUS_NAME_FLAG_REPLACE_EXISTING 0x2 /**< Request to replace the current primary owner */ -diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp -index cd44861..320419f 100644 ---- a/src/dbus/qdbusintegrator.cpp -+++ b/src/dbus/qdbusintegrator.cpp -@@ -519,6 +519,14 @@ bool QDBusConnectionPrivate::handleMessage(const QDBusMessage &amsg) - switch (amsg.type()) { - case QDBusMessage::SignalMessage: - handleSignal(amsg); -+ // Check local disconnected signal from libdbus -+ if (amsg.interface() == QDBusUtil::dbusInterfaceLocal() -+ && amsg.path() == QDBusUtil::dbusPathLocal() -+ && amsg.member() == QDBusUtil::disconnected() -+ && !QDBusMessagePrivate::isLocal(amsg)) { -+ while (!pendingCalls.isEmpty()) -+ processFinishedCall(pendingCalls.first()); -+ } - // if there are any other filters in this DBusConnection, - // let them see the signal too - return false; -@@ -1767,10 +1775,16 @@ void QDBusConnectionPrivate::processFinishedCall(QDBusPendingCallPrivate *call) - - QDBusMessage &msg = call->replyMessage; - if (call->pending) { -- // decode the message -- DBusMessage *reply = q_dbus_pending_call_steal_reply(call->pending); -- msg = QDBusMessagePrivate::fromDBusMessage(reply, connection->capabilities); -- q_dbus_message_unref(reply); -+ // when processFinishedCall is called and pending call is not completed, -+ // it means we received disconnected signal from libdbus -+ if (q_dbus_pending_call_get_completed(call->pending)) { -+ // decode the message -+ DBusMessage *reply = q_dbus_pending_call_steal_reply(call->pending); -+ msg = QDBusMessagePrivate::fromDBusMessage(reply, connection->capabilities); -+ q_dbus_message_unref(reply); -+ } else { -+ msg = QDBusMessage::createError(QDBusError::Disconnected, QDBusUtil::disconnectedErrorMessage()); -+ } - } - qDBusDebug() << connection << "got message reply:" << msg; - -@@ -2070,8 +2084,8 @@ void QDBusConnectionPrivate::sendInternal(QDBusPendingCallPrivate *pcall, void * - pcall->pending = pending; - q_dbus_pending_call_set_notify(pending, qDBusResultReceived, pcall, 0); - -- // DBus won't notify us when a peer disconnects so we need to track these ourselves -- if (mode == QDBusConnectionPrivate::PeerMode) -+ // DBus won't notify us when a peer disconnects or server terminates so we need to track these ourselves -+ if (mode == QDBusConnectionPrivate::PeerMode || mode == QDBusConnectionPrivate::ClientMode) - pendingCalls.append(pcall); - - return; -diff --git a/src/dbus/qdbusutil_p.h b/src/dbus/qdbusutil_p.h -index 8f5ae92..ca70ff9 100644 ---- a/src/dbus/qdbusutil_p.h -+++ b/src/dbus/qdbusutil_p.h -@@ -155,6 +155,8 @@ namespace QDBusUtil - { return QStringLiteral(DBUS_SERVICE_DBUS); } - inline QString dbusPath() - { return QStringLiteral(DBUS_PATH_DBUS); } -+ inline QString dbusPathLocal() -+ { return QStringLiteral(DBUS_PATH_LOCAL); } - inline QString dbusInterface() - { - // it's the same string, but just be sure -@@ -165,8 +167,12 @@ namespace QDBusUtil - { return QStringLiteral(DBUS_INTERFACE_PROPERTIES); } - inline QString dbusInterfaceIntrospectable() - { return QStringLiteral(DBUS_INTERFACE_INTROSPECTABLE); } -+ inline QString dbusInterfaceLocal() -+ { return QStringLiteral(DBUS_INTERFACE_LOCAL); } - inline QString nameOwnerChanged() - { return QStringLiteral("NameOwnerChanged"); } -+ inline QString disconnected() -+ { return QStringLiteral("Disconnected"); } - inline QString disconnectedErrorMessage() - { return QStringLiteral("Not connected to D-Bus server"); } - } -diff --git a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp -index e91f87d..6c7e6b1 100644 ---- a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp -+++ b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp -@@ -1218,6 +1218,28 @@ void tst_QDBusConnection::callVirtualObjectLocal() - QCOMPARE(obj.replyArguments, subPathReply.arguments()); - } - -+void tst_QDBusConnection::pendingCallWhenDisconnected() -+{ -+ QDBusServer *server = new QDBusServer; -+ QDBusConnection con = QDBusConnection::connectToPeer(server->address(), "disconnect"); -+ QTestEventLoop::instance().enterLoop(2); -+ QVERIFY(!QTestEventLoop::instance().timeout()); -+ QVERIFY(con.isConnected()); -+ -+ delete server; -+ -+ // Make sure we call the method before we know it is disconnected. -+ QVERIFY(con.isConnected()); -+ QDBusMessage message = QDBusMessage::createMethodCall("", "/", QString(), "method"); -+ QDBusPendingCall reply = con.asyncCall(message); -+ -+ QTestEventLoop::instance().enterLoop(2); -+ QVERIFY(!con.isConnected()); -+ QVERIFY(reply.isFinished()); -+ QVERIFY(reply.isError()); -+ QVERIFY(reply.error().type() == QDBusError::Disconnected); -+} -+ - QString MyObject::path; - QString MyObjectWithoutInterface::path; - QString MyObjectWithoutInterface::interface; -diff --git a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h -index a53ba32..720e484 100644 ---- a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h -+++ b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h -@@ -121,6 +121,7 @@ private slots: - void registerVirtualObject(); - void callVirtualObject(); - void callVirtualObjectLocal(); -+ void pendingCallWhenDisconnected(); - - public: - QString serviceName() const { return "org.qtproject.Qt.Autotests.QDBusConnection"; } --- -2.7.1 - diff --git a/qtbug-51676.patch b/qtbug-51676.patch deleted file mode 100644 index 8672a21..0000000 --- a/qtbug-51676.patch +++ /dev/null @@ -1,126 +0,0 @@ -From 11c5e716b08b6b3c5a7c9fce96b0cde8624ec869 Mon Sep 17 00:00:00 2001 -From: Thiago Macieira <thiago.macieira@intel.com> -Date: Tue, 15 Mar 2016 11:00:20 -0700 -Subject: [PATCH] Fix QtDBus deadlock inside kded/kiod - -Whenever a message spy was installed, we failed to actually process -looped-back messages by queueing them for processing by the spy. That -had as a consequence that the caller got an error reply. Worse, since -the message had been queued, QtDBus would attempt to deliver it later. -Since that message had isLocal==true, bad things happened inside the -manager thread. - -The correct solution is not to queue the message for the filter. If the -message is local, then simply deliver directly, as we're still in the -user's thread. This used to be the behavior in Qt 5.5. - -Task-number: QTBUG-51676 -Change-Id: I1dc112894cde7121e8ce302ae51b438ade1ff612 ---- - src/dbus/qdbusintegrator.cpp | 42 ++++++++++++++++++++++++++++++++---------- - src/dbus/qdbusintegrator_p.h | 1 + - 2 files changed, 33 insertions(+), 10 deletions(-) - -diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp -index cd44861..478a2c4 100644 ---- a/src/dbus/qdbusintegrator.cpp -+++ b/src/dbus/qdbusintegrator.cpp -@@ -481,6 +481,11 @@ QDBusSpyCallEvent::~QDBusSpyCallEvent() - - 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 @@ bool QDBusConnectionPrivate::handleMessage(const QDBusMessage &amsg) - { - 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 @@ bool QDBusConnectionPrivate::handleMessage(const QDBusMessage &amsg) - // 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 @@ void QDBusConnectionPrivate::handleObjectCall(const QDBusMessage &msg) - // 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 @@ void QDBusConnectionPrivate::handleObjectCall(const QDBusMessage &msg) - 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 -diff --git a/src/dbus/qdbusintegrator_p.h b/src/dbus/qdbusintegrator_p.h -index 2bbebdf..c0d9c22 100644 ---- a/src/dbus/qdbusintegrator_p.h -+++ b/src/dbus/qdbusintegrator_p.h -@@ -145,6 +145,7 @@ public: - {} - ~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; --- -2.7.1 -