From 6679efd2a4cc23de4ed947ef567a799d474e2079 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 22 May 2023 19:32:20 -0700 Subject: 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 --- src/corelib/kernel/qobject.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'src/corelib/kernel/qobject.cpp') 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 #include #if QT_CONFIG(thread) -#include +#include #endif #include @@ -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 } -- cgit v1.2.3