diff options
-rw-r--r-- | src/corelib/kernel/qapplicationstatic.h | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/src/corelib/kernel/qapplicationstatic.h b/src/corelib/kernel/qapplicationstatic.h index 2f2cab9174..1eadeb20e2 100644 --- a/src/corelib/kernel/qapplicationstatic.h +++ b/src/corelib/kernel/qapplicationstatic.h @@ -30,7 +30,8 @@ template <typename QAS> struct ApplicationHolder Q_DISABLE_COPY_MOVE(ApplicationHolder) ~ApplicationHolder() { - if (guard.loadRelaxed() == QtGlobalStatic::Initialized) { + if (guard.loadAcquire() == QtGlobalStatic::Initialized) { + // No mutex! Up to external code to ensure no race happens. guard.storeRelease(QtGlobalStatic::Destroyed); realPointer()->~PlainType(); } @@ -44,24 +45,23 @@ template <typename QAS> struct ApplicationHolder // called from QGlobalStatic::instance() PlainType *pointer() noexcept(MutexLockIsNoexcept && ConstructionIsNoexcept) { - if (guard.loadRelaxed() == QtGlobalStatic::Initialized) + if (guard.loadAcquire() == QtGlobalStatic::Initialized) return realPointer(); QMutexLocker locker(&mutex); if (guard.loadRelaxed() == QtGlobalStatic::Uninitialized) { QAS::innerFunction(&storage); QObject::connect(QCoreApplication::instance(), &QObject::destroyed, reset); - guard.storeRelaxed(QtGlobalStatic::Initialized); + guard.storeRelease(QtGlobalStatic::Initialized); } return realPointer(); } static void reset() { - if (guard.loadRelaxed() == QtGlobalStatic::Initialized) { - QMutexLocker locker(&mutex); - realPointer()->~PlainType(); - guard.storeRelaxed(QtGlobalStatic::Uninitialized); - } + // we only synchronize using the mutex here, not the guard + QMutexLocker locker(&mutex); + realPointer()->~PlainType(); + guard.storeRelaxed(QtGlobalStatic::Uninitialized); } }; } // namespace QtGlobalStatic |