From 312a476890ae830b91ceda3773f9a858110e7586 Mon Sep 17 00:00:00 2001 From: Eric Hameleers Date: Wed, 20 Apr 2016 11:13:38 +0200 Subject: Refresh the 'deps' for upcoming KDE 5_16.04. New packages: - deps/ninja (needed for easier compilation of qt5-webkit) - deps/qt5-webkit (sources have been split off qt5) --- deps/qt5/.url | 1 + deps/qt5/patches/qt5.alsa.patch | 101 +-------------------- deps/qt5/patches/qt5.qtbug-51621.patch | 39 ++++++++ deps/qt5/patches/qt5.qtbug-51648.patch | 88 ++++++++++++++++++ deps/qt5/patches/qt5.qtbug-51649.patch | 159 +++++++++++++++++++++++++++++++++ deps/qt5/patches/qt5.qtbug-51676.patch | 126 ++++++++++++++++++++++++++ deps/qt5/patches/qt5.qtbug-51890.patch | 82 +++++++++++++++++ deps/qt5/qt5.SlackBuild | 31 ++++--- 8 files changed, 519 insertions(+), 108 deletions(-) create mode 100644 deps/qt5/.url create mode 100644 deps/qt5/patches/qt5.qtbug-51621.patch create mode 100644 deps/qt5/patches/qt5.qtbug-51648.patch create mode 100644 deps/qt5/patches/qt5.qtbug-51649.patch create mode 100644 deps/qt5/patches/qt5.qtbug-51676.patch create mode 100644 deps/qt5/patches/qt5.qtbug-51890.patch (limited to 'deps/qt5') diff --git a/deps/qt5/.url b/deps/qt5/.url new file mode 100644 index 0000000..241563c --- /dev/null +++ b/deps/qt5/.url @@ -0,0 +1 @@ +http://download.qt.io/official_releases/qt/5.6/5.6.0/single/qt-everywhere-opensource-src-5.6.0.tar.xz diff --git a/deps/qt5/patches/qt5.alsa.patch b/deps/qt5/patches/qt5.alsa.patch index 528bc8b..892431b 100644 --- a/deps/qt5/patches/qt5.alsa.patch +++ b/deps/qt5/patches/qt5.alsa.patch @@ -1,104 +1,11 @@ -http://svnweb.freebsd.org/ports/head/multimedia/qt5-multimedia/files/patch-git_3b322323?view=log#rev402657 - -commit 3b322323d036ae2fc9f685bfc74d1ebcd5532159 -Author: Raphael Kubo da Costa -Date: Fri Nov 27 14:36:50 2015 +0100 - - alsa: Relax ALSA version checks for 1.1.x to be detected. - - Relax the check for SND_LIB_MINOR and SND_LIB_SUBMINOR so that ALSA - 1.1.x is not considered older than 1.0.10. QtMultimedia builds fine with - ALSA 1.1. - - Change-Id: If697c34cc7d9bbe2f2a3413d0c25ac4de4e93b34 - Reviewed-by: Christian Stromme - ---- config.tests/alsa/alsatest.cpp -+++ config.tests/alsa/alsatest.cpp +--- qt-everywhere-opensource-src-5.6.0/qtbase/config.tests/unix/alsa/alsatest.cpp.orig 2016-02-29 08:15:48.203031809 +0000 ++++ qt-everywhere-opensource-src-5.6.0/qtbase/config.tests/unix/alsa/alsatest.cpp 2016-02-29 08:16:39.712811962 +0000 @@ -32,7 +32,7 @@ ****************************************************************************/ #include --#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))) +-#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 ---- src/plugins/alsa/qalsaaudiodeviceinfo.cpp -+++ src/plugins/alsa/qalsaaudiodeviceinfo.cpp -@@ -141,7 +141,7 @@ bool QAlsaAudioDeviceInfo::open() - QList devices = availableDevices(mode); - - if(dev.compare(QLatin1String("default")) == 0) { --#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) -+#if (SND_LIB_MAJOR == 1 && (SND_LIB_MINOR > 0 || SND_LIB_SUBMINOR >= 14)) - if (devices.size() > 0) - dev = QLatin1String(devices.first().constData()); - else -@@ -150,7 +150,7 @@ bool QAlsaAudioDeviceInfo::open() - dev = QLatin1String("hw:0,0"); - #endif - } else { --#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) -+#if (SND_LIB_MAJOR == 1 && (SND_LIB_MINOR > 0 || SND_LIB_SUBMINOR >= 14)) - dev = device; - #else - int idx = 0; -@@ -194,7 +194,7 @@ bool QAlsaAudioDeviceInfo::testSettings(const QAudioFormat& format) const - snd_pcm_hw_params_t *params; - QString dev; - --#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) -+#if (SND_LIB_MAJOR == 1 && (SND_LIB_MINOR > 0 || SND_LIB_SUBMINOR >= 14)) - dev = device; - if (dev.compare(QLatin1String("default")) == 0) { - QList devices = availableDevices(QAudio::AudioOutput); -@@ -335,7 +335,7 @@ QList QAlsaAudioDeviceInfo::availableDevices(QAudio::Mode mode) - QList devices; - QByteArray filter; - --#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) -+#if (SND_LIB_MAJOR == 1 && (SND_LIB_MINOR > 0 || SND_LIB_SUBMINOR >= 14)) - // Create a list of all current audio devices that support mode - void **hints, **n; - char *name, *descr, *io; ---- src/plugins/alsa/qalsaaudioinput.cpp -+++ src/plugins/alsa/qalsaaudioinput.cpp -@@ -303,7 +303,7 @@ bool QAlsaAudioInput::open() - QString dev = QString(QLatin1String(m_device.constData())); - QList devices = QAlsaAudioDeviceInfo::availableDevices(QAudio::AudioInput); - if(dev.compare(QLatin1String("default")) == 0) { --#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) -+#if (SND_LIB_MAJOR == 1 && (SND_LIB_MINOR > 0 || SND_LIB_SUBMINOR >= 14)) - if (devices.size() > 0) - dev = QLatin1String(devices.first()); - else -@@ -312,7 +312,7 @@ bool QAlsaAudioInput::open() - dev = QLatin1String("hw:0,0"); - #endif - } else { --#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) -+#if (SND_LIB_MAJOR == 1 && (SND_LIB_MINOR > 0 || SND_LIB_SUBMINOR >= 14)) - dev = QLatin1String(m_device); - #else - int idx = 0; ---- src/plugins/alsa/qalsaaudiooutput.cpp -+++ src/plugins/alsa/qalsaaudiooutput.cpp -@@ -306,7 +306,7 @@ bool QAlsaAudioOutput::open() - QString dev = QString(QLatin1String(m_device.constData())); - QList devices = QAlsaAudioDeviceInfo::availableDevices(QAudio::AudioOutput); - if(dev.compare(QLatin1String("default")) == 0) { --#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) -+#if (SND_LIB_MAJOR == 1 && (SND_LIB_MINOR > 0 || SND_LIB_SUBMINOR >= 14)) - if (devices.size() > 0) - dev = QLatin1String(devices.first()); - else -@@ -315,7 +315,7 @@ bool QAlsaAudioOutput::open() - dev = QLatin1String("hw:0,0"); - #endif - } else { --#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) -+#if (SND_LIB_MAJOR == 1 && (SND_LIB_MINOR > 0 || SND_LIB_SUBMINOR >= 14)) - dev = QLatin1String(m_device); - #else - int idx = 0; diff --git a/deps/qt5/patches/qt5.qtbug-51621.patch b/deps/qt5/patches/qt5.qtbug-51621.patch new file mode 100644 index 0000000..187a3d7 --- /dev/null +++ b/deps/qt5/patches/qt5.qtbug-51621.patch @@ -0,0 +1,39 @@ +build with explicitlib after all + +unlike speculated in 2fe363514, this is not a workaround at all: it +causes that libraries' public link interfaces (LIBS) are exported in the +first place. unlike with staticlib, this does not export LIBS_PRIVATE, +so it wouldn't even be a particularly effective workaround for rpath +brokenness anyway. + +the problem was pretty well hidden by the qt module system, which at the +level of libraries is pretty redundant with the .prl file handling, +which shows just how stupid the whole "design" is. + +unlike before, we now enable explicitlib for all libraries, not just qt +modules - we enable create_prl for all of them as well, after all. + +an immediate effect of this change is that it fixes linking on RaspPI: +the qtcore headers make the user code require linking libatomic, so we +must add it to our public link interface. + +Task-number: QTBUG-51621 +Change-Id: I5742c88694db8e8a9b79d17222dc6df2b38e5ab2 + +X-Git-Url: https://codereview.qt-project.org/gitweb?p=qt%2Fqtbase.git;a=blobdiff_plain;f=mkspecs%2Ffeatures%2Fqt_build_config.prf;h=b3081b960ec192c3421d7a1c2bd5a628f0ca8455;hp=518fd93f0457c6060721c38ad8b6a0286407e562;hb=268e7ee9778de79d2485bdd028721ec7adbc1324;hpb=495e8c205424253186bef47421de63534d23dd59 + +diff --git a/mkspecs/features/qt_build_config.prf b/mkspecs/features/qt_build_config.prf +index 518fd93..b3081b9 100644 +--- a/mkspecs/features/qt_build_config.prf ++++ b/mkspecs/features/qt_build_config.prf +@@ -72,6 +72,10 @@ CONFIG += \ + # However, testcases should be still built with exceptions. + exceptions_off testcase_exceptions + ++# Under Windows, this is neither necessary (transitive deps are automatically ++# resolved), nor functional (.res files end up in .prl files and break things). ++unix: CONFIG += explicitlib ++ + + defineTest(qtBuildPart) { + bp = $$eval($$upper($$section(_QMAKE_CONF_, /, -2, -2))_BUILD_PARTS) diff --git a/deps/qt5/patches/qt5.qtbug-51648.patch b/deps/qt5/patches/qt5.qtbug-51648.patch new file mode 100644 index 0000000..279839b --- /dev/null +++ b/deps/qt5/patches/qt5.qtbug-51648.patch @@ -0,0 +1,88 @@ +From b024fbe83863fc57364a52c717d5b43d654bdb5d Mon Sep 17 00:00:00 2001 +From: Weng Xuetian +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 &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/deps/qt5/patches/qt5.qtbug-51649.patch b/deps/qt5/patches/qt5.qtbug-51649.patch new file mode 100644 index 0000000..3b7cf9e --- /dev/null +++ b/deps/qt5/patches/qt5.qtbug-51649.patch @@ -0,0 +1,159 @@ +From acde2e69df5dedc624674107596f276125e22864 Mon Sep 17 00:00:00 2001 +From: Weng Xuetian +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/deps/qt5/patches/qt5.qtbug-51676.patch b/deps/qt5/patches/qt5.qtbug-51676.patch new file mode 100644 index 0000000..8672a21 --- /dev/null +++ b/deps/qt5/patches/qt5.qtbug-51676.patch @@ -0,0 +1,126 @@ +From 11c5e716b08b6b3c5a7c9fce96b0cde8624ec869 Mon Sep 17 00:00:00 2001 +From: Thiago Macieira +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 + diff --git a/deps/qt5/patches/qt5.qtbug-51890.patch b/deps/qt5/patches/qt5.qtbug-51890.patch new file mode 100644 index 0000000..51168b9 --- /dev/null +++ b/deps/qt5/patches/qt5.qtbug-51890.patch @@ -0,0 +1,82 @@ +QTBUG-51890: qtwebengine fails to build with system nss 3.23 +Patch obtained from: +https://github.com/qtproject/qtwebengine/commit/82900c7b96b2a6fb42fe3841df7685b820edd588.patch + +And modified to exclude the "Subproject commit" lines. + +# ---------------------------------------------------------------------------- + +From 82900c7b96b2a6fb42fe3841df7685b820edd588 Mon Sep 17 00:00:00 2001 +From: Kai Koehne +Date: Thu, 24 Mar 2016 13:55:28 +0100 +Subject: [PATCH] Use system NSS only for certificate handling + +Compiling against NSS 3.23 fails with current Chromium. Also, with NSS +3.21 there are failures connecting to e.g. google.com. + +Fix this by adapting the setup endorsed by upstream Chromium: BoringSSL +is always used for cryptography, and NSS only for certificate handlng. + +Patches included in 3rdparty update: + +0a385bb [backport] Call EnsureNSSHttpIOInit in the chimera build. +0472123 Fix build against newer NSS +90c62c4 [Backport] update to libpng 1.2.56 +34857b8 [Backport] Stop large iCCP chunks causing delays and "Aw Snap!" + +Task-number: QTBUG-52193 +Task-number: QTBUG-51890 +Task-number: QTBUG-52068 +Change-Id: If8aaed9b9a09475c5ed0dfec64d31f45ce9670f5 +Reviewed-by: Allan Sandfeld Jensen +--- + src/3rdparty | 2 +- + src/core/config/linux.pri | 9 ++++++--- + tools/qmake/mkspecs/features/configure.prf | 4 ++-- + 3 files changed, 9 insertions(+), 6 deletions(-) + +#diff --git a/src/3rdparty b/src/3rdparty +#index 3b2b78c..0a385bb 160000 +#--- a/src/3rdparty +#+++ b/src/3rdparty +#@@ -1 +1 @@ +#-Subproject commit 3b2b78caa761db2b7b25dc51c3dae8316f595db1 +#+Subproject commit 0a385bb01d9cf060fae4c9d350ee98561654df96 +diff --git a/src/core/config/linux.pri b/src/core/config/linux.pri +index 88c1a41..39eeb2a 100644 +--- a/src/core/config/linux.pri ++++ b/src/core/config/linux.pri +@@ -18,11 +18,14 @@ GYP_CONFIG += \ + use_gio=0 \ + use_gnome_keyring=0 \ + use_kerberos=0 \ +- use_pango=0 ++ use_pango=0 \ ++ use_openssl=1 + +-!use?(nss) { ++use?(nss) { ++ GYP_CONFIG += use_nss_certs=1 \ ++ use_openssl_certs=0 ++} else { + GYP_CONFIG += use_nss_certs=0 \ +- use_openssl=1 \ + use_openssl_certs=1 + } + +diff --git a/tools/qmake/mkspecs/features/configure.prf b/tools/qmake/mkspecs/features/configure.prf +index 4cb4600..953572d 100644 +--- a/tools/qmake/mkspecs/features/configure.prf ++++ b/tools/qmake/mkspecs/features/configure.prf +@@ -72,9 +72,9 @@ defineTest(runConfigure) { + defineTest(finalizeConfigure) { + linux { + use?(nss) { +- log("SSL............................... Using system NSS$${EOL}") ++ log("Certificate handling.............. Using system NSS$${EOL}") + } else { +- log("SSL............................... Using bundled BoringSSL$${EOL}") ++ log("Certificate handling.............. Using bundled BoringSSL$${EOL}") + } + use?(system_icu) { + packagesExist("icu-uc icu-i18n") { diff --git a/deps/qt5/qt5.SlackBuild b/deps/qt5/qt5.SlackBuild index 83efd87..d5c57cc 100755 --- a/deps/qt5/qt5.SlackBuild +++ b/deps/qt5/qt5.SlackBuild @@ -1,6 +1,6 @@ #!/bin/sh -# Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Patrick J. Volkerding, Sebeka, MN, USA +# Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Patrick J. Volkerding, Sebeka, MN, USA # All rights reserved. # # Redistribution and use of this script, with or without modification, is @@ -45,10 +45,11 @@ # Modifications for qt 5.4.0 2015 by Eric Hameleers, Eindhoven, NL # Modifications for qt 5.4.1 2015 by Eric Hameleers, Eindhoven, NL # Modifications for qt 5.5.1 2015,2016 by Eric Hameleers, Eindhoven, NL +# Modifications for qt 5.6.0 2016 by Eric Hameleers, Eindhoven, NL PKGNAM=qt5 -VERSION=${VERSION:-5.5.1} -BUILD=${BUILD:-5} +VERSION=${VERSION:-5.6.0} +BUILD=${BUILD:-1} NUMJOBS=${NUMJOBS:--j7} @@ -131,12 +132,24 @@ fi cat $CWD/patches/qt5.mysql.h.diff | patch -p1 --verbose || exit 1 # Properly detect ALSA version 1.1.0 as being newer than 1.0.10: -cd qtmultimedia - cat $CWD/patches/qt5.alsa.patch | patch -p0 --verbose || exit 1 +cat $CWD/patches/qt5.alsa.patch | patch -p1 --verbose || exit 1 + +# Build with explicitlib, preventing linker errors: +cd qtbase + cat $CWD/patches/qt5.qtbug-51621.patch | patch -p1 --verbose || exit 1 cd - -# Prevent cropped video in full-screen mode (QTBUG-48321): -cat $CWD/patches/qt5.whandle.patch | patch -p1 --verbose || exit 1 +# Backport fixes for QtDBus deadlocks: +cd qtbase + cat $CWD/patches/qt5.qtbug-51648.patch | patch -p1 --verbose || exit 1 + cat $CWD/patches/qt5.qtbug-51649.patch | patch -p1 --verbose || exit 1 + cat $CWD/patches/qt5.qtbug-51676.patch | patch -p1 --verbose || exit 1 +cd - + +# qtwebengine fails to build with system nss 3.23: +cd qtwebengine + cat $CWD/patches/qt5.qtbug-51890.patch | patch -p1 --verbose || exit 1 +cd - if ! pkg-config --exists libpulse 2>/dev/null ; then # Forcibly disable pulseaudio in qtwebengine: @@ -147,10 +160,6 @@ else PACONF=" " fi -# Install path fix for libplatformplugin.so: -# See https://bugs.webkit.org/show_bug.cgi?id=117077 -cat $CWD/patches/platformplugin-install-path-fix.patch | patch -p1 --verbose || exit 1 - sed -i -e "s/-O2/$SLKCFLAGS/" qtbase/mkspecs/common/g++-base.conf || exit 1 sed -i -e "s/-O2/$SLKCFLAGS/" qtbase/mkspecs/common/gcc-base.conf || exit 1 sed -i -e "/^QMAKE_LFLAGS\s/s,+=,+= $SLKLDFLAGS,g" qtbase/mkspecs/common/gcc-base.conf || exit 1 -- cgit v1.2.3