diff options
Diffstat (limited to 'dev-qt/qtdbus/files/qtdbus-5.6.0-deadlock.patch')
-rw-r--r-- | dev-qt/qtdbus/files/qtdbus-5.6.0-deadlock.patch | 122 |
1 files changed, 0 insertions, 122 deletions
diff --git a/dev-qt/qtdbus/files/qtdbus-5.6.0-deadlock.patch b/dev-qt/qtdbus/files/qtdbus-5.6.0-deadlock.patch deleted file mode 100644 index 93a5ed7eb4a9..000000000000 --- a/dev-qt/qtdbus/files/qtdbus-5.6.0-deadlock.patch +++ /dev/null @@ -1,122 +0,0 @@ -From: Thiago Macieira <thiago.macieira@intel.com> -Date: Tue, 15 Mar 2016 18:00:20 +0000 (-0700) -Subject: Fix QtDBus deadlock inside kded/kiod -X-Git-Url: https://codereview.qt-project.org/gitweb?p=qt%2Fqtbase.git;a=commitdiff_plain;h=11c5e716b08b6b3c5a7c9fce96b0cde8624ec869;hp=85a57f7a2e85ac61bb65e66b003cb21f58d5a5b7 - -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 ---- - -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; |