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:
Marc Mutz 2023-06-13 11:37:13 +02:00 committed by Qt Cherry-pick Bot
parent c67f69ce29
commit 40b99f7fc6
2 changed files with 12 additions and 43 deletions

View File

@ -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");

View File

@ -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