3e52db6
commit 22b493d3523140e14df433cd8a49292b7f73f21c
3e52db6
Author: Peter Seiderer <Peter.Seiderer@gmx.de>
3e52db6
Date:   Sat May 11 07:49:47 2013 +0200
3e52db6
3e52db6
    Fix multiple calls to QDBusPendingReply::waitForFinished on separate objects
3e52db6
    
3e52db6
    QTBUG-27809
3e52db6
    
3e52db6
    Change-Id: If1691052ed1542e0e865c83df7b5737761a2bc86
3e52db6
3e52db6
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
3e52db6
index 96e4a12..1007f1a 100644
3e52db6
--- a/src/dbus/qdbusintegrator.cpp
3e52db6
+++ b/src/dbus/qdbusintegrator.cpp
3e52db6
@@ -1774,14 +1774,11 @@ void QDBusConnectionPrivate::waitForFinished(QDBusPendingCallPrivate *pcall)
3e52db6
         pcall->waitForFinishedCondition.wait(&pcall->mutex);
3e52db6
     } else {
3e52db6
         pcall->waitingForFinished = true;
3e52db6
-        pcall->mutex.unlock();
3e52db6
-
3e52db6
         {
3e52db6
             QDBusDispatchLocker locker(PendingCallBlockAction, this);
3e52db6
             q_dbus_pending_call_block(pcall->pending);
3e52db6
-            // QDBusConnectionPrivate::processFinishedCall() is called automatically
3e52db6
+            processFinishedCall(pcall);
3e52db6
         }
3e52db6
-        pcall->mutex.lock();
3e52db6
     }
3e52db6
 }
3e52db6
 
3e52db6
@@ -1789,8 +1786,6 @@ void QDBusConnectionPrivate::processFinishedCall(QDBusPendingCallPrivate *call)
3e52db6
 {
3e52db6
     QDBusConnectionPrivate *connection = const_cast<QDBusConnectionPrivate *>(call->connection);
3e52db6
 
3e52db6
-    QMutexLocker locker(&call->mutex);
3e52db6
-
3e52db6
     QDBusMessage &msg = call->replyMessage;
3e52db6
     if (call->pending) {
3e52db6
         // decode the message
3e52db6
@@ -1824,7 +1819,8 @@ void QDBusConnectionPrivate::processFinishedCall(QDBusPendingCallPrivate *call)
3e52db6
         q_dbus_pending_call_unref(call->pending);
3e52db6
     call->pending = 0;
3e52db6
 
3e52db6
-    locker.unlock();
3e52db6
+    if (call->waitingForFinished)
3e52db6
+        call->waitForFinishedCondition.wakeAll();
3e52db6
 
3e52db6
     // Are there any watchers?
3e52db6
     if (call->watcherHelper)
3e52db6
@@ -2009,7 +2005,6 @@ QDBusPendingCallPrivate *QDBusConnectionPrivate::sendWithReplyAsync(const QDBusM
3e52db6
             q_dbus_message_unref(msg);
3e52db6
 
3e52db6
             pcall->pending = pending;
3e52db6
-            q_dbus_pending_call_set_notify(pending, qDBusResultReceived, pcall, 0);
3e52db6
 
3e52db6
             return pcall;
3e52db6
         } else {