src/dbus/qdbuspendingcall.cpp
changeset 29 b72c6db6890b
parent 18 2f34d5167611
child 30 5dc02b23752f
--- a/src/dbus/qdbuspendingcall.cpp	Fri Jun 11 14:24:45 2010 +0300
+++ b/src/dbus/qdbuspendingcall.cpp	Wed Jun 23 19:07:03 2010 +0300
@@ -208,6 +208,8 @@
 
 void QDBusPendingCallPrivate::checkReceivedSignature()
 {
+    // MUST BE CALLED WITH A LOCKED MUTEX!
+
     if (replyMessage.type() == QDBusMessage::InvalidMessage)
         return;                 // not yet finished - no message to
                                 // validate against
@@ -230,6 +232,8 @@
 
 void QDBusPendingCallPrivate::waitForFinished()
 {
+    QMutexLocker locker(&mutex);
+
     if (replyMessage.type() != QDBusMessage::InvalidMessage)
         return;                 // already finished
 
@@ -310,7 +314,11 @@
 
 bool QDBusPendingCall::isFinished() const
 {
-    return !d || (d->replyMessage.type() != QDBusMessage::InvalidMessage);
+    if (!d)
+        return true; // considered finished
+
+    QMutexLocker locker(&d->mutex);
+    return d->replyMessage.type() != QDBusMessage::InvalidMessage;
 }
 
 void QDBusPendingCall::waitForFinished()
@@ -329,7 +337,10 @@
 */
 bool QDBusPendingCall::isValid() const
 {
-    return d ? d->replyMessage.type() == QDBusMessage::ReplyMessage : false;
+    if (!d)
+        return false;
+    QMutexLocker locker(&d->mutex);
+    return d->replyMessage.type() == QDBusMessage::ReplyMessage;
 }
 
 /*!
@@ -343,7 +354,10 @@
 */
 bool QDBusPendingCall::isError() const
 {
-    return d ? d->replyMessage.type() == QDBusMessage::ErrorMessage : true;
+    if (!d)
+        return true; // considered finished and an error
+    QMutexLocker locker(&d->mutex);
+    return d->replyMessage.type() == QDBusMessage::ErrorMessage;
 }
 
 /*!
@@ -356,8 +370,10 @@
 */
 QDBusError QDBusPendingCall::error() const
 {
-    if (d)
+    if (d) {
+        QMutexLocker locker(&d->mutex);
         return d->replyMessage;
+    }
 
     // not connected, return an error
     QDBusError err = QDBusError(QDBusError::Disconnected,
@@ -378,7 +394,10 @@
 */
 QDBusMessage QDBusPendingCall::reply() const
 {
-    return d ? d->replyMessage : QDBusMessage::createError(error());
+    if (!d)
+        return QDBusMessage::createError(error());
+    QMutexLocker locker(&d->mutex);
+    return d->replyMessage;
 }
 
 #if 0
@@ -439,9 +458,8 @@
     QDBusPendingCallPrivate *d = 0;
     if (msg.type() == QDBusMessage::ErrorMessage ||
         msg.type() == QDBusMessage::ReplyMessage) {
-        d = new QDBusPendingCallPrivate;
+        d = new QDBusPendingCallPrivate(QDBusMessage(), 0);
         d->replyMessage = msg;
-        d->connection = 0;
     }
 
     return QDBusPendingCall(d);
@@ -471,9 +489,10 @@
     : QObject(*new QDBusPendingCallWatcherPrivate, parent), QDBusPendingCall(call)
 {
     if (d) {                    // QDBusPendingCall::d
+        QMutexLocker locker(&d->mutex);
         if (!d->watcherHelper) {
             d->watcherHelper = new QDBusPendingCallWatcherHelper;
-            if (isFinished()) {
+            if (d->replyMessage.type() != QDBusMessage::InvalidMessage) {
                 // cause a signal emission anyways
                 QMetaObject::invokeMethod(d->watcherHelper, "finished", Qt::QueuedConnection);
             }