From 34fe9232dbf6a9fe58ebc4c7680bb67d2f642c40 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Mon, 10 Jun 2019 11:08:29 +0200 Subject: Port from QAtomic::load() to loadRelaxed() Semi-automated, just needed ~20 manual fixes: $ find \( -iname \*.cpp -or -iname \*.h \) -exec perl -pe 's/(\.|->)load\(\)/$1loadRelaxed\(\)/g' -i \{\} + $ find \( -iname \*.cpp -or -iname \*.h \) -exec perl -pe 's/(\.|->)store\(/$1storeRelaxed\(/g' -i \{\} + It can be easily improved (e.g. for store check that there are no commas after the opening parens). The most common offender is QLibrary::load, and some code using std::atomic directly. Change-Id: I07c38a3c8ed32c924ef4999e85c7e45cf48f0f6c Reviewed-by: Marc Mutz --- src/corelib/kernel/qabstracteventdispatcher.cpp | 2 +- src/corelib/kernel/qcore_unix_p.h | 4 +- src/corelib/kernel/qcoreapplication.cpp | 16 +- src/corelib/kernel/qcoreevent.cpp | 6 +- src/corelib/kernel/qeventdispatcher_glib.cpp | 6 +- src/corelib/kernel/qeventdispatcher_unix.cpp | 8 +- src/corelib/kernel/qeventdispatcher_win.cpp | 14 +- src/corelib/kernel/qeventloop.cpp | 10 +- src/corelib/kernel/qeventloop_p.h | 4 +- src/corelib/kernel/qmetatype.h | 2 +- src/corelib/kernel/qobject.cpp | 256 ++++++++++++------------ src/corelib/kernel/qobject_p.h | 28 +-- src/corelib/kernel/qsocketnotifier.cpp | 6 +- src/corelib/kernel/qvariant.cpp | 2 +- src/corelib/kernel/qvariant.h | 2 +- src/corelib/kernel/qwineventnotifier.cpp | 6 +- 16 files changed, 186 insertions(+), 186 deletions(-) (limited to 'src/corelib/kernel') diff --git a/src/corelib/kernel/qabstracteventdispatcher.cpp b/src/corelib/kernel/qabstracteventdispatcher.cpp index 186c2e743b..7215b3f2bd 100644 --- a/src/corelib/kernel/qabstracteventdispatcher.cpp +++ b/src/corelib/kernel/qabstracteventdispatcher.cpp @@ -170,7 +170,7 @@ QAbstractEventDispatcher::~QAbstractEventDispatcher() QAbstractEventDispatcher *QAbstractEventDispatcher::instance(QThread *thread) { QThreadData *data = thread ? QThreadData::get2(thread) : QThreadData::current(); - return data->eventDispatcher.load(); + return data->eventDispatcher.loadRelaxed(); } /*! diff --git a/src/corelib/kernel/qcore_unix_p.h b/src/corelib/kernel/qcore_unix_p.h index 7f58813535..b56c2b9732 100644 --- a/src/corelib/kernel/qcore_unix_p.h +++ b/src/corelib/kernel/qcore_unix_p.h @@ -164,7 +164,7 @@ inline void qt_ignore_sigpipe() { // Set to ignore SIGPIPE once only. static QBasicAtomicInt atom = Q_BASIC_ATOMIC_INITIALIZER(0); - if (!atom.load()) { + if (!atom.loadRelaxed()) { // More than one thread could turn off SIGPIPE at the same time // But that's acceptable because they all would be doing the same // action @@ -172,7 +172,7 @@ inline void qt_ignore_sigpipe() memset(&noaction, 0, sizeof(noaction)); noaction.sa_handler = SIG_IGN; ::sigaction(SIGPIPE, &noaction, nullptr); - atom.store(1); + atom.storeRelaxed(1); } } diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index d62188a49c..2a17642ba7 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -552,8 +552,8 @@ void QCoreApplicationPrivate::eventDispatcherReady() QBasicAtomicPointer QCoreApplicationPrivate::theMainThread = Q_BASIC_ATOMIC_INITIALIZER(0); QThread *QCoreApplicationPrivate::mainThread() { - Q_ASSERT(theMainThread.load() != 0); - return theMainThread.load(); + Q_ASSERT(theMainThread.loadRelaxed() != 0); + return theMainThread.loadRelaxed(); } bool QCoreApplicationPrivate::threadRequiresCoreApplication() @@ -854,7 +854,7 @@ void QCoreApplicationPrivate::init() #ifndef QT_NO_QOBJECT // use the event dispatcher created by the app programmer (if any) Q_ASSERT(!eventDispatcher); - eventDispatcher = threadData->eventDispatcher.load(); + eventDispatcher = threadData->eventDispatcher.loadRelaxed(); // otherwise we create one if (!eventDispatcher) @@ -1302,7 +1302,7 @@ void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags) QThreadData *data = QThreadData::current(); if (!data->hasEventDispatcher()) return; - data->eventDispatcher.load()->processEvents(flags); + data->eventDispatcher.loadRelaxed()->processEvents(flags); } /*! @@ -1334,7 +1334,7 @@ void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags, int m return; QElapsedTimer start; start.start(); - while (data->eventDispatcher.load()->processEvents(flags & ~QEventLoop::WaitForMoreEvents)) { + while (data->eventDispatcher.loadRelaxed()->processEvents(flags & ~QEventLoop::WaitForMoreEvents)) { if (start.elapsed() > ms) break; } @@ -1738,7 +1738,7 @@ void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type --data->postEventList.recursion; if (!data->postEventList.recursion && !data->canWait && data->hasEventDispatcher()) - data->eventDispatcher.load()->wakeUp(); + data->eventDispatcher.loadRelaxed()->wakeUp(); // clear the global list, i.e. remove everything that was // delivered. @@ -1989,7 +1989,7 @@ void QCoreApplicationPrivate::deref() void QCoreApplicationPrivate::maybeQuit() { - if (quitLockRef.load() == 0 && in_exec && quitLockRefEnabled && shouldQuit()) + if (quitLockRef.loadRelaxed() == 0 && in_exec && quitLockRefEnabled && shouldQuit()) QCoreApplication::postEvent(QCoreApplication::instance(), new QEvent(QEvent::Quit)); } @@ -2958,7 +2958,7 @@ bool QCoreApplication::hasPendingEvents() QAbstractEventDispatcher *QCoreApplication::eventDispatcher() { if (QCoreApplicationPrivate::theMainThread) - return QCoreApplicationPrivate::theMainThread.load()->eventDispatcher(); + return QCoreApplicationPrivate::theMainThread.loadRelaxed()->eventDispatcher(); return 0; } diff --git a/src/corelib/kernel/qcoreevent.cpp b/src/corelib/kernel/qcoreevent.cpp index aabd32b4a8..4cfc749386 100644 --- a/src/corelib/kernel/qcoreevent.cpp +++ b/src/corelib/kernel/qcoreevent.cpp @@ -424,7 +424,7 @@ struct QBasicAtomicBitField { bool allocateSpecific(int which) noexcept { QBasicAtomicInteger &entry = data[which / BitsPerInt]; - const uint old = entry.load(); + const uint old = entry.loadRelaxed(); const uint bit = 1U << (which % BitsPerInt); return !(old & bit) // wasn't taken && entry.testAndSetRelaxed(old, old | bit); // still wasn't taken @@ -445,10 +445,10 @@ struct QBasicAtomicBitField { // Then again, this should never execute many iterations, so // leave like this for now: - for (uint i = next.load(); i < NumBits; ++i) { + for (uint i = next.loadRelaxed(); i < NumBits; ++i) { if (allocateSpecific(i)) { // remember next (possibly) free id: - const uint oldNext = next.load(); + const uint oldNext = next.loadRelaxed(); next.testAndSetRelaxed(oldNext, qMax(i + 1, oldNext)); return i; } diff --git a/src/corelib/kernel/qeventdispatcher_glib.cpp b/src/corelib/kernel/qeventdispatcher_glib.cpp index 34c2dde6a8..d9746ef6e2 100644 --- a/src/corelib/kernel/qeventdispatcher_glib.cpp +++ b/src/corelib/kernel/qeventdispatcher_glib.cpp @@ -261,7 +261,7 @@ static gboolean postEventSourcePrepare(GSource *s, gint *timeout) *timeout = canWait ? -1 : 0; GPostEventSource *source = reinterpret_cast(s); - source->d->wakeUpCalled = source->serialNumber.load() != source->lastSerialNumber; + source->d->wakeUpCalled = source->serialNumber.loadRelaxed() != source->lastSerialNumber; return !canWait || source->d->wakeUpCalled; } @@ -273,7 +273,7 @@ static gboolean postEventSourceCheck(GSource *source) static gboolean postEventSourceDispatch(GSource *s, GSourceFunc, gpointer) { GPostEventSource *source = reinterpret_cast(s); - source->lastSerialNumber = source->serialNumber.load(); + source->lastSerialNumber = source->serialNumber.loadRelaxed(); QCoreApplication::sendPostedEvents(); source->d->runTimersOnceWithNormalPriority(); return true; // i dunno, george... @@ -320,7 +320,7 @@ QEventDispatcherGlibPrivate::QEventDispatcherGlibPrivate(GMainContext *context) // setup post event source postEventSource = reinterpret_cast(g_source_new(&postEventSourceFuncs, sizeof(GPostEventSource))); - postEventSource->serialNumber.store(1); + postEventSource->serialNumber.storeRelaxed(1); postEventSource->d = this; g_source_set_can_recurse(&postEventSource->source, true); g_source_attach(&postEventSource->source, mainContext); diff --git a/src/corelib/kernel/qeventdispatcher_unix.cpp b/src/corelib/kernel/qeventdispatcher_unix.cpp index df0cac0239..5bc65b7110 100644 --- a/src/corelib/kernel/qeventdispatcher_unix.cpp +++ b/src/corelib/kernel/qeventdispatcher_unix.cpp @@ -459,7 +459,7 @@ void QEventDispatcherUNIX::unregisterSocketNotifier(QSocketNotifier *notifier) bool QEventDispatcherUNIX::processEvents(QEventLoop::ProcessEventsFlags flags) { Q_D(QEventDispatcherUNIX); - d->interrupt.store(0); + d->interrupt.storeRelaxed(0); // we are awake, broadcast it emit awake(); @@ -470,13 +470,13 @@ bool QEventDispatcherUNIX::processEvents(QEventLoop::ProcessEventsFlags flags) const bool wait_for_events = flags & QEventLoop::WaitForMoreEvents; const bool canWait = (d->threadData->canWaitLocked() - && !d->interrupt.load() + && !d->interrupt.loadRelaxed() && wait_for_events); if (canWait) emit aboutToBlock(); - if (d->interrupt.load()) + if (d->interrupt.loadRelaxed()) return false; timespec *tm = nullptr; @@ -545,7 +545,7 @@ void QEventDispatcherUNIX::wakeUp() void QEventDispatcherUNIX::interrupt() { Q_D(QEventDispatcherUNIX); - d->interrupt.store(1); + d->interrupt.storeRelaxed(1); wakeUp(); } diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp index e0641a0282..c2e57a7924 100644 --- a/src/corelib/kernel/qeventdispatcher_win.cpp +++ b/src/corelib/kernel/qeventdispatcher_win.cpp @@ -247,7 +247,7 @@ LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPA Q_ASSERT(d != 0); // Allow posting WM_QT_SENDPOSTEDEVENTS message. - d->wakeUps.store(0); + d->wakeUps.storeRelaxed(0); // We send posted events manually, if the window procedure was invoked // by the foreign event loop (e.g. from the native modal dialog). @@ -526,7 +526,7 @@ bool QEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags) wakeUp(); // trigger a call to sendPostedEvents() } - d->interrupt.store(false); + d->interrupt.storeRelaxed(false); emit awake(); // To prevent livelocks, send posted events once per iteration. @@ -545,7 +545,7 @@ bool QEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags) pHandles = &d->winEventNotifierActivatedEvent; } QVarLengthArray processedTimers; - while (!d->interrupt.load()) { + while (!d->interrupt.loadRelaxed()) { MSG msg; bool haveMessage; @@ -590,7 +590,7 @@ bool QEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags) if (d->internalHwnd == msg.hwnd && msg.message == WM_QT_SENDPOSTEDEVENTS) { // Set result to 'true', if the message was sent by wakeUp(). if (msg.wParam == WMWP_QT_FROMWAKEUP) { - d->wakeUps.store(0); + d->wakeUps.storeRelaxed(0); retVal = true; } needWM_QT_SENDPOSTEDEVENTS = true; @@ -639,7 +639,7 @@ bool QEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags) // still nothing - wait for message or signalled objects canWait = (!retVal - && !d->interrupt.load() + && !d->interrupt.loadRelaxed() && (flags & QEventLoop::WaitForMoreEvents)); if (canWait) { emit aboutToBlock(); @@ -949,7 +949,7 @@ void QEventDispatcherWin32::activateEventNotifiers() for (int i = 0; i < d->winEventNotifierList.count(); ++i) { QWinEventNotifier *notifier = d->winEventNotifierList.at(i); QWinEventNotifierPrivate *nd = QWinEventNotifierPrivate::get(notifier); - if (nd->signaledCount.load() != 0) { + if (nd->signaledCount.loadRelaxed() != 0) { --nd->signaledCount; nd->unregisterWaitObject(); d->activateEventNotifier(notifier); @@ -1014,7 +1014,7 @@ void QEventDispatcherWin32::wakeUp() void QEventDispatcherWin32::interrupt() { Q_D(QEventDispatcherWin32); - d->interrupt.store(true); + d->interrupt.storeRelaxed(true); wakeUp(); } diff --git a/src/corelib/kernel/qeventloop.cpp b/src/corelib/kernel/qeventloop.cpp index a6cc51621a..2104b22095 100644 --- a/src/corelib/kernel/qeventloop.cpp +++ b/src/corelib/kernel/qeventloop.cpp @@ -135,7 +135,7 @@ bool QEventLoop::processEvents(ProcessEventsFlags flags) Q_D(QEventLoop); if (!d->threadData->hasEventDispatcher()) return false; - return d->threadData->eventDispatcher.load()->processEvents(flags); + return d->threadData->eventDispatcher.loadRelaxed()->processEvents(flags); } /*! @@ -225,7 +225,7 @@ int QEventLoop::exec(ProcessEventsFlags flags) processEvents(flags | WaitForMoreEvents | EventLoopExec); ref.exceptionCaught = false; - return d->returnCode.load(); + return d->returnCode.loadRelaxed(); } /*! @@ -279,9 +279,9 @@ void QEventLoop::exit(int returnCode) if (!d->threadData->hasEventDispatcher()) return; - d->returnCode.store(returnCode); + d->returnCode.storeRelaxed(returnCode); d->exit.storeRelease(true); - d->threadData->eventDispatcher.load()->interrupt(); + d->threadData->eventDispatcher.loadRelaxed()->interrupt(); #ifdef Q_OS_WASM // QEventLoop::exec() never returns in emscripten. We implement approximate behavior here. @@ -318,7 +318,7 @@ void QEventLoop::wakeUp() Q_D(QEventLoop); if (!d->threadData->hasEventDispatcher()) return; - d->threadData->eventDispatcher.load()->wakeUp(); + d->threadData->eventDispatcher.loadRelaxed()->wakeUp(); } diff --git a/src/corelib/kernel/qeventloop_p.h b/src/corelib/kernel/qeventloop_p.h index dcbb5c63c6..4ad6d92007 100644 --- a/src/corelib/kernel/qeventloop_p.h +++ b/src/corelib/kernel/qeventloop_p.h @@ -63,8 +63,8 @@ public: inline QEventLoopPrivate() : inExec(false) { - returnCode.store(-1); - exit.store(true); + returnCode.storeRelaxed(-1); + exit.storeRelaxed(true); } QAtomicInt quitLockRef; diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index fef25a32c4..9fe2b9733b 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -1999,7 +1999,7 @@ struct QMetaTypeId< SINGLE_ARG_TEMPLATE > \ static int qt_metatype_id() \ { \ static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \ - if (const int id = metatype_id.load()) \ + if (const int id = metatype_id.loadRelaxed()) \ return id; \ const char *tName = QMetaType::typeName(qMetaTypeId()); \ Q_ASSERT(tName); \ diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index b4e7568a23..7eba9b05ff 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -222,7 +222,7 @@ QObjectPrivate::~QObjectPrivate() if (Q_LIKELY(threadData->thread == QThread::currentThread())) { // unregister pending timers if (threadData->hasEventDispatcher()) - threadData->eventDispatcher.load()->unregisterTimers(q_ptr); + threadData->eventDispatcher.loadRelaxed()->unregisterTimers(q_ptr); // release the timer ids back to the pool for (int i = 0; i < extraData->runningTimers.size(); ++i) @@ -268,17 +268,17 @@ bool QObjectPrivate::isSender(const QObject *receiver, const char *signal) const { Q_Q(const QObject); int signal_index = signalIndex(signal); - ConnectionData *cd = connections.load(); + ConnectionData *cd = connections.loadRelaxed(); if (signal_index < 0 || !cd) return false; QBasicMutexLocker locker(signalSlotLock(q)); if (signal_index < cd->signalVectorCount()) { - const QObjectPrivate::Connection *c = cd->signalVector.load()->at(signal_index).first.load(); + const QObjectPrivate::Connection *c = cd->signalVector.loadRelaxed()->at(signal_index).first.loadRelaxed(); while (c) { - if (c->receiver.load() == receiver) + if (c->receiver.loadRelaxed() == receiver) return true; - c = c->nextConnectionList.load(); + c = c->nextConnectionList.loadRelaxed(); } } return false; @@ -289,17 +289,17 @@ QObjectList QObjectPrivate::receiverList(const char *signal) const { QObjectList returnValue; int signal_index = signalIndex(signal); - ConnectionData *cd = connections.load(); + ConnectionData *cd = connections.loadRelaxed(); if (signal_index < 0 || !cd) return returnValue; if (signal_index < cd->signalVectorCount()) { - const QObjectPrivate::Connection *c = cd->signalVector.load()->at(signal_index).first.load(); + const QObjectPrivate::Connection *c = cd->signalVector.loadRelaxed()->at(signal_index).first.loadRelaxed(); while (c) { - QObject *r = c->receiver.load(); + QObject *r = c->receiver.loadRelaxed(); if (r) returnValue << r; - c = c->nextConnectionList.load(); + c = c->nextConnectionList.loadRelaxed(); } } return returnValue; @@ -309,7 +309,7 @@ QObjectList QObjectPrivate::receiverList(const char *signal) const QObjectList QObjectPrivate::senderList() const { QObjectList returnValue; - ConnectionData *cd = connections.load(); + ConnectionData *cd = connections.loadRelaxed(); if (cd) { QBasicMutexLocker locker(signalSlotLock(q_func())); for (Connection *c = cd->senders; c; c = c->next) @@ -332,24 +332,24 @@ void QObjectPrivate::addConnection(int signal, Connection *c) { Q_ASSERT(c->sender == q_ptr); ensureConnectionData(); - ConnectionData *cd = connections.load(); + ConnectionData *cd = connections.loadRelaxed(); cd->resizeSignalVector(signal + 1); ConnectionList &connectionList = cd->connectionsForSignal(signal); - if (connectionList.last.load()) { - Q_ASSERT(connectionList.last.load()->receiver.load()); - connectionList.last.load()->nextConnectionList.store(c); + if (connectionList.last.loadRelaxed()) { + Q_ASSERT(connectionList.last.loadRelaxed()->receiver.loadRelaxed()); + connectionList.last.loadRelaxed()->nextConnectionList.storeRelaxed(c); } else { - connectionList.first.store(c); + connectionList.first.storeRelaxed(c); } c->id = ++cd->currentConnectionId; - c->prevConnectionList = connectionList.last.load(); - connectionList.last.store(c); + c->prevConnectionList = connectionList.last.loadRelaxed(); + connectionList.last.storeRelaxed(c); - QObjectPrivate *rd = QObjectPrivate::get(c->receiver.load()); + QObjectPrivate *rd = QObjectPrivate::get(c->receiver.loadRelaxed()); rd->ensureConnectionData(); - c->prev = &(rd->connections.load()->senders); + c->prev = &(rd->connections.loadRelaxed()->senders); c->next = *c->prev; *c->prev = c; if (c->next) @@ -358,17 +358,17 @@ void QObjectPrivate::addConnection(int signal, Connection *c) void QObjectPrivate::ConnectionData::removeConnection(QObjectPrivate::Connection *c) { - Q_ASSERT(c->receiver.load()); - ConnectionList &connections = signalVector.load()->at(c->signal_index); - c->receiver.store(nullptr); - QThreadData *td = c->receiverThreadData.load(); + Q_ASSERT(c->receiver.loadRelaxed()); + ConnectionList &connections = signalVector.loadRelaxed()->at(c->signal_index); + c->receiver.storeRelaxed(nullptr); + QThreadData *td = c->receiverThreadData.loadRelaxed(); if (td) td->deref(); - c->receiverThreadData.store(nullptr); + c->receiverThreadData.storeRelaxed(nullptr); #ifndef QT_NO_DEBUG bool found = false; - for (Connection *cc = connections.first.load(); cc; cc = cc->nextConnectionList.load()) { + for (Connection *cc = connections.first.loadRelaxed(); cc; cc = cc->nextConnectionList.loadRelaxed()) { if (cc == c) { found = true; break; @@ -383,29 +383,29 @@ void QObjectPrivate::ConnectionData::removeConnection(QObjectPrivate::Connection c->next->prev = c->prev; c->prev = nullptr; - if (connections.first.load() == c) - connections.first.store(c->nextConnectionList.load()); - if (connections.last.load() == c) - connections.last.store(c->prevConnectionList); - Q_ASSERT(signalVector.load()->at(c->signal_index).first.load() != c); - Q_ASSERT(signalVector.load()->at(c->signal_index).last.load() != c); + if (connections.first.loadRelaxed() == c) + connections.first.storeRelaxed(c->nextConnectionList.loadRelaxed()); + if (connections.last.loadRelaxed() == c) + connections.last.storeRelaxed(c->prevConnectionList); + Q_ASSERT(signalVector.loadRelaxed()->at(c->signal_index).first.loadRelaxed() != c); + Q_ASSERT(signalVector.loadRelaxed()->at(c->signal_index).last.loadRelaxed() != c); // keep c->nextConnectionList intact, as it might still get accessed by activate - Connection *n = c->nextConnectionList.load(); + Connection *n = c->nextConnectionList.loadRelaxed(); if (n) n->prevConnectionList = c->prevConnectionList; if (c->prevConnectionList) - c->prevConnectionList->nextConnectionList.store(n); + c->prevConnectionList->nextConnectionList.storeRelaxed(n); c->prevConnectionList = nullptr; - Q_ASSERT(c != orphaned.load()); + Q_ASSERT(c != orphaned.loadRelaxed()); // add c to orphanedConnections - c->nextInOrphanList = orphaned.load(); - orphaned.store(c); + c->nextInOrphanList = orphaned.loadRelaxed(); + orphaned.storeRelaxed(c); #ifndef QT_NO_DEBUG found = false; - for (Connection *cc = connections.first.load(); cc; cc = cc->nextConnectionList.load()) { + for (Connection *cc = connections.first.loadRelaxed(); cc; cc = cc->nextConnectionList.loadRelaxed()) { if (cc == c) { found = true; break; @@ -427,8 +427,8 @@ void QObjectPrivate::ConnectionData::cleanOrphanedConnectionsImpl(QObject *sende // Since ref == 1, no activate() is in process since we locked the mutex. That implies, // that nothing can reference the orphaned connection objects anymore and they can // be safely deleted - c = orphaned.load(); - orphaned.store(nullptr); + c = orphaned.loadRelaxed(); + orphaned.storeRelaxed(nullptr); } deleteOrphaned(c); } @@ -443,7 +443,7 @@ void QObjectPrivate::ConnectionData::deleteOrphaned(QObjectPrivate::ConnectionOr } else { QObjectPrivate::Connection *c = static_cast(o); next = c->nextInOrphanList; - Q_ASSERT(!c->receiver.load()); + Q_ASSERT(!c->receiver.loadRelaxed()); Q_ASSERT(!c->prev); c->freeSlotObject(); c->deref(); @@ -463,22 +463,22 @@ bool QObjectPrivate::isSignalConnected(uint signalIndex, bool checkDeclarative) if (checkDeclarative && isDeclarativeSignalConnected(signalIndex)) return true; - ConnectionData *cd = connections.load(); + ConnectionData *cd = connections.loadRelaxed(); if (!cd) return false; - SignalVector *signalVector = cd->signalVector.load(); + SignalVector *signalVector = cd->signalVector.loadRelaxed(); if (!signalVector) return false; - if (signalVector->at(-1).first.load()) + if (signalVector->at(-1).first.loadRelaxed()) return true; if (signalIndex < uint(cd->signalVectorCount())) { - const QObjectPrivate::Connection *c = signalVector->at(signalIndex).first.load(); + const QObjectPrivate::Connection *c = signalVector->at(signalIndex).first.loadRelaxed(); while (c) { - if (c->receiver.load()) + if (c->receiver.loadRelaxed()) return true; - c = c->nextConnectionList.load(); + c = c->nextConnectionList.loadRelaxed(); } } return false; @@ -486,10 +486,10 @@ bool QObjectPrivate::isSignalConnected(uint signalIndex, bool checkDeclarative) bool QObjectPrivate::maybeSignalConnected(uint signalIndex) const { - ConnectionData *cd = connections.load(); + ConnectionData *cd = connections.loadRelaxed(); if (!cd) return false; - SignalVector *signalVector = cd->signalVector.load(); + SignalVector *signalVector = cd->signalVector.loadRelaxed(); if (!signalVector) return false; @@ -944,15 +944,15 @@ QObject::~QObject() d->wasDeleted = true; d->blockSig = 0; // unblock signals so we always emit destroyed() - QtSharedPointer::ExternalRefCountData *sharedRefcount = d->sharedRefcount.load(); + QtSharedPointer::ExternalRefCountData *sharedRefcount = d->sharedRefcount.loadRelaxed(); if (sharedRefcount) { - if (sharedRefcount->strongref.load() > 0) { + if (sharedRefcount->strongref.loadRelaxed() > 0) { qWarning("QObject: shared QObject was deleted directly. The program is malformed and may crash."); // but continue deleting, it's too late to stop anyway } // indicate to all QWeakPointers that this QObject has now been deleted - sharedRefcount->strongref.store(0); + sharedRefcount->strongref.storeRelaxed(0); if (!sharedRefcount->weakref.deref()) delete sharedRefcount; } @@ -971,7 +971,7 @@ QObject::~QObject() } } - QObjectPrivate::ConnectionData *cd = d->connections.load(); + QObjectPrivate::ConnectionData *cd = d->connections.loadRelaxed(); if (cd) { if (cd->currentSender) { cd->currentSender->receiverDeleted(); @@ -986,14 +986,14 @@ QObject::~QObject() for (int signal = -1; signal < receiverCount; ++signal) { QObjectPrivate::ConnectionList &connectionList = cd->connectionsForSignal(signal); - while (QObjectPrivate::Connection *c = connectionList.first.load()) { + while (QObjectPrivate::Connection *c = connectionList.first.loadRelaxed()) { Q_ASSERT(c->receiver); - QBasicMutex *m = signalSlotLock(c->receiver.load()); + QBasicMutex *m = signalSlotLock(c->receiver.loadRelaxed()); bool needToUnlock = QOrderedMutexLocker::relock(signalSlotMutex, m); if (c->receiver) { cd->removeConnection(c); - Q_ASSERT(connectionList.first.load() != c); + Q_ASSERT(connectionList.first.loadRelaxed() != c); } if (needToUnlock) m->unlock(); @@ -1019,7 +1019,7 @@ QObject::~QObject() continue; } - QObjectPrivate::ConnectionData *senderData = sender->d_func()->connections.load(); + QObjectPrivate::ConnectionData *senderData = sender->d_func()->connections.loadRelaxed(); Q_ASSERT(senderData); QtPrivate::QSlotObjectBase *slotObj = nullptr; @@ -1041,11 +1041,11 @@ QObject::~QObject() // invalidate all connections on the object and make sure // activate() will skip them - cd->currentConnectionId.store(0); + cd->currentConnectionId.storeRelaxed(0); } if (cd && !cd->ref.deref()) delete cd; - d->connections.store(nullptr); + d->connections.storeRelaxed(nullptr); if (!d->children.isEmpty()) d->deleteChildren(); @@ -1065,7 +1065,7 @@ QObject::~QObject() QObjectPrivate::Connection::~Connection() { if (ownArgumentTypes) { - const int *v = argumentTypes.load(); + const int *v = argumentTypes.loadRelaxed(); if (v != &DIRECT_CONNECTION_ONLY) delete [] v; } @@ -1274,7 +1274,7 @@ bool QObject::event(QEvent *e) { QAbstractMetaCallEvent *mce = static_cast(e); - if (!d_func()->connections.load()) { + if (!d_func()->connections.loadRelaxed()) { QBasicMutexLocker locker(signalSlotLock(this)); d_func()->ensureConnectionData(); } @@ -1287,7 +1287,7 @@ bool QObject::event(QEvent *e) case QEvent::ThreadChange: { Q_D(QObject); QThreadData *threadData = d->threadData; - QAbstractEventDispatcher *eventDispatcher = threadData->eventDispatcher.load(); + QAbstractEventDispatcher *eventDispatcher = threadData->eventDispatcher.loadRelaxed(); if (eventDispatcher) { QList timers = eventDispatcher->registeredTimers(this); if (!timers.isEmpty()) { @@ -1522,7 +1522,7 @@ void QObject::moveToThread(QThread *targetThread) } else if (d->threadData != currentData) { qWarning("QObject::moveToThread: Current thread (%p) is not the object's thread (%p).\n" "Cannot move to target thread (%p)\n", - currentData->thread.load(), d->threadData->thread.load(), targetData ? targetData->thread.load() : nullptr); + currentData->thread.loadRelaxed(), d->threadData->thread.loadRelaxed(), targetData ? targetData->thread.loadRelaxed() : nullptr); #ifdef Q_OS_MAC qWarning("You might be loading two sets of Qt binaries into the same process. " @@ -1587,11 +1587,11 @@ void QObjectPrivate::setThreadData_helper(QThreadData *currentData, QThreadData } if (eventsMoved > 0 && targetData->hasEventDispatcher()) { targetData->canWait = false; - targetData->eventDispatcher.load()->wakeUp(); + targetData->eventDispatcher.loadRelaxed()->wakeUp(); } // the current emitting thread shouldn't restore currentSender after calling moveToThread() - ConnectionData *cd = connections.load(); + ConnectionData *cd = connections.loadRelaxed(); if (cd) { if (cd->currentSender) { cd->currentSender->receiverDeleted(); @@ -1602,14 +1602,14 @@ void QObjectPrivate::setThreadData_helper(QThreadData *currentData, QThreadData if (cd) { auto *c = cd->senders; while (c) { - QObject *r = c->receiver.load(); + QObject *r = c->receiver.loadRelaxed(); if (r) { Q_ASSERT(r == q); targetData->ref(); - QThreadData *old = c->receiverThreadData.load(); + QThreadData *old = c->receiverThreadData.loadRelaxed(); if (old) old->deref(); - c->receiverThreadData.store(targetData); + c->receiverThreadData.storeRelaxed(targetData); } c = c->next; } @@ -1632,7 +1632,7 @@ void QObjectPrivate::_q_reregisterTimers(void *pointer) { Q_Q(QObject); QList *timerList = reinterpret_cast *>(pointer); - QAbstractEventDispatcher *eventDispatcher = threadData->eventDispatcher.load(); + QAbstractEventDispatcher *eventDispatcher = threadData->eventDispatcher.loadRelaxed(); for (int i = 0; i < timerList->size(); ++i) { const QAbstractEventDispatcher::TimerInfo &ti = timerList->at(i); eventDispatcher->registerTimer(ti.timerId, ti.interval, ti.timerType, q); @@ -1698,7 +1698,7 @@ int QObject::startTimer(int interval, Qt::TimerType timerType) qWarning("QObject::startTimer: Timers cannot be started from another thread"); return 0; } - int timerId = d->threadData->eventDispatcher.load()->registerTimer(interval, timerType, this); + int timerId = d->threadData->eventDispatcher.loadRelaxed()->registerTimer(interval, timerType, this); if (!d->extraData) d->extraData = new QObjectPrivate::ExtraData; d->extraData->runningTimers.append(timerId); @@ -1773,7 +1773,7 @@ void QObject::killTimer(int id) } if (d->threadData->hasEventDispatcher()) - d->threadData->eventDispatcher.load()->unregisterTimer(id); + d->threadData->eventDispatcher.loadRelaxed()->unregisterTimer(id); d->extraData->runningTimers.remove(at); QAbstractEventDispatcherPrivate::releaseTimerId(id); @@ -2442,7 +2442,7 @@ QObject *QObject::sender() const Q_D(const QObject); QBasicMutexLocker locker(signalSlotLock(this)); - QObjectPrivate::ConnectionData *cd = d->connections.load(); + QObjectPrivate::ConnectionData *cd = d->connections.loadRelaxed(); if (!cd || !cd->currentSender) return nullptr; @@ -2484,7 +2484,7 @@ int QObject::senderSignalIndex() const Q_D(const QObject); QBasicMutexLocker locker(signalSlotLock(this)); - QObjectPrivate::ConnectionData *cd = d->connections.load(); + QObjectPrivate::ConnectionData *cd = d->connections.loadRelaxed(); if (!cd || !cd->currentSender) return -1; @@ -2547,13 +2547,13 @@ int QObject::receivers(const char *signal) const signal_index); } - QObjectPrivate::ConnectionData *cd = d->connections.load(); + QObjectPrivate::ConnectionData *cd = d->connections.loadRelaxed(); QBasicMutexLocker locker(signalSlotLock(this)); if (cd && signal_index < cd->signalVectorCount()) { - const QObjectPrivate::Connection *c = cd->signalVector.load()->at(signal_index).first.load(); + const QObjectPrivate::Connection *c = cd->signalVector.loadRelaxed()->at(signal_index).first.loadRelaxed(); while (c) { - receivers += c->receiver.load() ? 1 : 0; - c = c->nextConnectionList.load(); + receivers += c->receiver.loadRelaxed() ? 1 : 0; + c = c->nextConnectionList.loadRelaxed(); } } } @@ -3362,17 +3362,17 @@ QObjectPrivate::Connection *QMetaObjectPrivate::connect(const QObject *sender, QOrderedMutexLocker locker(signalSlotLock(sender), signalSlotLock(receiver)); - QObjectPrivate::ConnectionData *scd = QObjectPrivate::get(s)->connections.load(); + QObjectPrivate::ConnectionData *scd = QObjectPrivate::get(s)->connections.loadRelaxed(); if (type & Qt::UniqueConnection && scd) { if (scd->signalVectorCount() > signal_index) { - const QObjectPrivate::Connection *c2 = scd->signalVector.load()->at(signal_index).first.load(); + const QObjectPrivate::Connection *c2 = scd->signalVector.loadRelaxed()->at(signal_index).first.loadRelaxed(); int method_index_absolute = method_index + method_offset; while (c2) { - if (!c2->isSlotObject && c2->receiver.load() == receiver && c2->method() == method_index_absolute) + if (!c2->isSlotObject && c2->receiver.loadRelaxed() == receiver && c2->method() == method_index_absolute) return nullptr; - c2 = c2->nextConnectionList.load(); + c2 = c2->nextConnectionList.loadRelaxed(); } } type &= Qt::UniqueConnection - 1; @@ -3381,15 +3381,15 @@ QObjectPrivate::Connection *QMetaObjectPrivate::connect(const QObject *sender, QScopedPointer c(new QObjectPrivate::Connection); c->sender = s; c->signal_index = signal_index; - c->receiver.store(r); + c->receiver.storeRelaxed(r); QThreadData *td = r->d_func()->threadData; td->ref(); - c->receiverThreadData.store(td); + c->receiverThreadData.storeRelaxed(td); c->method_relative = method_index; c->method_offset = method_offset; c->connectionType = type; c->isSlotObject = false; - c->argumentTypes.store(types); + c->argumentTypes.storeRelaxed(types); c->callFunction = callFunction; QObjectPrivate::get(s)->addConnection(signal_index, c.data()); @@ -3442,9 +3442,9 @@ bool QMetaObjectPrivate::disconnectHelper(QObjectPrivate::ConnectionData *connec bool success = false; auto &connectionList = connections->connectionsForSignal(signalIndex); - auto *c = connectionList.first.load(); + auto *c = connectionList.first.loadRelaxed(); while (c) { - QObject *r = c->receiver.load(); + QObject *r = c->receiver.loadRelaxed(); if (r && (receiver == nullptr || (r == receiver && (method_index < 0 || (!c->isSlotObject && c->method() == method_index)) && (slot == nullptr || (c->isSlotObject && c->slotObj->compare(slot)))))) { @@ -3455,7 +3455,7 @@ bool QMetaObjectPrivate::disconnectHelper(QObjectPrivate::ConnectionData *connec // need to relock this receiver and sender in the correct order needToUnlock = QOrderedMutexLocker::relock(senderMutex, receiverMutex); } - if (c->receiver.load()) + if (c->receiver.loadRelaxed()) connections->removeConnection(c); if (needToUnlock) @@ -3466,7 +3466,7 @@ bool QMetaObjectPrivate::disconnectHelper(QObjectPrivate::ConnectionData *connec if (disconnectType == DisconnectOne) return success; } - c = c->nextConnectionList.load(); + c = c->nextConnectionList.loadRelaxed(); } return success; } @@ -3488,7 +3488,7 @@ bool QMetaObjectPrivate::disconnect(const QObject *sender, QBasicMutex *senderMutex = signalSlotLock(sender); QBasicMutexLocker locker(senderMutex); - QObjectPrivate::ConnectionData *scd = QObjectPrivate::get(s)->connections.load(); + QObjectPrivate::ConnectionData *scd = QObjectPrivate::get(s)->connections.loadRelaxed(); if (!scd) return false; @@ -3630,7 +3630,7 @@ void QMetaObject::connectSlotsByName(QObject *o) */ static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connection *c, void **argv) { - const int *argumentTypes = c->argumentTypes.load(); + const int *argumentTypes = c->argumentTypes.loadRelaxed(); if (!argumentTypes) { QMetaMethod m = QMetaObjectPrivate::signal(sender->metaObject(), signal); argumentTypes = queuedConnectionTypes(m.parameterTypes()); @@ -3639,7 +3639,7 @@ static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connect if (!c->argumentTypes.testAndSetOrdered(0, argumentTypes)) { if (argumentTypes != &DIRECT_CONNECTION_ONLY) delete [] argumentTypes; - argumentTypes = c->argumentTypes.load(); + argumentTypes = c->argumentTypes.loadRelaxed(); } } if (argumentTypes == &DIRECT_CONNECTION_ONLY) // cannot activate @@ -3662,8 +3662,8 @@ static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connect args[n] = QMetaType::create(types[n], argv[n]); } - QBasicMutexLocker locker(signalSlotLock(c->receiver.load())); - if (!c->receiver.load()) { + QBasicMutexLocker locker(signalSlotLock(c->receiver.loadRelaxed())); + if (!c->receiver.loadRelaxed()) { // the connection has been disconnected before we got the lock locker.unlock(); for (int n = 1; n < nargs; ++n) @@ -3676,7 +3676,7 @@ static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connect QMetaCallEvent *ev = c->isSlotObject ? new QMetaCallEvent(c->slotObj, sender, signal, nargs, types, args) : new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, sender, signal, nargs, types, args); - QCoreApplication::postEvent(c->receiver.load(), ev); + QCoreApplication::postEvent(c->receiver.loadRelaxed(), ev); } template @@ -3717,8 +3717,8 @@ void doActivate(QObject *sender, int signal_index, void **argv) bool senderDeleted = false; { Q_ASSERT(sp->connections); - QObjectPrivate::ConnectionDataPointer connections(sp->connections.load()); - QObjectPrivate::SignalVector *signalVector = connections->signalVector.load(); + QObjectPrivate::ConnectionDataPointer connections(sp->connections.loadRelaxed()); + QObjectPrivate::SignalVector *signalVector = connections->signalVector.loadRelaxed(); const QObjectPrivate::ConnectionList *list; if (signal_index < signalVector->count()) @@ -3727,32 +3727,32 @@ void doActivate(QObject *sender, int signal_index, void **argv) list = &signalVector->at(-1); Qt::HANDLE currentThreadId = QThread::currentThreadId(); - bool inSenderThread = currentThreadId == QObjectPrivate::get(sender)->threadData->threadId.load(); + bool inSenderThread = currentThreadId == QObjectPrivate::get(sender)->threadData->threadId.loadRelaxed(); // We need to check against the highest connection id to ensure that signals added // during the signal emission are not emitted in this emission. - uint highestConnectionId = connections->currentConnectionId.load(); + uint highestConnectionId = connections->currentConnectionId.loadRelaxed(); do { - QObjectPrivate::Connection *c = list->first.load(); + QObjectPrivate::Connection *c = list->first.loadRelaxed(); if (!c) continue; do { - QObject * const receiver = c->receiver.load(); + QObject * const receiver = c->receiver.loadRelaxed(); if (!receiver) continue; - QThreadData *td = c->receiverThreadData.load(); + QThreadData *td = c->receiverThreadData.loadRelaxed(); if (!td) continue; bool receiverInSameThread; if (inSenderThread) { - receiverInSameThread = currentThreadId == td->threadId.load(); + receiverInSameThread = currentThreadId == td->threadId.loadRelaxed(); } else { // need to lock before reading the threadId, because moveToThread() could interfere QMutexLocker lock(signalSlotLock(receiver)); - receiverInSameThread = currentThreadId == td->threadId.load(); + receiverInSameThread = currentThreadId == td->threadId.loadRelaxed(); } @@ -3825,17 +3825,17 @@ void doActivate(QObject *sender, int signal_index, void **argv) if (callbacks_enabled && signal_spy_set->slot_end_callback != nullptr) signal_spy_set->slot_end_callback(receiver, method); } - } while ((c = c->nextConnectionList.load()) != nullptr && c->id <= highestConnectionId); + } while ((c = c->nextConnectionList.loadRelaxed()) != nullptr && c->id <= highestConnectionId); } while (list != &signalVector->at(-1) && //start over for all signals; ((list = &signalVector->at(-1)), true)); - if (connections->currentConnectionId.load() == 0) + if (connections->currentConnectionId.loadRelaxed() == 0) senderDeleted = true; } if (!senderDeleted) - sp->connections.load()->cleanOrphanedConnections(sender); + sp->connections.loadRelaxed()->cleanOrphanedConnections(sender); if (callbacks_enabled && signal_spy_set->signal_end_callback != nullptr) signal_spy_set->signal_end_callback(sender, signal_index); @@ -3849,7 +3849,7 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign { int signal_index = local_signal_index + QMetaObjectPrivate::signalOffset(m); - if (Q_UNLIKELY(qt_signal_spy_callback_set.load())) + if (Q_UNLIKELY(qt_signal_spy_callback_set.loadRelaxed())) doActivate(sender, signal_index, argv); else doActivate(sender, signal_index, argv); @@ -3862,7 +3862,7 @@ void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_i { int signal_index = signalOffset + local_signal_index; - if (Q_UNLIKELY(qt_signal_spy_callback_set.load())) + if (Q_UNLIKELY(qt_signal_spy_callback_set.loadRelaxed())) doActivate(sender, signal_index, argv); else doActivate(sender, signal_index, argv); @@ -4131,11 +4131,11 @@ void QObject::dumpObjectInfo() const // first, look for connections where this object is the sender qDebug(" SIGNALS OUT"); - QObjectPrivate::ConnectionData *cd = d->connections.load(); + QObjectPrivate::ConnectionData *cd = d->connections.loadRelaxed(); if (cd && cd->signalVectorCount()) { - QObjectPrivate::SignalVector *signalVector = cd->signalVector.load(); + QObjectPrivate::SignalVector *signalVector = cd->signalVector.loadRelaxed(); for (int signal_index = 0; signal_index < signalVector->count(); ++signal_index) { - const QObjectPrivate::Connection *c = signalVector->at(signal_index).first.load(); + const QObjectPrivate::Connection *c = signalVector->at(signal_index).first.loadRelaxed(); if (!c) continue; const QMetaMethod signal = QMetaObjectPrivate::signal(metaObject(), signal_index); @@ -4143,23 +4143,23 @@ void QObject::dumpObjectInfo() const // receivers while (c) { - if (!c->receiver.load()) { + if (!c->receiver.loadRelaxed()) { qDebug(" "); - c = c->nextConnectionList.load(); + c = c->nextConnectionList.loadRelaxed(); continue; } if (c->isSlotObject) { qDebug(" "); - c = c->nextConnectionList.load(); + c = c->nextConnectionList.loadRelaxed(); continue; } - const QMetaObject *receiverMetaObject = c->receiver.load()->metaObject(); + const QMetaObject *receiverMetaObject = c->receiver.loadRelaxed()->metaObject(); const QMetaMethod method = receiverMetaObject->method(c->method()); qDebug(" --> %s::%s %s", receiverMetaObject->className(), - c->receiver.load()->objectName().isEmpty() ? "unnamed" : qPrintable(c->receiver.load()->objectName()), + c->receiver.loadRelaxed()->objectName().isEmpty() ? "unnamed" : qPrintable(c->receiver.loadRelaxed()->objectName()), method.methodSignature().constData()); - c = c->nextConnectionList.load(); + c = c->nextConnectionList.loadRelaxed(); } } } else { @@ -4910,17 +4910,17 @@ QMetaObject::Connection QObjectPrivate::connectImpl(const QObject *sender, int s QOrderedMutexLocker locker(signalSlotLock(sender), signalSlotLock(receiver)); - if (type & Qt::UniqueConnection && slot && QObjectPrivate::get(s)->connections.load()) { - QObjectPrivate::ConnectionData *connections = QObjectPrivate::get(s)->connections.load(); + if (type & Qt::UniqueConnection && slot && QObjectPrivate::get(s)->connections.loadRelaxed()) { + QObjectPrivate::ConnectionData *connections = QObjectPrivate::get(s)->connections.loadRelaxed(); if (connections->signalVectorCount() > signal_index) { - const QObjectPrivate::Connection *c2 = connections->signalVector.load()->at(signal_index).first.load(); + const QObjectPrivate::Connection *c2 = connections->signalVector.loadRelaxed()->at(signal_index).first.loadRelaxed(); while (c2) { - if (c2->receiver.load() == receiver && c2->isSlotObject && c2->slotObj->compare(slot)) { + if (c2->receiver.loadRelaxed() == receiver && c2->isSlotObject && c2->slotObj->compare(slot)) { slotObj->destroyIfLastRef(); return QMetaObject::Connection(); } - c2 = c2->nextConnectionList.load(); + c2 = c2->nextConnectionList.loadRelaxed(); } } type = static_cast(type ^ Qt::UniqueConnection); @@ -4931,13 +4931,13 @@ QMetaObject::Connection QObjectPrivate::connectImpl(const QObject *sender, int s c->signal_index = signal_index; QThreadData *td = r->d_func()->threadData; td->ref(); - c->receiverThreadData.store(td); - c->receiver.store(r); + c->receiverThreadData.storeRelaxed(td); + c->receiver.storeRelaxed(r); c->slotObj = slotObj; c->connectionType = type; c->isSlotObject = true; if (types) { - c->argumentTypes.store(types); + c->argumentTypes.storeRelaxed(types); c->ownArgumentTypes = false; } @@ -4966,7 +4966,7 @@ bool QObject::disconnect(const QMetaObject::Connection &connection) if (!c) return false; - QObject *receiver = c->receiver.load(); + QObject *receiver = c->receiver.loadRelaxed(); if (!receiver) return false; @@ -4978,11 +4978,11 @@ bool QObject::disconnect(const QMetaObject::Connection &connection) QOrderedMutexLocker locker(senderMutex, receiverMutex); // load receiver once again and recheck to ensure nobody else has removed the connection in the meantime - receiver = c->receiver.load(); + receiver = c->receiver.loadRelaxed(); if (!receiver) return false; - connections = QObjectPrivate::get(c->sender)->connections.load(); + connections = QObjectPrivate::get(c->sender)->connections.loadRelaxed(); Q_ASSERT(connections); connections->removeConnection(c); } @@ -5174,7 +5174,7 @@ bool QMetaObject::Connection::isConnected_helper() const Q_ASSERT(d_ptr); // we're only called from operator RestrictedBool() const QObjectPrivate::Connection *c = static_cast(d_ptr); - return c->receiver.load(); + return c->receiver.loadRelaxed(); } diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h index e6e57b29b9..1953aea21e 100644 --- a/src/corelib/kernel/qobject_p.h +++ b/src/corelib/kernel/qobject_p.h @@ -184,7 +184,7 @@ public: } void deref() { if (!ref_.deref()) { - Q_ASSERT(!receiver.load()); + Q_ASSERT(!receiver.loadRelaxed()); Q_ASSERT(!isSlotObject); delete this; } @@ -202,7 +202,7 @@ public: : receiver(receiver), sender(sender), signal(signal) { if (receiver) { - ConnectionData *cd = receiver->d_func()->connections.load(); + ConnectionData *cd = receiver->d_func()->connections.loadRelaxed(); previous = cd->currentSender; cd->currentSender = this; } @@ -210,7 +210,7 @@ public: ~Sender() { if (receiver) - receiver->d_func()->connections.load()->currentSender = previous; + receiver->d_func()->connections.loadRelaxed()->currentSender = previous; } void receiverDeleted() { @@ -268,8 +268,8 @@ public: ~ConnectionData() { - deleteOrphaned(orphaned.load()); - SignalVector *v = signalVector.load(); + deleteOrphaned(orphaned.loadRelaxed()); + SignalVector *v = signalVector.loadRelaxed(); if (v) free(v); } @@ -279,18 +279,18 @@ public: void removeConnection(Connection *c); void cleanOrphanedConnections(QObject *sender) { - if (orphaned.load() && ref == 1) + if (orphaned.loadRelaxed() && ref == 1) cleanOrphanedConnectionsImpl(sender); } void cleanOrphanedConnectionsImpl(QObject *sender); ConnectionList &connectionsForSignal(int signal) { - return signalVector.load()->at(signal); + return signalVector.loadRelaxed()->at(signal); } void resizeSignalVector(uint size) { - SignalVector *vector = this->signalVector.load(); + SignalVector *vector = this->signalVector.loadRelaxed(); if (vector && vector->allocated > size) return; size = (size + 7) & ~7; @@ -305,14 +305,14 @@ public: newVector->next = nullptr; newVector->allocated = size; - signalVector.store(newVector); + signalVector.storeRelaxed(newVector); if (vector) { - vector->nextInOrphanList = orphaned.load(); - orphaned.store(ConnectionOrSignalVector::fromSignalVector(vector)); + vector->nextInOrphanList = orphaned.loadRelaxed(); + orphaned.storeRelaxed(ConnectionOrSignalVector::fromSignalVector(vector)); } } int signalVectorCount() const { - return signalVector ? signalVector.load()->count() : -1; + return signalVector ? signalVector.loadRelaxed()->count() : -1; } static void deleteOrphaned(ConnectionOrSignalVector *c); @@ -366,11 +366,11 @@ public: void ensureConnectionData() { - if (connections.load()) + if (connections.loadRelaxed()) return; ConnectionData *cd = new ConnectionData; cd->ref.ref(); - connections.store(cd); + connections.storeRelaxed(cd); } public: ExtraData *extraData; // extra data set by the user diff --git a/src/corelib/kernel/qsocketnotifier.cpp b/src/corelib/kernel/qsocketnotifier.cpp index 6ff8268978..2a246b1204 100644 --- a/src/corelib/kernel/qsocketnotifier.cpp +++ b/src/corelib/kernel/qsocketnotifier.cpp @@ -152,7 +152,7 @@ QSocketNotifier::QSocketNotifier(qintptr socket, Type type, QObject *parent) else if (!d->threadData->hasEventDispatcher()) qWarning("QSocketNotifier: Can only be used with threads started with QThread"); else - d->threadData->eventDispatcher.load()->registerSocketNotifier(this); + d->threadData->eventDispatcher.loadRelaxed()->registerSocketNotifier(this); } /*! @@ -241,9 +241,9 @@ void QSocketNotifier::setEnabled(bool enable) return; } if (d->snenabled) - d->threadData->eventDispatcher.load()->registerSocketNotifier(this); + d->threadData->eventDispatcher.loadRelaxed()->registerSocketNotifier(this); else - d->threadData->eventDispatcher.load()->unregisterSocketNotifier(this); + d->threadData->eventDispatcher.loadRelaxed()->unregisterSocketNotifier(this); } diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index b9563b8395..511dc3c81c 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -2366,7 +2366,7 @@ QVariant& QVariant::operator=(const QVariant &variant) void QVariant::detach() { - if (!d.is_shared || d.data.shared->ref.load() == 1) + if (!d.is_shared || d.data.shared->ref.loadRelaxed() == 1) return; Private dd; diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h index e094ebff52..c8cb551863 100644 --- a/src/corelib/kernel/qvariant.h +++ b/src/corelib/kernel/qvariant.h @@ -577,7 +577,7 @@ Q_CORE_EXPORT QDataStream& operator<< (QDataStream& s, const QVariant::Type p); #endif inline bool QVariant::isDetached() const -{ return !d.is_shared || d.data.shared->ref.load() == 1; } +{ return !d.is_shared || d.data.shared->ref.loadRelaxed() == 1; } #ifdef Q_QDOC diff --git a/src/corelib/kernel/qwineventnotifier.cpp b/src/corelib/kernel/qwineventnotifier.cpp index 3c73c0b851..d2ae9668fe 100644 --- a/src/corelib/kernel/qwineventnotifier.cpp +++ b/src/corelib/kernel/qwineventnotifier.cpp @@ -124,7 +124,7 @@ QWinEventNotifier::QWinEventNotifier(HANDLE hEvent, QObject *parent) : QObject(*new QWinEventNotifierPrivate(hEvent, false), parent) { Q_D(QWinEventNotifier); - QAbstractEventDispatcher *eventDispatcher = d->threadData->eventDispatcher.load(); + QAbstractEventDispatcher *eventDispatcher = d->threadData->eventDispatcher.loadRelaxed(); if (Q_UNLIKELY(!eventDispatcher)) { qWarning("QWinEventNotifier: Can only be used with threads started with QThread"); return; @@ -197,7 +197,7 @@ void QWinEventNotifier::setEnabled(bool enable) return; d->enabled = enable; - QAbstractEventDispatcher *eventDispatcher = d->threadData->eventDispatcher.load(); + QAbstractEventDispatcher *eventDispatcher = d->threadData->eventDispatcher.loadRelaxed(); if (!eventDispatcher) { // perhaps application is shutting down if (!enable && d->waitHandle != nullptr) d->unregisterWaitObject(); @@ -256,7 +256,7 @@ void QWinEventNotifierPrivate::unregisterWaitObject() static void CALLBACK wfsoCallback(void *context, BOOLEAN /*ignore*/) { QWinEventNotifierPrivate *nd = reinterpret_cast(context); - QAbstractEventDispatcher *eventDispatcher = nd->threadData->eventDispatcher.load(); + QAbstractEventDispatcher *eventDispatcher = nd->threadData->eventDispatcher.loadRelaxed(); // Happens when Q(Core)Application is destroyed before QWinEventNotifier. // https://bugreports.qt.io/browse/QTBUG-70214 -- cgit v1.2.3