summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qobject.cpp
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2023-05-22 19:32:20 -0700
committerThiago Macieira <thiago.macieira@intel.com>2025-06-30 07:23:56 -0700
commit6679efd2a4cc23de4ed947ef567a799d474e2079 (patch)
treef873fb493b518f68994705329b73bd4babb7a278 /src/corelib/kernel/qobject.cpp
parent5bd58d67c14ac765a2a0abb7d5dbb499ac60f13b (diff)
Replace one-shot uses of QSemaphore with QLatch
This commit replaces one-shot synchronization of threads that were using QSemaphore with QLatch. QSemaphore is efficient on Linux and Windows, but allocates memory elsewhere. Even on those platforms where we have futex-like OS support, QSemaphore is heavier than what we really need here. All but one uses of QSemaphore in qtbase libraries (I didn't change examples or tests) were replaced. The remaining use of QSemaphore in qnetworkproxy_libproxy.cpp is a proper producer-consumer. Change-Id: Ib5ce7a497e034ebabb2cfffd1761a4fcb2be9a6c Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/corelib/kernel/qobject.cpp')
-rw-r--r--src/corelib/kernel/qobject.cpp26
1 files changed, 13 insertions, 13 deletions
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
}