diff --git a/desktop/kde/phonon/qt5-phonon-backend-gstreamer/actions.py b/desktop/kde/phonon/qt5-phonon-backend-gstreamer/actions.py index 713b425bb7..5019df1cbf 100644 --- a/desktop/kde/phonon/qt5-phonon-backend-gstreamer/actions.py +++ b/desktop/kde/phonon/qt5-phonon-backend-gstreamer/actions.py @@ -8,11 +8,7 @@ from pisi.actionsapi import kde5 from pisi.actionsapi import pisitools def setup(): - kde5.configure("-DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DCMAKE_SKIP_RPATH=ON \ - -DCMAKE_INSTALL_LIBDIR=lib \ - -D__KDE_HAVE_GCC_VISIBILITY=NO \ + kde5.configure("-D__KDE_HAVE_GCC_VISIBILITY=NO \ -DPHONON_BUILD_PHONON4QT5=ON") def build(): diff --git a/desktop/kde/phonon/qt5-phonon-backend-gstreamer/pspec.xml b/desktop/kde/phonon/qt5-phonon-backend-gstreamer/pspec.xml index 2f70cdbd64..9aeb4d2a1a 100644 --- a/desktop/kde/phonon/qt5-phonon-backend-gstreamer/pspec.xml +++ b/desktop/kde/phonon/qt5-phonon-backend-gstreamer/pspec.xml @@ -13,8 +13,10 @@ library GStreamer qt5-phonon backend Phonon is the Qt multimedia API, which provides a task-oriented abstraction layer for capturing, mixing, processing, and playing audio and video content. phonon-backend-gstreamer contains the GStreamer backend for Phonon. - mirrors://kde/stable/phonon/phonon-backend-gstreamer/4.8.2/src/phonon-backend-gstreamer-4.8.2.tar.xz + http://download.kde.org/stable/phonon/phonon-backend-gstreamer/4.9.0/phonon-backend-gstreamer-4.9.0.tar.xz + extra-cmake-modules + qt5-x11extras-devel qt5-base-devel qt5-phonon-devel gstreamer-devel @@ -23,7 +25,6 @@ gst-plugins-base-next-devel mesa-devel libxml2-devel - cmake @@ -31,6 +32,7 @@ qt5-phonon-backend-gstreamer qt5-base + qt5-x11extras qt5-phonon mesa glib2 @@ -46,6 +48,13 @@ + + 2016-05-03 + 4.9.0 + Version bump. + Stefan Gronewold(groni) + groni@pisilinux.org + 2015-08-18 4.8.2 diff --git a/desktop/kde/phonon/qt5-phonon/actions.py b/desktop/kde/phonon/qt5-phonon/actions.py index c0ec460f79..b4fc40a6e2 100644 --- a/desktop/kde/phonon/qt5-phonon/actions.py +++ b/desktop/kde/phonon/qt5-phonon/actions.py @@ -9,18 +9,13 @@ from pisi.actionsapi import pisitools from pisi.actionsapi import get def setup(): - kde5.configure("-DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_SKIP_RPATH=ON \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DPHONON_INSTALL_QT_EXTENSIONS_INTO_SYSTEM_QT=ON \ - -DPHONON_BUILD_PHONON4QT5=ON \ - -D__KDE_HAVE_GCC_VISIBILITY=NO \ - -DCMAKE_INSTALL_LIBDIR=lib") + kde5.configure("-DPHONON_BUILD_PHONON4QT5=ON") def build(): kde5.make() def install(): kde5.install() - - pisitools.dosym("/usr/include/KDE/Phonon", "/usr/include/Phonon") + + pisitools.domove("/usr/share/qt5/mkspecs/modules/qt_phonon4qt5.pri", "/usr/lib/qt5/mkspecs/modules/") + pisitools.removeDir("/usr/share/qt5") diff --git a/desktop/kde/phonon/qt5-phonon/pspec.xml b/desktop/kde/phonon/qt5-phonon/pspec.xml index 1c5c950319..428d67db62 100644 --- a/desktop/kde/phonon/qt5-phonon/pspec.xml +++ b/desktop/kde/phonon/qt5-phonon/pspec.xml @@ -13,8 +13,9 @@ library Cross platform multimedia API for KDE4 using QT5 Phonon was created as a solution to several problems with multimedia commonly faced by Unix desktops, especially KDE 3's outdated multimedia framework aRts. Phonon itself is not a multimedia framework, but interfaces with existing frameworks such as GStreamer or Xine via backends. - mirrors://kde/stable/phonon/4.8.3/src/phonon-4.8.3.tar.xz + http://download.kde.org/stable/phonon/4.9.0/phonon-4.9.0.tar.xz + extra-cmake-modules qt5-base-devel qt5-designer-devel qt5-quick1-devel @@ -22,11 +23,10 @@ gst-plugins-base-devel pulseaudio-libs-devel gstreamer-devel - cmake mesa-devel - qt-5.4.2.patch + @@ -43,6 +43,7 @@ /usr/lib/libphonon* /usr/lib/qt5 /usr/share/dbus-1 + /usr/share/phonon4qt5 @@ -59,12 +60,18 @@ /usr/include /usr/lib/pkgconfig /usr/lib/cmake - /usr/share/phonon4qt5 - + + 2016-05-03 + 4.9.0 + Version bump. + Stefan Gronewold(groni) + groni@pisilinux.org + + 2015-08-13 4.8.3 First release @@ -72,5 +79,4 @@ groni@pisilinux.org - diff --git a/desktop/toolkit/qt5/qt5-base/actions.py b/desktop/toolkit/qt5/qt5-base/actions.py index 163972543e..a00e9a5ccc 100644 --- a/desktop/toolkit/qt5/qt5-base/actions.py +++ b/desktop/toolkit/qt5/qt5-base/actions.py @@ -102,7 +102,7 @@ def setup(): def build(): shelltools.export("LD_LIBRARY_PATH", "%s/lib:%s" % (get.curDIR(), get.ENV("LD_LIBRARY_PATH"))) - autotools.make() + qt5.make() def install(): if get.buildTYPE() == "emul32": diff --git a/desktop/toolkit/qt5/qt5-base/files/qt5-alsa1.11.patch b/desktop/toolkit/qt5/qt5-base/files/qt5-alsa1.11.patch new file mode 100644 index 0000000000..d6d983b9a9 --- /dev/null +++ b/desktop/toolkit/qt5/qt5-base/files/qt5-alsa1.11.patch @@ -0,0 +1,11 @@ +--- 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 +-#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 + \ No newline at end of file diff --git a/desktop/toolkit/qt5/qt5-base/files/qtbug-45812.patch b/desktop/toolkit/qt5/qt5-base/files/qtbug-45812.patch new file mode 100644 index 0000000000..43623d9c16 --- /dev/null +++ b/desktop/toolkit/qt5/qt5-base/files/qtbug-45812.patch @@ -0,0 +1,97 @@ +From 269fdbdd2bedda5f5eacb751224d3a3fc3eed5bc Mon Sep 17 00:00:00 2001 +From: Urs Fleisch +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ł +Reviewed-by: Dmitry Shachnev +Reviewed-by: Shawn Rutledge +--- + 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/desktop/toolkit/qt5/qt5-base/files/qtbug-51648.patch b/desktop/toolkit/qt5/qt5-base/files/qtbug-51648.patch new file mode 100644 index 0000000000..79e88f6343 --- /dev/null +++ b/desktop/toolkit/qt5/qt5-base/files/qtbug-51648.patch @@ -0,0 +1,87 @@ +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 \ No newline at end of file diff --git a/desktop/toolkit/qt5/qt5-base/files/qtbug-51649.patch b/desktop/toolkit/qt5/qt5-base/files/qtbug-51649.patch new file mode 100644 index 0000000000..ba6c30268d --- /dev/null +++ b/desktop/toolkit/qt5/qt5-base/files/qtbug-51649.patch @@ -0,0 +1,158 @@ +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/desktop/toolkit/qt5/qt5-base/files/qtbug-51676.patch b/desktop/toolkit/qt5/qt5-base/files/qtbug-51676.patch new file mode 100644 index 0000000000..78efe4f90f --- /dev/null +++ b/desktop/toolkit/qt5/qt5-base/files/qtbug-51676.patch @@ -0,0 +1,125 @@ +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 \ No newline at end of file diff --git a/desktop/toolkit/qt5/qt5-base/pspec.xml b/desktop/toolkit/qt5/qt5-base/pspec.xml index 176d32d2f0..6bebc9dff2 100644 --- a/desktop/toolkit/qt5/qt5-base/pspec.xml +++ b/desktop/toolkit/qt5/qt5-base/pspec.xml @@ -72,14 +72,19 @@ mkspecs.patch + qt5-alsa1.11.patch + qtbug-45812.patch + qtbug-51648.patch + qtbug-51649.patch + qtbug-51676.patch qt5-base - libpcre - libgcc + libpcre + libgcc cups dbus @@ -251,7 +256,7 @@ - 2016-05-02 + 2016-05-04 5.6.0 Release Bump PisiLinux Community diff --git a/hardware/sound/alsa-lib/pspec.xml b/hardware/sound/alsa-lib/pspec.xml index a29cf1cdb0..2b818ae5be 100644 --- a/hardware/sound/alsa-lib/pspec.xml +++ b/hardware/sound/alsa-lib/pspec.xml @@ -14,7 +14,7 @@ app:console The Advanced Linux Sound Architecture (ALSA) library alsa-lib provides ALSA runtime libraries to simplify application programming and provide higher level functionality as well as support for the older OSS API, providing binary compatibility for most OSS programs. - ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.0.29.tar.bz2 + ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.1.1.tar.bz2 python-devel @@ -66,6 +66,13 @@ + + 2016-05-03 + 1.1.1 + Version bump. + Alihan Öztürk + alihan@pisilinux.org + 2015-03-04 1.0.29 diff --git a/hardware/sound/alsa-tools/pspec.xml b/hardware/sound/alsa-tools/pspec.xml index 5a658c78f5..feadb81900 100644 --- a/hardware/sound/alsa-tools/pspec.xml +++ b/hardware/sound/alsa-tools/pspec.xml @@ -14,7 +14,7 @@ app:gui ALSA configuration tools alsa-tools contains ALSA (Advanced Linux Sound Architecture) tools like firmware loaders and sound card control utilities for specific sound cards. - ftp://ftp.alsa-project.org/pub/tools/alsa-tools-1.0.29.tar.bz2 + ftp://ftp.alsa-project.org/pub/tools/alsa-tools-1.1.0.tar.bz2 gtk2-devel fltk-devel @@ -98,6 +98,13 @@ + + 2016-05-03 + 1.1.0 + Version bump. + Alihan Öztürk + alihan@pisilinux.org + 2015-03-04 1.0.29 diff --git a/hardware/sound/alsa-utils/pspec.xml b/hardware/sound/alsa-utils/pspec.xml index 45da0c38bc..1d53b3bf85 100644 --- a/hardware/sound/alsa-utils/pspec.xml +++ b/hardware/sound/alsa-utils/pspec.xml @@ -13,7 +13,7 @@ app:console Advanced Linux Sound Architecture (ALSA) utilities alsa-utils contains command line utilities for the Advanced Linux Sound Architecture (ALSA). - ftp://ftp.alsa-project.org/pub/utils/alsa-utils-1.0.29.tar.bz2 + ftp://ftp.alsa-project.org/pub/utils/alsa-utils-1.1.1.tar.bz2 xmlto util-linux @@ -57,6 +57,13 @@ + + 2016-05-03 + 1.1.1 + Version bump + Alihan Öztürk + alihan@pisilinux.org + 2015-03-04 1.0.29 diff --git a/multimedia/graphics/libmng/actions.py b/multimedia/graphics/libmng/actions.py index dc5e35dfd2..82cb1be3b4 100644 --- a/multimedia/graphics/libmng/actions.py +++ b/multimedia/graphics/libmng/actions.py @@ -15,7 +15,7 @@ def setup(): shelltools.sym("makefiles/Makefile.am", "Makefile.am") shelltools.sym("makefiles/makefile.linux", "Makefile") #shelltools.sym("contrib/gcc/sdl-mngplay/acinclude.m4", "acinclude.m4") - + shelltools.system("sed -i -e 's/unroll-loops/& -fPIC/' Makefile ") autotools.autoreconf("-fiv") diff --git a/multimedia/graphics/libmng/pspec.xml b/multimedia/graphics/libmng/pspec.xml index 6a4f5535e1..a9db7a4ba2 100644 --- a/multimedia/graphics/libmng/pspec.xml +++ b/multimedia/graphics/libmng/pspec.xml @@ -1,4 +1,3 @@ - @@ -54,13 +53,11 @@ zlib-32bit lcms2-32bit libjpeg-turbo-32bit - glibc-32bit zlib-32bit lcms2-32bit libjpeg-turbo-32bit - glibc-32bit libmng @@ -70,11 +67,11 @@ - 2014-05-19 + 2016-05-04 2.0.2 First release Alihan Öztürk alihan@pisilinux.org - + \ No newline at end of file