summaryrefslogtreecommitdiffstats
path: root/src/dbus
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-01-03 14:29:41 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2014-01-03 14:30:21 +0100
commitb5ab7ee0d78a30863e3d11bd2ba10ba5f4854bf5 (patch)
treed4ab3471f9f92e153fe320e0435a5740c794746b /src/dbus
parentad9554a7f2d4b8a2af3efabc7bc69b9a0ae3751d (diff)
parentaff3e3c4a20aae52fdafaede8dfcbde2bc990104 (diff)
Merge remote-tracking branch 'origin/stable' into dev
Diffstat (limited to 'src/dbus')
-rw-r--r--src/dbus/qdbusconnection_p.h2
-rw-r--r--src/dbus/qdbusintegrator.cpp9
2 files changed, 11 insertions, 0 deletions
diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h
index 515eab6dfe..350e49a50d 100644
--- a/src/dbus/qdbusconnection_p.h
+++ b/src/dbus/qdbusconnection_p.h
@@ -178,6 +178,7 @@ public:
typedef QMultiHash<QString, SignalHook> SignalHookHash;
typedef QHash<QString, QDBusMetaObject* > MetaObjectHash;
typedef QHash<QByteArray, int> MatchRefCountHash;
+ typedef QList<QDBusPendingCallPrivate*> PendingCallList;
struct WatchedServiceData {
WatchedServiceData() : refcount(0) {}
@@ -316,6 +317,7 @@ public:
MatchRefCountHash matchRefCounts;
ObjectTreeNode rootNode;
MetaObjectHash cachedMetaObjects;
+ PendingCallList pendingCalls;
QMutex callDeliveryMutex;
QDBusCallDeliveryEvent *callDeliveryState; // protected by the callDeliveryMutex mutex
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
index d797fbfb99..77de09d197 100644
--- a/src/dbus/qdbusintegrator.cpp
+++ b/src/dbus/qdbusintegrator.cpp
@@ -1092,6 +1092,9 @@ void QDBusConnectionPrivate::closeConnection()
;
}
}
+
+ qDeleteAll(pendingCalls);
+
qDBusDebug() << this << "Disconnected";
}
@@ -1834,6 +1837,8 @@ void QDBusConnectionPrivate::processFinishedCall(QDBusPendingCallPrivate *call)
QMutexLocker locker(&call->mutex);
+ connection->pendingCalls.removeOne(call);
+
QDBusMessage &msg = call->replyMessage;
if (call->pending) {
// decode the message
@@ -2094,6 +2099,10 @@ QDBusPendingCallPrivate *QDBusConnectionPrivate::sendWithReplyAsync(const QDBusM
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)
+ pendingCalls.append(pcall);
+
return pcall;
} else {
// we're probably disconnected at this point