diff options
Diffstat (limited to 'src/corelib/kernel')
| -rw-r--r-- | src/corelib/kernel/qmetaobject.cpp | 14 | ||||
| -rw-r--r-- | src/corelib/kernel/qobject.cpp | 26 | ||||
| -rw-r--r-- | src/corelib/kernel/qobject_p.h | 23 |
3 files changed, 29 insertions, 34 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index 795cc531114..b48922daeab 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -17,7 +17,7 @@ #include <qthread.h> #include "private/qthread_p.h" #if QT_CONFIG(thread) -#include <qsemaphore.h> +#include "private/qlatch_p.h" #endif // for normalizeTypeInternal @@ -1748,9 +1748,9 @@ bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase * if (receiverInSameThread) qWarning("QMetaObject::invokeMethod: Dead lock detected"); - QSemaphore semaphore; - QCoreApplication::postEvent(object, new QMetaCallEvent(std::move(slot), nullptr, -1, argv, &semaphore)); - semaphore.acquire(); + QLatch latch(1); + QCoreApplication::postEvent(object, new QMetaCallEvent(std::move(slot), nullptr, -1, argv, &latch)); + latch.wait(); #endif // QT_CONFIG(thread) } else { qWarning("QMetaObject::invokeMethod: Unknown connection type"); @@ -2922,10 +2922,10 @@ auto QMetaMethodInvoker::invokeImpl(QMetaMethod self, void *target, return InvokeFailReason::DeadLockDetected; } - QSemaphore semaphore; + QLatch latch(1); QCoreApplication::postEvent(object, new QMetaCallEvent(idx_offset, idx_relative, callFunction, - nullptr, -1, param, &semaphore)); - semaphore.acquire(); + nullptr, -1, param, &latch)); + latch.wait(); #endif // QT_CONFIG(thread) } return {}; diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 38ded8117c0..888c71f5a49 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -27,7 +27,7 @@ #include <qscopeguard.h> #include <qset.h> #if QT_CONFIG(thread) -#include <qsemaphore.h> +#include <private/qlatch_p.h> #endif #include <private/qorderedmutexlocker_p.h> @@ -476,8 +476,8 @@ void QObjectPrivate::reinitBindingStorageAfterThreadMove() QAbstractMetaCallEvent::~QAbstractMetaCallEvent() { #if QT_CONFIG(thread) - if (semaphore_) - semaphore_->release(); + if (latch) + latch->countDown(); #endif } @@ -506,8 +506,8 @@ inline void QMetaCallEvent::allocArgs() QMetaCallEvent::QMetaCallEvent(ushort method_offset, ushort method_relative, QObjectPrivate::StaticMetaCallFunction callFunction, const QObject *sender, int signalId, - void **args, QSemaphore *semaphore) - : QAbstractMetaCallEvent(sender, signalId, semaphore), + void **args, QLatch *latch) + : QAbstractMetaCallEvent(sender, signalId, latch), d({nullptr, args, callFunction, 0, method_offset, method_relative}), prealloc_() { @@ -521,8 +521,8 @@ QMetaCallEvent::QMetaCallEvent(ushort method_offset, ushort method_relative, */ QMetaCallEvent::QMetaCallEvent(QtPrivate::QSlotObjectBase *slotO, const QObject *sender, int signalId, - void **args, QSemaphore *semaphore) - : QAbstractMetaCallEvent(sender, signalId, semaphore), + void **args, QLatch *latch) + : QAbstractMetaCallEvent(sender, signalId, latch), d({QtPrivate::SlotObjUniquePtr{slotO}, args, nullptr, 0, 0, ushort(-1)}), prealloc_() { @@ -538,8 +538,8 @@ QMetaCallEvent::QMetaCallEvent(QtPrivate::QSlotObjectBase *slotO, */ QMetaCallEvent::QMetaCallEvent(QtPrivate::SlotObjUniquePtr slotO, const QObject *sender, int signalId, - void **args, QSemaphore *semaphore) - : QAbstractMetaCallEvent(sender, signalId, semaphore), + void **args, QLatch *latch) + : QAbstractMetaCallEvent(sender, signalId, latch), d{std::move(slotO), args, nullptr, 0, 0, ushort(-1)}, prealloc_() { @@ -4198,18 +4198,18 @@ void doActivate(QObject *sender, int signal_index, void **argv) if (c->isSingleShot && !QObjectPrivate::removeConnection(c)) continue; - QSemaphore semaphore; + QLatch latch(1); { QMutexLocker locker(signalSlotLock(receiver)); if (!c->isSingleShot && !c->receiver.loadAcquire()) continue; QMetaCallEvent *ev = c->isSlotObject ? - new QMetaCallEvent(c->slotObj, sender, signal_index, argv, &semaphore) : + new QMetaCallEvent(c->slotObj, sender, signal_index, argv, &latch) : new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, - sender, signal_index, argv, &semaphore); + sender, signal_index, argv, &latch); QCoreApplication::postEvent(receiver, ev); } - semaphore.acquire(); + latch.wait(); continue; #endif } diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h index 20c454506ab..dca9c1af932 100644 --- a/src/corelib/kernel/qobject_p.h +++ b/src/corelib/kernel/qobject_p.h @@ -328,16 +328,13 @@ bool QObjectPrivate::disconnect(const typename QtPrivate::FunctionPointer< Func1 &SignalType::Object::staticMetaObject); } -class QSemaphore; +class QLatch; class Q_CORE_EXPORT QAbstractMetaCallEvent : public QEvent { public: - QAbstractMetaCallEvent(const QObject *sender, int signalId, QSemaphore *semaphore = nullptr) - : QEvent(MetaCall), signalId_(signalId), sender_(sender) -#if QT_CONFIG(thread) - , semaphore_(semaphore) -#endif - { Q_UNUSED(semaphore); } + QAbstractMetaCallEvent(const QObject *sender, int signalId, QLatch *latch = nullptr) + : QEvent(MetaCall), signalId_(signalId), sender_(sender), latch(latch) + {} ~QAbstractMetaCallEvent(); virtual void placeMetaCall(QObject *object) = 0; @@ -348,25 +345,23 @@ public: private: int signalId_; const QObject *sender_; -#if QT_CONFIG(thread) - QSemaphore *semaphore_; -#endif + QLatch *latch; }; class Q_CORE_EXPORT QMetaCallEvent : public QAbstractMetaCallEvent { public: - // blocking queued with semaphore - args always owned by caller + // blocking queued with latch - args always owned by caller QMetaCallEvent(ushort method_offset, ushort method_relative, QObjectPrivate::StaticMetaCallFunction callFunction, const QObject *sender, int signalId, - void **args, QSemaphore *semaphore); + void **args, QLatch *latch); QMetaCallEvent(QtPrivate::QSlotObjectBase *slotObj, const QObject *sender, int signalId, - void **args, QSemaphore *semaphore); + void **args, QLatch *latch); QMetaCallEvent(QtPrivate::SlotObjUniquePtr slotObj, const QObject *sender, int signalId, - void **args, QSemaphore *semaphore); + void **args, QLatch *latch); // queued - args allocated by event, copied by caller QMetaCallEvent(ushort method_offset, ushort method_relative, |
