summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r--src/corelib/kernel/qmetaobject.cpp14
-rw-r--r--src/corelib/kernel/qobject.cpp26
-rw-r--r--src/corelib/kernel/qobject_p.h23
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,