Fix deadlock when disconnecting connections made with function pointers
The regression was introduced in 5885b8f775
QMetaObjectPrivate::disconnectHelper may unlock the sender mutex. And
while relocking it, we need to make sure to lock the sender and receiver
mutex in the right order. So don't lock the receiver mutex in advance, but
re-lock it for each connection.
Change-Id: I4f6d19791cdcce3693d7f45e7beb6b564fd69277
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
bb10
parent
df449d4f86
commit
9b8570c4e9
|
|
@ -3181,7 +3181,7 @@ bool QMetaObjectPrivate::disconnectHelper(QObjectPrivate::Connection *c,
|
|||
&& (slot == 0 || (c->isSlotObject && c->slotObj->compare(slot)))))) {
|
||||
bool needToUnlock = false;
|
||||
QMutex *receiverMutex = 0;
|
||||
if (!receiver) {
|
||||
if (c->receiver) {
|
||||
receiverMutex = signalSlotLock(c->receiver);
|
||||
// need to relock this receiver and sender in the correct order
|
||||
needToUnlock = QOrderedMutexLocker::relock(senderMutex, receiverMutex);
|
||||
|
|
@ -3229,8 +3229,7 @@ bool QMetaObjectPrivate::disconnect(const QObject *sender,
|
|||
QObject *s = const_cast<QObject *>(sender);
|
||||
|
||||
QMutex *senderMutex = signalSlotLock(sender);
|
||||
QMutex *receiverMutex = receiver ? signalSlotLock(receiver) : 0;
|
||||
QOrderedMutexLocker locker(senderMutex, receiverMutex);
|
||||
QMutexLocker locker(senderMutex);
|
||||
|
||||
QObjectConnectionListVector *connectionLists = QObjectPrivate::get(s)->connectionLists;
|
||||
if (!connectionLists)
|
||||
|
|
|
|||
Loading…
Reference in New Issue