RIP QBasicMutexLocker
This was used as a work-around for Q5MutexLocker's UB downcasting QBasicMutex to QMutex, and for some unspecified performance improvements. Now that Q6MutexLocker is a template, the two are almost token-by-token identical, so we can remove this work-around and use QMutexLocker directly. Partially reverts aea500d5d76864bb1a3918e338ca6806e1766e41. Change-Id: I57ef5c53999869aa3454fbbaad884c1d18591b2a Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> (cherry picked from commit 8d39b2165596f0aaae0e5841eb4c849cf4ee1bb0) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
c67f69ce29
commit
40b99f7fc6
@ -233,7 +233,7 @@ bool QObjectPrivate::isSender(const QObject *receiver, const char *signal) const
|
|||||||
ConnectionData *cd = connections.loadRelaxed();
|
ConnectionData *cd = connections.loadRelaxed();
|
||||||
if (signal_index < 0 || !cd)
|
if (signal_index < 0 || !cd)
|
||||||
return false;
|
return false;
|
||||||
QBasicMutexLocker locker(signalSlotLock(q));
|
QMutexLocker locker(signalSlotLock(q));
|
||||||
if (signal_index < cd->signalVectorCount()) {
|
if (signal_index < cd->signalVectorCount()) {
|
||||||
const QObjectPrivate::Connection *c = cd->signalVector.loadRelaxed()->at(signal_index).first.loadRelaxed();
|
const QObjectPrivate::Connection *c = cd->signalVector.loadRelaxed()->at(signal_index).first.loadRelaxed();
|
||||||
|
|
||||||
@ -273,7 +273,7 @@ QObjectList QObjectPrivate::senderList() const
|
|||||||
QObjectList returnValue;
|
QObjectList returnValue;
|
||||||
ConnectionData *cd = connections.loadRelaxed();
|
ConnectionData *cd = connections.loadRelaxed();
|
||||||
if (cd) {
|
if (cd) {
|
||||||
QBasicMutexLocker locker(signalSlotLock(q_func()));
|
QMutexLocker locker(signalSlotLock(q_func()));
|
||||||
for (Connection *c = cd->senders; c; c = c->next)
|
for (Connection *c = cd->senders; c; c = c->next)
|
||||||
returnValue << c->sender;
|
returnValue << c->sender;
|
||||||
}
|
}
|
||||||
@ -1024,7 +1024,7 @@ QObject::~QObject()
|
|||||||
}
|
}
|
||||||
|
|
||||||
QBasicMutex *signalSlotMutex = signalSlotLock(this);
|
QBasicMutex *signalSlotMutex = signalSlotLock(this);
|
||||||
QBasicMutexLocker locker(signalSlotMutex);
|
QMutexLocker locker(signalSlotMutex);
|
||||||
|
|
||||||
// disconnect all receivers
|
// disconnect all receivers
|
||||||
int receiverCount = cd->signalVectorCount();
|
int receiverCount = cd->signalVectorCount();
|
||||||
@ -1382,7 +1382,7 @@ bool QObject::event(QEvent *e)
|
|||||||
QAbstractMetaCallEvent *mce = static_cast<QAbstractMetaCallEvent*>(e);
|
QAbstractMetaCallEvent *mce = static_cast<QAbstractMetaCallEvent*>(e);
|
||||||
|
|
||||||
if (!d_func()->connections.loadRelaxed()) {
|
if (!d_func()->connections.loadRelaxed()) {
|
||||||
QBasicMutexLocker locker(signalSlotLock(this));
|
QMutexLocker locker(signalSlotLock(this));
|
||||||
d_func()->ensureConnectionData();
|
d_func()->ensureConnectionData();
|
||||||
}
|
}
|
||||||
QObjectPrivate::Sender sender(this, const_cast<QObject*>(mce->sender()), mce->signalId());
|
QObjectPrivate::Sender sender(this, const_cast<QObject*>(mce->sender()), mce->signalId());
|
||||||
@ -2522,7 +2522,7 @@ QObject *QObject::sender() const
|
|||||||
{
|
{
|
||||||
Q_D(const QObject);
|
Q_D(const QObject);
|
||||||
|
|
||||||
QBasicMutexLocker locker(signalSlotLock(this));
|
QMutexLocker locker(signalSlotLock(this));
|
||||||
QObjectPrivate::ConnectionData *cd = d->connections.loadRelaxed();
|
QObjectPrivate::ConnectionData *cd = d->connections.loadRelaxed();
|
||||||
if (!cd || !cd->currentSender)
|
if (!cd || !cd->currentSender)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -2564,7 +2564,7 @@ int QObject::senderSignalIndex() const
|
|||||||
{
|
{
|
||||||
Q_D(const QObject);
|
Q_D(const QObject);
|
||||||
|
|
||||||
QBasicMutexLocker locker(signalSlotLock(this));
|
QMutexLocker locker(signalSlotLock(this));
|
||||||
QObjectPrivate::ConnectionData *cd = d->connections.loadRelaxed();
|
QObjectPrivate::ConnectionData *cd = d->connections.loadRelaxed();
|
||||||
if (!cd || !cd->currentSender)
|
if (!cd || !cd->currentSender)
|
||||||
return -1;
|
return -1;
|
||||||
@ -2629,7 +2629,7 @@ int QObject::receivers(const char *signal) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
QObjectPrivate::ConnectionData *cd = d->connections.loadRelaxed();
|
QObjectPrivate::ConnectionData *cd = d->connections.loadRelaxed();
|
||||||
QBasicMutexLocker locker(signalSlotLock(this));
|
QMutexLocker locker(signalSlotLock(this));
|
||||||
if (cd && signal_index < cd->signalVectorCount()) {
|
if (cd && signal_index < cd->signalVectorCount()) {
|
||||||
const QObjectPrivate::Connection *c = cd->signalVector.loadRelaxed()->at(signal_index).first.loadRelaxed();
|
const QObjectPrivate::Connection *c = cd->signalVector.loadRelaxed()->at(signal_index).first.loadRelaxed();
|
||||||
while (c) {
|
while (c) {
|
||||||
@ -2676,7 +2676,7 @@ bool QObject::isSignalConnected(const QMetaMethod &signal) const
|
|||||||
|
|
||||||
signalIndex += QMetaObjectPrivate::signalOffset(signal.mobj);
|
signalIndex += QMetaObjectPrivate::signalOffset(signal.mobj);
|
||||||
|
|
||||||
QBasicMutexLocker locker(signalSlotLock(this));
|
QMutexLocker locker(signalSlotLock(this));
|
||||||
return d->isSignalConnected(signalIndex, true);
|
return d->isSignalConnected(signalIndex, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3582,7 +3582,7 @@ bool QMetaObjectPrivate::disconnect(const QObject *sender,
|
|||||||
QObject *s = const_cast<QObject *>(sender);
|
QObject *s = const_cast<QObject *>(sender);
|
||||||
|
|
||||||
QBasicMutex *senderMutex = signalSlotLock(sender);
|
QBasicMutex *senderMutex = signalSlotLock(sender);
|
||||||
QBasicMutexLocker locker(senderMutex);
|
QMutexLocker locker(senderMutex);
|
||||||
|
|
||||||
QObjectPrivate::ConnectionData *scd = QObjectPrivate::get(s)->connections.loadRelaxed();
|
QObjectPrivate::ConnectionData *scd = QObjectPrivate::get(s)->connections.loadRelaxed();
|
||||||
if (!scd)
|
if (!scd)
|
||||||
@ -3809,7 +3809,7 @@ static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connect
|
|||||||
while (argumentTypes[nargs - 1])
|
while (argumentTypes[nargs - 1])
|
||||||
++nargs;
|
++nargs;
|
||||||
|
|
||||||
QBasicMutexLocker locker(signalSlotLock(c->receiver.loadRelaxed()));
|
QMutexLocker locker(signalSlotLock(c->receiver.loadRelaxed()));
|
||||||
QObject *receiver = c->receiver.loadRelaxed();
|
QObject *receiver = c->receiver.loadRelaxed();
|
||||||
if (!receiver) {
|
if (!receiver) {
|
||||||
// the connection has been disconnected before we got the lock
|
// the connection has been disconnected before we got the lock
|
||||||
@ -3950,7 +3950,7 @@ void doActivate(QObject *sender, int signal_index, void **argv)
|
|||||||
|
|
||||||
QSemaphore semaphore;
|
QSemaphore semaphore;
|
||||||
{
|
{
|
||||||
QBasicMutexLocker locker(signalSlotLock(receiver));
|
QMutexLocker locker(signalSlotLock(receiver));
|
||||||
if (!c->isSingleShot && !c->receiver.loadAcquire())
|
if (!c->isSingleShot && !c->receiver.loadAcquire())
|
||||||
continue;
|
continue;
|
||||||
QMetaCallEvent *ev = c->isSlotObject ?
|
QMetaCallEvent *ev = c->isSlotObject ?
|
||||||
@ -4271,7 +4271,7 @@ void QObject::dumpObjectInfo() const
|
|||||||
objectName().isEmpty() ? "unnamed" : objectName().toLocal8Bit().data());
|
objectName().isEmpty() ? "unnamed" : objectName().toLocal8Bit().data());
|
||||||
|
|
||||||
Q_D(const QObject);
|
Q_D(const QObject);
|
||||||
QBasicMutexLocker locker(signalSlotLock(this));
|
QMutexLocker locker(signalSlotLock(this));
|
||||||
|
|
||||||
// first, look for connections where this object is the sender
|
// first, look for connections where this object is the sender
|
||||||
qDebug(" SIGNALS OUT");
|
qDebug(" SIGNALS OUT");
|
||||||
|
@ -118,35 +118,6 @@ private:
|
|||||||
bool locked;
|
bool locked;
|
||||||
};
|
};
|
||||||
|
|
||||||
class QBasicMutexLocker
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
inline explicit QBasicMutexLocker(QBasicMutex *m) QT_MUTEX_LOCK_NOEXCEPT
|
|
||||||
: m(m), isLocked(true)
|
|
||||||
{
|
|
||||||
m->lock();
|
|
||||||
}
|
|
||||||
inline ~QBasicMutexLocker() { if (isLocked) unlock(); }
|
|
||||||
|
|
||||||
inline void unlock() noexcept
|
|
||||||
{
|
|
||||||
isLocked = false;
|
|
||||||
m->unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void relock() QT_MUTEX_LOCK_NOEXCEPT
|
|
||||||
{
|
|
||||||
isLocked = true;
|
|
||||||
m->lock();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DISABLE_COPY(QBasicMutexLocker)
|
|
||||||
|
|
||||||
QBasicMutex *m;
|
|
||||||
bool isLocked;
|
|
||||||
};
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
class [[nodiscard]] QOrderedMutexLocker
|
class [[nodiscard]] QOrderedMutexLocker
|
||||||
@ -167,8 +138,6 @@ public:
|
|||||||
static bool relock(QBasicMutex *, QBasicMutex *) { return false; }
|
static bool relock(QBasicMutex *, QBasicMutex *) { return false; }
|
||||||
};
|
};
|
||||||
|
|
||||||
using QBasicMutexLocker = QMutexLocker<QBasicMutex>;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user